這個練習主要是為了擷取對抗反彙編的基礎。直接拖入IDA,首先檢視到有一些不一樣的地方,這裡用0x400000 | 0x148c得到0x40148c并把它覆寫了main函數的傳回位址,也就是說main函數結束後會跳轉到0x40148c執行。

如果看不明白,來看看這張圖,由于棧幀的建立,ebp會指向棧底位置,也就是指向ebp舊有值的位置。ebp+4也就變成了main函數傳回位址了。
該程式功能并沒有什麼值得關注的地方,是一個程序, 線程, 子產品枚舉工具。主要是其中利用了SEH的技巧并且内部的對抗反彙編反彙編技巧。是以直接跳轉到0x40148c處。
還原後發現:
繼續往下看
這裡用了一個技巧: 注意這裡把資料轉成了代碼。那一句
jmp short near ptr loc_4014d7 + 1
占用了2個位元組, 分别是EB FF。而這兩個位元組占用的位置是0x4014d7和0x4014d8。但是這句jmp跳轉到的位置正好是0x4014d8。這豈不是很有趣,也就是說跳轉到了自己的後半部分。
很顯然,機器碼的翻譯是按照順序來的,是以這條jmp語句一定會執行,那當它跳轉到了0x4014d8後又會發生什麼。這裡做的事情實際上毫無意義,把eax自增自減後相當于啥也沒做,接着就跳轉到了0x4014e0處執行了
是以可以直接把這三句代碼轉成資料。這樣就不會被執行了。現在我們來關注這個函數本身。首先它做了2此摘鍊操作。如果不了解去學習SEH相關知識
可以畫一下示意圖,表明發生了什麼:
這裡jz和jnz連用相當于jmp。跳轉到了0x401520處。
把這個E8提出來後的實際效果:
其作用是會從伺服器上下載下傳一個可執行檔案執行。
(完)