動的解析をやってみよう

OllyDbg
OllyDbg v1.10
参考書籍 : たのしいバイナリの歩き方


・Process Monitorでwsample01b.exeの動作を見る
f:id:kamishiroHW:20200507130832g:plain
ログを読むと、exeがスタートアップにアクセスしていることがわかる
より詳細に調べるため、OllyDbgを使う


・OllyDbgでより詳細な動作を見極める
アドレス00401000にジャンプ
f:id:kamishiroHW:20200507131943p:plain

00401000  /$ 55             PUSH EBP
00401001  |. 8BEC           MOV EBP,ESP
00401003  |. B8 04200000    MOV EAX,2004
00401008  |. E8 D3080000    CALL wsample0.004018E0
0040100D  |. A1 00304000    MOV EAX,DWORD PTR DS:[403000]
00401012  |. 33C5           XOR EAX,EBP
00401014  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
00401017  |. 68 00100000    PUSH 1000                                ; /BufSize = 1000 (4096.)
0040101C  |. 8D85 FCDFFFFF  LEA EAX,DWORD PTR SS:[EBP-2004]          ; |
00401022  |. 50             PUSH EAX                                 ; |PathBuffer
00401023  |. 6A 00          PUSH 0                                   ; |hModule = NULL
00401025  |. FF15 04204000  CALL DWORD PTR DS:[<&KERNEL32.GetModuleF>; \GetModuleFileNameW
0040102B  |. 8D8D FCEFFFFF  LEA ECX,DWORD PTR SS:[EBP-1004]
00401031  |. 51             PUSH ECX
00401032  |. 6A 00          PUSH 0
00401034  |. 6A 00          PUSH 0
00401036  |. 6A 07          PUSH 7
00401038  |. 6A 00          PUSH 0
0040103A  |. FF15 B4204000  CALL DWORD PTR DS:[<&SHELL32.SHGetFolder>;  SHELL32.SHGetFolderPathW
00401040  |. 68 14214000    PUSH wsample0.00402114                   ; /StringToAdd = "\wsample01b.exe"
00401045  |. 8D95 FCEFFFFF  LEA EDX,DWORD PTR SS:[EBP-1004]          ; |
0040104B  |. 52             PUSH EDX                                 ; |ConcatString
0040104C  |. FF15 08204000  CALL DWORD PTR DS:[<&KERNEL32.lstrcatW>] ; \lstrcatW
00401052  |. 6A 00          PUSH 0                                   ; /FailIfExists = FALSE
00401054  |. 8D85 FCEFFFFF  LEA EAX,DWORD PTR SS:[EBP-1004]          ; |
0040105A  |. 50             PUSH EAX                                 ; |NewFileName
0040105B  |. 8D8D FCDFFFFF  LEA ECX,DWORD PTR SS:[EBP-2004]          ; |
00401061  |. 51             PUSH ECX                                 ; |ExistingFileName
00401062  |. FF15 00204000  CALL DWORD PTR DS:[<&KERNEL32.CopyFileW>>; \CopyFileW
00401068  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
0040106B  |. 33CD           XOR ECX,EBP
0040106D  |. 33C0           XOR EAX,EAX
0040106F  |. E8 2F000000    CALL wsample0.004010A3
00401074  |. 8BE5           MOV ESP,EBP
00401076  |. 5D             POP EBP
00401077  \. C3             RETN


・逆アセンブルされた処理を分析する
アセンブラが読めなくとも、GetModuleFileNameW, SHELL32.SHGetFolderPathW, lstrcatW, CopyFileW
という順番で関数が呼び出されていることがわかる。
OllyDbgではF2でブレークポイントを設定、F9で実行、F8でステップアウト、F7でステップインができる。
F8で処理を進めていき、CopyFileWの直前のレジスタを確認すると、コピー元やコピー先のファイルパスを確認できる。
f:id:kamishiroHW:20200507133218p:plain