動的解析をやってみよう
OllyDbg
OllyDbg v1.10
参考書籍 : たのしいバイナリの歩き方
・Process Monitorでwsample01b.exeの動作を見る
ログを読むと、exeがスタートアップにアクセスしていることがわかる
より詳細に調べるため、OllyDbgを使う
・OllyDbgでより詳細な動作を見極める
アドレス00401000にジャンプ
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の直前のレジスタを確認すると、コピー元やコピー先のファイルパスを確認できる。