2017-10-18 2 views
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のバグですか、何か間違っていますか?

+1

このコードは、呼び出し規約を特に扱っていません(特に、 'DllEntryPoint'が必要とする' stdcall')。そして 'JMP'をDLL関数(' ShowLastError')にするのは安全ではありません。あなたが使っている他のインポートされたDLL関数( 'FormatMessage'と' MessageBox')と同じように 'INVOKE'する必要があります。特に 'ShowLastError'は渡されない入力パラメータを取るので、 –

+0

@RemyLebeau DLLはロードされないので、これは私の問題とは正反対です。 – arrowd

+1

それはまだ修正する価値があります。いずれにしても、INVALID_IMAGE_FORMATの通常の原因は、64ビットDLLをロードする32ビットプロセスであり、その逆もあります。それはここにあるのでしょうか? –

答えて

1

私はこれに関する説明を見つけることができませんでしたが、少なくとも回避策が見つかりました。次の行

section '.reloc' fixups data readable discardable 

にちょうど

data fixups 
end data 

修正問題を変更します。

関連する問題