アセンブリ言語で 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) であることを確認します。
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