程序集中的变量访问 (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 之后。可能在汇编程序的第二遍中,或者通过链接器。
作为一个安全大学项目,我应该编写一个 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 之后。可能在汇编程序的第二遍中,或者通过链接器。