如何在x86 Windows程序集中的当前目录中找到文件

时间:2014-08-05 05:44:58

标签: windows file assembly x86 fasm

我的代码存在一些问题。我试图读取可执行文件中的两个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 

1 个答案:

答案 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终止的。