Like Share Discussion Bookmark Smile

J.J. Huang   2019-09-08   x64dbg   瀏覽次數:

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

  • DialogBoxParamA函數

    • 類型:DLGPROC,指向對話框過程的指針。

      註:簡單說明,DLGPROC傳入的位址,就是一般工程師寫的程式函數過程,讓Windws來調用這個函數過程。

  • CreateToolhelp32Snapshot函數

    • 拍攝指定進程以及這些進程使用的堆,模組和線程的快照。
  • Process32Next函數

    • 檢索有關係統快照中記錄的下一個進程的訊息。
  • ExitProcess函數

    • 結束調用過程及其所有線程。

搜尋思路

  • 一步一步觀察,找尋反調試的代碼

實際分析

  • 開啟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
    49
    004011CB | 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
    12
    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] | 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
2
3
4
5
6
7
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> |
  • 最後就ExitProcess關閉了程式

分析總結

  • 通過以上的分析,程式針對關鍵的程序進行查找,如發現有調試工具存在,就直接關閉程式。

總結

這只是一個反調試的範例,讓大家體驗一下,還有更多的反調試方法,建議還是看看反調試技術總結.pdf多做了解。


註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏OllyDbg 使用笔记 (十九)
看雪安全論壇[原创]反调试技术总结