我的代码存在一些问题。我试图读取可执行文件中的两个PE头。但是,当我调用ReadFile时,它会将[hFile]
设置为5A,这不是我从CreateFile
放入的句柄。据我所知,ReadFile
不应以任何方式改变这一点。但是,当我将句柄存储在另一个变量中并使用它来设置文件指针时,下一个ReadFile
指令仍然给我MZ
标题而不是PE
标题,它位于在MZ
标题的偏移量3C处。
摘要:ReadFile
更改了我的句柄,SetFilePointer
将更改视为无效句柄,SetFilePointer
在给定有效句柄时不会更改下一次读取的指针。
format PE console 4.0
entry start
include 'win32ax.inc'
section '.data' data readable writeable
thisFile db "thisfile.exe",0
read db ?
hFile dd ?
section '.text' data readable executable
start:
;========Open File================
invoke CreateFile,thisFile,GENERIC_READ,FILE_SHARE_READ,0,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov [hFile],eax
;========MZ HEADER================
invoke ReadFile,[hFile],read,2,NULL,0 ; = MZ, , however, changes [hFile]
;to 5A? Why does it change it?
invoke printf,read
;========PE HEADER================
invoke SetFilePointer,[hFile],03Ch,0,FILE_CURRENT ; = 0, beginning of file ATM
;Should make next read = PE
invoke ReadFile,[hFile],read,3,NULL,0 ; = PE
invoke printf,read
invoke getchar
invoke ExitProcess,0
答案 0 :(得分:2)
在这里,您将2个字节读入read
:
invoke ReadFile,[hFile],read,2,NULL,0
但请看看你如何宣布read
:
read db ?
这是一个字节。因此,您使用ReadFile
读取的第二个字节将被写入内存中read
之后的任何内容,恰好是hFile
。因此,您将覆盖hFile
的最低有效字节。
您的代码中还有另一个地方,您尝试将3个字节读入read
,但我想这会失败,因为那时您的hFile
将无效。
您需要做的是为read
预留更多空间,就像您计划存储在read db 4 dup(0)
中一样。让我们说你需要4个字节,你可以用:
read: times 4 db 0
或
read rb 4
或
read dd ?
或
read
由于您将printf
作为字符串传递给{{1}},请记住,字符串应该是NUL终止的。