Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Windows 是否可以在NASM中使用DB指令在.text段中生成可写变量?_Windows_Assembly_X86_Nasm - Fatal编程技术网

Windows 是否可以在NASM中使用DB指令在.text段中生成可写变量?

Windows 是否可以在NASM中使用DB指令在.text段中生成可写变量?,windows,assembly,x86,nasm,Windows,Assembly,X86,Nasm,我尝试过在.text段中声明变量,例如使用文件\u handle:dd 0 但是,尝试在该变量中存储某些内容,如mov[file\u handle],eax会导致写入错误 我知道,我可以在.data段中声明可写变量,但为了使代码更紧凑,我想如上所述进行尝试 是否可以使用堆栈来存储这些值(例如文件句柄),或者是否可以写入上面的变量?您实际上可以安排将Windows进程的文本段映射为读+写+执行,请参阅。在使用ELF二进制文件的Linux上,这也是可能的;我认为ELF对段具有类似的标志 我认为您还可

我尝试过在
.text
段中声明变量,例如使用
文件\u handle:dd 0

但是,尝试在该变量中存储某些内容,如
mov[file\u handle],eax
会导致写入错误

我知道,我可以在
.data
段中声明可写变量,但为了使代码更紧凑,我想如上所述进行尝试


是否可以使用堆栈来存储这些值(例如文件句柄),或者是否可以写入上面的变量?

您实际上可以安排将Windows进程的文本段映射为读+写+执行,请参阅。在使用ELF二进制文件的Linux上,这也是可能的;我认为ELF对段具有类似的标志

我认为您还可以调用Windows函数(VirtualProtect),从进程内部将文本段的映射更改为读取+写入+执行


总的来说,这听起来是一个糟糕的想法,如果您想避免使用数据页,那么一定要像C编译器那样在堆栈上保留临时变量


静态存储只在程序的一部分中使用的东西是浪费的。

不,在汇编程序的
.text
部分不可能有可写的“变量”

.text
部分中写入
文件句柄:dd 0
然后组装时,标签
文件句柄
引用位于二进制文件文本部分的地址。但是,文本部分是只读的


如果文本部分不是只读的,程序可以在执行时修改自身。

默认情况下,可执行代码段不可写。这是一项基本的安全预防措施。不,这不是个好主意。但如果你坚持,因为这是一个玩具项目无论如何,继续

您可以通过让链接器知道如何将其标记为可写,例如,向MS链接器提供以下参数:

link /SECTION:.text,EWR ....