是否可以在NASM中使用DB指令在.text段中创建可写变量?

时间:2016-08-10 17:09:40

标签: windows assembly x86 nasm

我尝试使用例如.text段声明变量file_handle: dd 0

但是,尝试在mov [file_handle], eax这个变量中存储内容会导致写入错误。

我知道,我可以在.data段中声明可写变量,但为了使代码更紧凑,我想按上述方式尝试。

是唯一可能使用堆栈存储这些值(例如文件句柄),还是我可以以某种方式写入上面的变量?

3 个答案:

答案 0 :(得分:4)

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

您可以通过让链接器知道如此标记来使您的可写,例如,将以下参数提供给MS链接器:

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

答案 1 :(得分:2)

您实际上可以安排将Windows进程的文本段映射为read + write + execute,请参阅@Kuba's answer。这可能也适用于带有ELF二进制文件的Linux;我认为ELF对于细分市场有类似的标志。

我认为你也可以调用一个Windows函数(VirtualProtect)来改变文本段的映射,从你的进程内部读取+ write + execute。

总的来说,这听起来像是一个糟糕的想法,如果你想避免使用数据页,你应该像C编译器一样将临时值保留在堆栈上。

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

答案 2 :(得分:1)

不,它不可能有可写"变量"在汇编程序的.text部分。

file_handle: dd 0部分写.text然后汇编时,您的标签file_handle会引用位于二进制文本部分的地址。但是文本部分是只读的。

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