1
FASMのサンプルディレクトリから簡単なDLLを作成し、それを私のニーズに合わせて調整するサンプルコードを作成しました。しかし、私はいくつかの(POVから無邪気な)変更を行うと、生成されたバイナリファイルが壊れてしまいます。このライブラリを使用するexeを実行するとエラーコード0xC000007B、別名INVALID_IMAGE_FORMATが発生します。例DLLコードを調整する際に無効な画像を取得する
DLLコード:
; DLL creation example
format PE GUI 4.0 DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable executable
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
mov eax,TRUE
ret
endp
proc ShowErrorMessage hWnd,dwError
local lpBuffer:DWORD
lea eax,[lpBuffer]
invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0
invoke MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK
ret
endp
proc ShowLastError hWnd
ret
endp
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetLastError,'GetLastError',\
SetLastError,'SetLastError',\
FormatMessage,'FormatMessageA',\
LocalFree,'LocalFree'
import user,\
MessageBox,'MessageBoxA'
section '.edata' export data readable
export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError'
section '.reloc' fixups data readable discardable
実行可能コード:
format PE GUI 4.0
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
jmp ShowLastError
section '.idata' import data readable writeable
library mydll,'DLL.DLL'
import mydll,\
ShowLastError,'ShowLastError'
私が言う、変更、
export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError'
ライン
export 'DLL.DLL',ShowLastError,'ShowLastError'
へ
コードが壊れます。 ShowErrorMessage
ボディをret
に変更すると同じことが起こります。
私はこれで完全に混乱しています。これはFASMのバグですか、何か間違っていますか?
このコードは、呼び出し規約を特に扱っていません(特に、 'DllEntryPoint'が必要とする' stdcall')。そして 'JMP'をDLL関数(' ShowLastError')にするのは安全ではありません。あなたが使っている他のインポートされたDLL関数( 'FormatMessage'と' MessageBox')と同じように 'INVOKE'する必要があります。特に 'ShowLastError'は渡されない入力パラメータを取るので、 –
@RemyLebeau DLLはロードされないので、これは私の問題とは正反対です。 – arrowd
それはまだ修正する価値があります。いずれにしても、INVALID_IMAGE_FORMATの通常の原因は、64ビットDLLをロードする32ビットプロセスであり、その逆もあります。それはここにあるのでしょうか? –