簡單來講,對軟體進行分析并搞清楚其行為的工作就叫做“逆向工程”。逆向是指對軟體進行分析,其對象不僅限與惡意軟體,是以也不一定和計算機安全相關,譬如: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等多種分析方法對軟體進行逆向分析。