0

Microsoft Visual Studio 2012 で作成されたオブジェクト ファイルにできるだけ近いオブジェクト ファイルを NASM で作成しようとしています。

cl.exe具体的には、 and doを使用してオブジェクト ファイルを作成するとdumpbin /all binary.obj、次のような興味深い行が表示されます。

Offset     Type     Applied To     Symbol Index   Symbol Name
--------   -------  ----------     ------------   -----------
00000007   DIR32      00000000               B    __imp__GetModuleHandleA@4

しかし、私が行うdumpbin /all nasmobj.objと、同様の、しかしわずかに異なる行が表示されます。

Offset     Type     Applied To     Symbol Index   Symbol Name
--------   -------  ----------     ------------   -----------
00000007   REL32      00000000               7    __imp__GetModuleHandleA@4

したがって、違いは、MSVC が「直接」再配置である再配置を生成するのに対し、私の NASM コードは「相対」再配置を生成することです。どうすればこれを修正できますか?

NASM コードを次のようにコンパイルしています。

nasm -f win32 nasmtst.s

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

SECTION .text
EXTERN __imp__GetModuleHandleA@4
%define GetModuleHandleA (__imp__GetModuleHandleA@4)

; code happens
...
call GetModuleHandleA
...
; more code happens
4

1 に答える 1

1

GetModuleHandleA 関数の実際のコードの場所ではなく、__imp__GetModuleHandleA@4インポートポインターであることに注意してください。通常、Win32 PE には、収集されたすべてのインポート ポインターを含む .idata セクションがあります。これは、ELF の GOT テーブルに多少似ています。

SECTION .idata
   __imp__GetModuleHandleA@4 dd ? ; to be filled by system loader

このセクションとすべてのサポート メタデータは、通常、インポート ライブラリを使用してリンカーによって生成されますが、手動で生成することもできます。

あなたの場合、以下で十分です。

EXTERN __imp__GetModuleHandleA@4 
call [__imp__GetModuleHandleA@4]

一部のアセンブラ/マクロ パッケージでは、次のようなものを使用できます。

call GetModuleHandleA

また

invoke GetModuleHandleA, eax

これにより、リンカーによって生成されたスタブが呼び出されます。

GetModuleHandleA:
   jmp [__imp__GetModuleHandleA@4]

このアプローチの利点は、(jmp命令に対して) パッチを適用する再配置が複数 ( 1 つ) ではなく、 1 つだけであることcallです。

于 2013-07-22T18:02:10.643 に答える