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