程序集中的变量访问 (MASM32)

Variables access in 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 变量在编译 (assemble :p) 时是未知的,这对我来说似乎是合法的,但是......怎么办?

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

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

对数据的引用,例如在您的 mov stuff,1 中,具有固定大小,可以在 fixed-up 之后。可能在汇编程序的第二遍中,或者通过链接器。