我尝试使用例如.text
段声明变量file_handle: dd 0
。
但是,尝试在mov [file_handle], eax
这个变量中存储内容会导致写入错误。
我知道,我可以在.data
段中声明可写变量,但为了使代码更紧凑,我想按上述方式尝试。
是唯一可能使用堆栈存储这些值(例如文件句柄),还是我可以以某种方式写入上面的变量?
答案 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
会引用位于二进制文本部分的地址。但是文本部分是只读的。
如果文本部分不是只读的,则程序可以在执行时自行修改。