汇编中的变量访问(MASM32)

时间:2017-02-11 05:27:37

标签: assembly masm32

作为一个安全大学项目,我应该编写一名PE感染者。但是我是汇编的初学者,所以由于我对如何处理变量的无知而导致多次崩溃。

我知道在常规程序中,初始化变量的 .data 部分和未初始化变量的 .data?

但在这种情况下,每个教程似乎都同意变量应该在 .code 部分中定义。

导致类似的事情:

.386
.model flat, stdcall
option casemap:none
include \masm32\include\masm32rt.inc
.code
start:
    mov stuff, 1
    ret


stuff dd ?

end start

不幸的是,这会导致分段错误,我无法弄清楚原因。

另一个例子:

.386
.model flat, stdcall
option casemap:none
include \masm32\include\masm32rt.inc
.code
start:
    invoke  MessageBoxA, 0, offset hello, offset hello, MB_OK
    ret


hello  db      "Hello buddy", 0

end start

这个没有编译,因为hello变量在编译(汇编:p)时间是未知的,这对我来说似乎是合法的但是......那是什么方式?

1 个答案:

答案 0 :(得分:1)

大多数操作系统都不允许写入代码段,这是其恶意软件防护的一部分。使感染代码变得更加困难。 :-)

invoke是一个宏,可能必须在编译时查看其所有参数,因此可以正确扩展它。它不能轻易使用代码中稍后出现的内容,因此您必须确保它更早出现。例如,hello的地址取决于宏的扩展大小。

对数据的引用(例如mov stuff,1)具有固定的大小,可以在以后修复。也许是在汇编程序的第二次传递中,或者是链接器。