调整示例 DLL 代码时获取无效图像
Getting invalid image when adjusting example DLL code
我使用了一个示例代码,它从 FASM 示例目录创建了一个简单的 DLL,并正在根据我的需要对其进行调整。但是,当我进行一些(从我的 POV 来看是无辜的)更改时,生成的二进制文件被损坏 - 运行 使用此库的 exe 产生错误代码 0xC000007B 又名 INVALID_IMAGE_FORMAT.
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 错误,还是我做错了什么?
我找不到对此的解释,但至少我找到了解决方法。更改以下行
section '.reloc' fixups data readable discardable
只是
data fixups
end data
修复了问题。
我使用了一个示例代码,它从 FASM 示例目录创建了一个简单的 DLL,并正在根据我的需要对其进行调整。但是,当我进行一些(从我的 POV 来看是无辜的)更改时,生成的二进制文件被损坏 - 运行 使用此库的 exe 产生错误代码 0xC000007B 又名 INVALID_IMAGE_FORMAT.
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 错误,还是我做错了什么?
我找不到对此的解释,但至少我找到了解决方法。更改以下行
section '.reloc' fixups data readable discardable
只是
data fixups
end data
修复了问题。