如何在x86 Windows程序集中的当前目录中找到文件
我的代码有一些问题。我试图读取可执行文件中的两个PE头。但是,当我调用ReadFile时,它会将如何在x86 Windows程序集中的当前目录中找到文件,windows,file,assembly,x86,fasm,Windows,File,Assembly,X86,Fasm,我的代码有一些问题。我试图读取可执行文件中的两个PE头。但是,当我调用ReadFile时,它会将[hFile]设置为5A,这不是我从CreateFile中放入的句柄。据我所知,ReadFile不应以任何方式改变这一点。但是,当我将句柄存储在另一个变量中并使用它设置文件指针时,下一条ReadFile指令仍然会给我MZ头,而不是PE头,它位于MZ头的偏移量3C处 摘要:ReadFile更改我的句柄,SetFilePointer将更改视为无效句柄,SetFilePointer在给定有效句柄时不会更改下
[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
这里您正在将2个字节读入
read
:
invoke ReadFile,[hFile],read,2,NULL,0
read db ?
但是看看你是如何声明阅读的:
invoke ReadFile,[hFile],read,2,NULL,0
read db ?
这是一个单字节。因此,使用ReadFile
读取的第二个字节将被写入内存中read
之后的任何内容,即hFile
。因此,您正在覆盖hFile
的最低有效字节
在代码中还有一个地方,您试图将3个字节读入read
,但我想这将失败,因为到那时您的hFile
将无效
您需要做的是为读取
预留更多空间,尽可能多地存储在其中。假设您想要4个字节,您可以通过以下方式获得:
read db 4 dup(0)
或
或
或
由于您将
read
作为字符串传递给printf
,请记住,字符串将以NUL结尾。因此,在过去的几周里,我一直很幸运,因为我的数据没有被覆盖。谢谢你澄清了我的一个误解。我一直认为abcdb?意味着它将为我在其中的内容腾出空间。然而,还有一个较小的子问题。在汇编中,我将如何处理我不知道有多大的数据。像一个文件名。因为如果我对每个长度未知的变量执行filename DB 256 dup(0)
,就会导致程序膨胀。GlobalAlloc
是我的答案吗?是的,在某个时候,您可能需要某种堆分配例程。在Windows中有几种类型(LocalAlloc
,GlobalAlloc
,HeapAlloc
,…)。您可能会在MSDN上找到最适合您使用的方法。
read dd ?