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