1

アセンブリ言語で PE ファイル構造をいじっています。インポートセクションに正しく到達したと確信しています。各ボックスが 4 バイトに等しい参照としてこれを使用しています。

+-------------------------+-------------------------+
|     RVA to a list of    |       DATE/TIME         |
| pointer to APIs names   |                         |  IMPORT DATA DIRECTORY
+-------------------------+-------------------------+          #1
| .DLL address (unused)   |     RVA to .DLL name    |
+-------------------------+-------------------------+
|RVA to API address list  | 
+-------------------------+

Ollydbg。 右側の eax の値 (00402048) に注目してください。これは、インポート セクションで調べた値です。次に、強調表示された命令の値 (00402000) を見てください。

Ollydbg。右側の eax の値 (00402048) に注目し、強調表示された呼び出し命令の値がジャンプ先 (00402000) であることを確認します。

ExitProcessである (RVA から API アドレス リストへの) 最初の最初の関数を呼び出そうとしましたが、アドレスへの呼び出しを発行しようとすると、プログラムがクラッシュしました。Ollydbgでデバッグしたところ、リストで見つけたアドレスとExitProcess呼び出し時のアドレスが違うことがわかりました。Ollydbg で見つけたアドレスは <&KERNEL32.ExitProcess> を指していましたが、呼び出し ExitProcessは < JMP.&KERNEL32.ExitProcess> を指していました。ある種の jmp スタブについてどこかで読んだことがあります。これって、あれですか?「RVA to API アドレス リスト」の関数を呼び出すにはどうすればよいですか?

これは混乱を招く可能性があることを知っています。さらに明確にする必要がある場合は、お知らせください。

コードは次のとおりです。

extern printf
extern ExitProcess
global _start
section .code
 _start:
    mov eax, [imagebase]
    mov esi, eax
    add eax, 3ch
    mov eax, DWORD [eax]
    add eax, esi; PE header pointer in eax
    add eax, 128; 24 for PE Optional Header offset and then 104 for import RVA
    mov ebx, DWORD [eax]
    add ebx, DWORD [imagebase]; ebx now has import section offset
    mov eax, DWORD [ebx+16]
    add eax, DWORD [imagebase]; has array offset
    mov ecx, ExitProcess
    push 0
    call ecx
    ;call eax
    ;jmp ecx
    ;call ExitProcess

imagebase: db 0,0,64,0; 0x00400000; This is right
4

1 に答える 1

1

配列を見つけたようですが、そのアドレスの値を取得したことはありません。そのため、配列の最初の要素ではなく、配列のアドレスで関数を呼び出そうとしていました。

extern printf
extern ExitProcess
global _start
section .code
_start:
    mov eax, [imagebase]
    mov esi, eax
    add eax, 3ch
    mov eax, DWORD [eax]
    add eax, esi; PE header pointer in eax
    add eax, 128; 24 for PE Optional Header offset and then 104 for import RVA
    mov ebx, DWORD [eax]
    add ebx, DWORD [imagebase]; ebx now has import section offset
    mov eax, DWORD [ebx+16]
    add eax, DWORD [imagebase]; has array offset
    mov eax, [eax];This is what I needed to do
    push 0
    call eax

imagebase: db 0,0,64,0; 
于 2012-07-24T15:59:37.610 に答える