Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在x86 Windows程序集中的当前目录中找到文件_Windows_File_Assembly_X86_Fasm - Fatal编程技术网

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

如何在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在给定有效句柄时不会更改下

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

这里您正在将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 ?