簡單來講,對軟件進行分析並搞清楚其行爲的工作就叫做“逆向工程”。逆向是指對軟件進行分析,其對象不僅限與惡意軟件,因此也不一定和計算機安全相關,譬如:license的繞過、遊戲金手指等。都屬於通過逆向分析繞過或篡改內部數據達到所需目標。
逆向工程可分爲靜態分析與動態分析。靜態分析是:在不允許目標程序的情況下進行分析。動態分析:在運行目標程序的情況下進行分析。靜態分析可用於瞭解全局信息,動態分析可用於瞭解局部信息,動靜結合效果倍增!
靜態分析常用工具包括:winhex(二進制編輯器)、IDA Freeware版(反彙編工具)等。 動態分析常用工具包括:Process Monitor(系統進程監視器)、OllyDbg(動態追蹤工具)、Wireshark(數據包分析軟件)等。 形形色色各種工具都有,再次不一一介紹。
工欲善其事必先利其器,在具有“趁手武器”後,我們需要對彙編指令有所瞭解(瞭解常用關鍵指令即可),便於通過工具展示出的內容進行分析。沒必要一行行仔細閱讀,重要的部分花時間仔細理解,其餘部分了解大概即可。
指令 | 示例 | 含義 | 說明 |
MOV | MOV EAX,ECX | EAX=ECX | 將ECX的值存入EAX |
ADD | ADD EAX,ECX | EAX+=ECX | 將EAX的值加上ECX的值 |
SUB | SUB EAX,ECX | EAX-=ECX | 將EAX的值減去ECX的值 |
INC | INC EAX | EAX++ | 將EAX的值加1 |
DEC | DEC EAX | EAX-- | 將EAX的值減1 |
LEA | LEA EAX,[ECX+4] | EAX=ECX+4 | 將EAC值加4存入EAX |
CMP | CMP EAX,ECX |
IF(EAX==ECX) ZF=1 ELSE ZF=0 |
對兩值進行比較並根據結果設置標誌 若EAX與ECX值相同,ZF=1 |
TEST | TEST EAX,ECX |
F(EAX==0) ZF=1 ELSE ZF=0 |
將值與0進行比較並根據結果設置ZF值 |
JE(JZ) | JE 04001000 | if(ZF==1) GOTO 04001000 |
若ZF=1,則跳轉到04001000 |
JNE(JNZ) | JNE 04001000 | if(ZF==0) GOTO 04001000 |
若ZF=0,則跳轉到04001000 |
JMP | JMP 04001000 | GOTO 04001000 | 無條件跳轉到04001000 |
CALL | CALL lstrcmpW | 調用lstrcmpW | |
PUSH | PUSH 00000001 | 壓棧 | |
POP | POP EAX | 出棧並將獲取的值存入EAX寄存器 |
示例分析
我寫了一段非常簡單C++代碼,根據判斷2019彈出不同對話框。
下面我們就來通過動靜態來分析該EXE程序!
1.靜態分析
首先可通過IDA進行全局查看,通過對源代碼反彙編,可大概瞭解程序的邏輯代碼。下圖關鍵方法包括:lstrcmp、GetActiveWindow、MessageBox,通過三個方法我相信你已經基本明白代碼邏輯規則是什麼了?。
2.動態分析
通過靜態對代碼有全局瞭解後,可通過動態分析進行局部深入瞭解,下圖是通過OllyDbg進行深入瞭解,call調用了lstrcmp方法,jnz進行判斷,如果不包含指定匹配字符串將跳轉到01141787位置,即hello word的代碼段中。
我通過在lstrcmp位置設置斷點,執行至jnz時跳轉至01141787位置,繼續執行至011417A5時(彈出框)棧的內容如上圖右下角。
由此我們完成了對該exe程序的簡單動靜分析。後期我們將結合Process Monitor、Wireshark等多種分析方法對軟件進行逆向分析。