x64dbg - 第三十四章 | 反匯編練習(二十三)
目標程式
檔案下載:Debugger Detected.exe
解壓密碼:morosedog
程式簡介
- 程式會檢測是否有調試器程序
分析程式
- 執行
Debugger Detected.exe
- 點擊
Verify
- 彈出
Debugger NOT detected !!
(未檢測到調試器!)
- 執行
OLLYDBG.EXE
- 執行
Debugger Detected.exe
- 完全沒反應
註:
Ollydbg
需下載官方英文版OllyDbg 1.10
檢驗顯示是使用MASM32 / TASM32
編寫。
前置作業
- 因為我有使用ScyllaHide開源用戶模式的Anti-Anti-Debug插件。
- 所以請下載純淨版的x64dbg
註:主要是用於使用原本的
x64dbg
調試反調試的程式的一個狀態;如無安裝ScyllaHide
則可忽略前置作業。
額外補充
- 一般常見的反調試的技術,可以參考下面的
PDF
來了解
檔案下載:反調試技術總結.pdf
解壓密碼:morosedog
-
- 類型:DLGPROC,指向對話框過程的指針。
註:簡單說明,DLGPROC傳入的位址,就是一般工程師寫的程式函數過程,讓
Windws
來調用這個函數過程。
- 類型:DLGPROC,指向對話框過程的指針。
-
- 拍攝指定進程以及這些進程使用的堆,模組和線程的快照。
-
- 檢索有關係統快照中記錄的下一個進程的訊息。
-
- 結束調用過程及其所有線程。
搜尋思路
- 一步一步觀察,找尋反調試的代碼
實際分析
- 開啟
OLLYDBG.EXE
- 開啟純淨版的
x64dbg
- 執行
Debugger Detected.exe
F9
執行程式F8
一步一步過- 當執行到
00401080 | E8 C9030000 | call <JMP.&DialogBoxParamA> |
- 直接終止,除錯停止!
DialogBoxParamA
根據參數0040106E | 68 8C104000 | push debugger detected.40108C |
傳入的為0040108C
0040108C
設定中斷點Ctrl + F2
重新啟動(S)F9
執行程式斷點在
004010FB | E8 D7010000 | call <JMP.&IsDebuggerPresent> |
F8
一步一步過當執行到
76C462FA | 64:8025 CA0F0000 FE | and byte ptr fs:[FCA],FE |
注意標題,領空變成
user32.dll
Alt + F9
執行到使用者代碼(U)回到
0040108C | 55 | push ebp |
- 此時表示從新調用一次,並非程式錯亂
F8
一步一步過當執行到
0040109E | E8 28010000 | call debugger detected.4011CB |
再往下就會關閉程序
Ctrl + F2
重新啟動(S)移除所有中斷點
004011CB
設定中斷點F9
執行程式斷點在
004011CB | 55 | push ebp |
向下觀察
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49004011CB | 55 | push ebp |
004011CC | 8BEC | mov ebp,esp |
004011CE | 81C4 D4FEFFFF | add esp,FFFFFED4 |
004011D4 | 53 | push ebx |
004011D5 | 56 | push esi |
004011D6 | 57 | push edi |
004011D7 | 6A 00 | push 0 |
004011D9 | 6A 0F | push F |
004011DB | E8 3E020000 | call <JMP.&CreateToolhelp32Snapshot> |
004011E0 | 8945 FC | mov dword ptr ss:[ebp-4],eax |
004011E3 | 8DB5 D4FEFFFF | lea esi,dword ptr ss:[ebp-12C] |
004011E9 | 8D3D 4C304000 | lea edi,dword ptr ds:[40304C] | 0040304C:"OLLYDBG.EXE"
004011EF | 56 | push esi |
004011F0 | FF75 FC | push dword ptr ss:[ebp-4] |
004011F3 | E8 38020000 | call <JMP.&Process32First> |
004011F8 | 85C0 | test eax,eax |
004011FA | 74 2B | je debugger detected.401227 |
004011FC | 8D46 24 | lea eax,dword ptr ds:[esi+24] |
004011FF | 50 | push eax |
00401200 | 57 | push edi |
00401201 | E8 3C020000 | call <JMP.&lstrcmpi> |
00401206 | 85C0 | test eax,eax |
00401208 | 74 2A | je debugger detected.401234 |
0040120A | 56 | push esi |
0040120B | FF75 FC | push dword ptr ss:[ebp-4] |
0040120E | E8 23020000 | call <JMP.&Process32Next> |
00401213 | 85C0 | test eax,eax |
00401215 | 74 10 | je debugger detected.401227 |
00401217 | 8D46 24 | lea eax,dword ptr ds:[esi+24] |
0040121A | 50 | push eax |
0040121B | 57 | push edi |
0040121C | E8 21020000 | call <JMP.&lstrcmpi> |
00401221 | 85C0 | test eax,eax |
00401223 | 74 0F | je debugger detected.401234 |
00401225 | EB E3 | jmp debugger detected.40120A |
00401227 | FF75 FC | push dword ptr ss:[ebp-4] |
0040122A | E8 E9010000 | call <JMP.&CloseHandle> |
0040122F | 5F | pop edi |
00401230 | 5E | pop esi |
00401231 | 5B | pop ebx |
00401232 | C9 | leave |
00401233 | C3 | ret |
00401234 | 6A 10 | push 10 |
00401236 | 68 11304000 | push debugger detected.403011 | 403011:"Debugger Detected tutorial "
0040123B | 68 58304000 | push debugger detected.403058 | 403058:"Your debugger is detected !!!"
00401240 | FF75 08 | push dword ptr ss:[ebp+8] |
00401243 | E8 24020000 | call <JMP.&MessageBoxA> |
00401248 | 50 | push eax |
00401249 | E8 D6010000 | call <JMP.&ExitProcess> |F8
一步一步過會發現
004011E9 | 8D3D 4C304000 | lea edi,dword ptr ds:[40304C] | 0040304C:"OLLYDBG.EXE"
OLLYDBG.EXE
為要被掃瞄的程序名
0040120E | E8 23020000 | call <JMP.&Process32Next> |
會一直抓取下一個程序的資訊F8
一步一步過觀察下面這段迴圈,會發現抓取程序然後比對名稱是否相同
1
2
3
4
5
6
7
8
9
10
11
120040120A | 56 | push esi |
0040120B | FF75 FC | push dword ptr ss:[ebp-4] |
0040120E | E8 23020000 | call <JMP.&Process32Next> |
00401213 | 85C0 | test eax,eax |
00401215 | 74 10 | je debugger detected.401227 |
00401217 | 8D46 24 | lea eax,dword ptr ds:[esi+24] | esi+24:"smss.exe"
0040121A | 50 | push eax |
0040121B | 57 | push edi | edi:"OLLYDBG.EXE"
0040121C | E8 21020000 | call <JMP.&lstrcmpi> |
00401221 | 85C0 | test eax,eax |
00401223 | 74 0F | je debugger detected.401234 |
00401225 | EB E3 | jmp debugger detected.40120A |如果發現相同,將會跳轉到
00401234
1 | 00401234 | 6A 10 | push 10 | |
- 最後就
ExitProcess
關閉了程式
分析總結
- 通過以上的分析,程式針對關鍵的程序進行查找,如發現有調試工具存在,就直接關閉程式。
總結
這只是一個反調試的範例,讓大家體驗一下,還有更多的反調試方法,建議還是看看反調試技術總結.pdf
多做了解。
註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (十九)
看雪安全論壇 的 [原创]反调试技术总结