逆向分析技術(shù)全揭秘 資深黑客分析
文章主要描述的是黑客老鳥講逆向分析以及對逆向分析技術(shù)的全揭秘,講到逆向,更多的人都是考慮到既然是逆向那就應該反著來推或者相反,其實則不然,這里我們要講的是為了更深入的研究windows編寫機制,更好的研究他們的安全,誰讓微軟這么保守雖然曾經(jīng)流出過windows的部分代碼.....
經(jīng)過前幾課的學習,我們現(xiàn)在開始正式開講逆向分析。逆向分析技術(shù)是指通過分析反匯編代碼來理解其代碼功能,如各接口的數(shù)據(jù)結(jié)構(gòu)等,然后用高級語言重新描述這段代碼,逆向推出原軟件的思路。下面從函數(shù)的調(diào)用、循環(huán)、控制語句等方面分析。
在高級語言中,子程序依懶于堆棧來傳遞參數(shù)。
例如test1(Par1,Par2,Par3:integer),按C,Psacal和StdCall的調(diào)用約定匯編代碼如下:
函數(shù)調(diào)用
按StdCall約定調(diào)用函數(shù)test2(par1,par2),其堆棧建立情況如下:
Push ebp ;保護現(xiàn)場原先的EBP指針
Mov ebp,esp ;設(shè)置新的EBP指針,指向棧頂
Sub esp,xxx ;堆棧中留出點空間放局部變量
… …
Add esp,xxx ;釋放局部變量占用的堆棧
Pop ebp ;恢復現(xiàn)場的ebp指針
Ret 8 ;返回
循環(huán)
如果確定某段代碼是循環(huán),就可以分析其計數(shù)器,一般是用ecx寄存器做計數(shù)器。
下面的匯編代碼:
xor ecx,ecx;ecx清零
:00440000
inc ecx;計數(shù)
… …
cmp ecx,05;循環(huán)4次
jbe 00440000;重復
上面的匯編代碼用C語言描述有以下3種形式:
◆While(i<5){… …}
◆For(i=0;i<5;i++){… …}
◆i=0
Repeat
i++;
…
Unitl(i>=5)
控制語句
If …else語句:
Cmp byte prt[00221450],bl
Jne 00221590
Case語句:
匯編代碼高級語句
Mov eax,edi ;
Sub eax,00000002 ;
Je 00401 ;
Sub eax,0000000E ;
Jne 0040114E
…Swith(K)
{
case’0x2’:…;break;
case’0x10’:…;break;
…
Default: …
}#p#
靜態(tài)分析
靜態(tài)分析:從反匯編出來的程序清單上分析程序流程,了解模塊完成的功能。
靜態(tài)分析先分析程序的文件類型,如果程序使用加殼保護,則要先進行脫殼。
通過靜態(tài)分析工具加載程序進行分析。(例如IDA pro工具)
動態(tài)分析逆向分析技術(shù):動態(tài)跟蹤調(diào)試程序,分為用戶模式和內(nèi)核模式兩種類型。
用戶模式調(diào)試器是指用來調(diào)試用戶模式的應用程序,工作在Ring 3級。(例如VC++編譯器調(diào)試器)
內(nèi)容模式調(diào)試器是指能調(diào)試系統(tǒng)內(nèi)核的調(diào)試器,工作在Ring 0級。(例如SoftICE、OllDBG)
OD動態(tài)分析
調(diào)試中常用的快捷鍵:
F2:設(shè)置斷點,只要在光標定位的位置(上圖中灰色條)按F2鍵即可,再按一次F2鍵則會刪除斷點。
F8:單步步過。每按一次這個鍵執(zhí)行一條反匯編窗口中的一條指令,遇到 CALL 等子程序不進入其代碼。
F7:單步步入。功能同單步步過(F8)類似,區(qū)別是遇到 CALL 等子程序時會進入其中,進入后首先會停留在子程序的第一條指令上。
F4:運行到選定位置。作用就是直接運行到光標所在位置處暫停。
F9:運行。按下這個鍵如果沒有設(shè)置相應斷點的話,被調(diào)試的程序?qū)⒅苯娱_始運行。
CTR+F9:執(zhí)行到返回。此命令在執(zhí)行到一個 ret (返回指令)指令時暫停,常用于從系統(tǒng)領(lǐng)空返回到我們調(diào)試的程序領(lǐng)空。
ALT+F9:執(zhí)行到用戶代碼。可用于從系統(tǒng)領(lǐng)空快速返回到我們調(diào)試的程序領(lǐng)空。
結(jié)構(gòu)化異常處理
結(jié)構(gòu)化異常處理(Structured Exception Handling ,簡稱SEH)是Windows操作系統(tǒng)處理程序錯誤或異常的技術(shù)。
兩種類型的異常處理句柄:
一種是final型的,這是在異常未能得到線程相關(guān)處理例程處理操作系統(tǒng)在即將關(guān)閉程序之前會回調(diào)的例程,這個例程是進程相關(guān)而不是線程相關(guān)的,因此無論是哪個線程發(fā)生異常未能被處理都會調(diào)用這個例程.
另一種是per_Thread Exception Handler->線程相關(guān)的異常處理,通常每個線程初始化準備好運行時fs指向一個TIB結(jié)構(gòu) (THREAD INFORMATION BLOCK),這個結(jié)構(gòu)的第一個元素fs:[0]指向一個_EXCEPTION_REGISTRATION結(jié)構(gòu) 。
當Windows檢測到異常時,執(zhí)行線程立即被中斷 ,處理從用戶模式轉(zhuǎn)向了內(nèi)核模式,控制權(quán)交給了異常調(diào)試程序,它負責查找處理新異常的方法。
反調(diào)試逆向分析技術(shù)
檢測內(nèi)核模式調(diào)試器
利用NT的ZwQuerySystemInformation()或NtQuerySystemInformation()檢測內(nèi)核模式調(diào)試器。
檢測用戶模式調(diào)試器
利用NT的ZwQueryInformationProcess()或NtQueryInformationProcess()檢測使用Win32 Debug API的用戶模式調(diào)試器。
檢測API斷點
對于比較關(guān)鍵的API,可以檢測其是否被設(shè)置了斷點,即檢查該API的入口的第一個字節(jié)是否為Int 3指令。
花指令
花指令是一堆匯編指令組成,對于程序來說,是一堆廢話,加不加花指令都不影響程序的正常運行.編寫的花指令要終始保持堆棧的平衡?;ㄖ噶畹淖饔檬歉蓴_反匯編。
花指令的指令含意:
push ebp ----把基址指針寄存器壓入堆棧
pop ebp ----把基址指針寄存器彈出堆棧
push eax ----把數(shù)據(jù)寄存器壓入堆棧
pop eax ----把數(shù)據(jù)寄存器彈出堆棧
nop -----不執(zhí)行
mov edi,edi-----和nop效果一樣
add esp,1-----指針寄存器加1
sub esp,1-----指針寄存器減1
inc ecx -----計數(shù)器加1
dec ecx -----計數(shù)器減1
子明最近一直在研究有關(guān)逆向分析技術(shù)。上面的就是我的一點研究,不知道大家是否還能夠滿意。我以后還會為大家服務,寫出更加通俗易懂的文章來。