作为一个安全大学项目,我应该编写一名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)时间是未知的,这对我来说似乎是合法的但是......那是什么方式?
答案 0 :(得分:1)
大多数操作系统都不允许写入代码段,这是其恶意软件防护的一部分。使感染代码变得更加困难。 :-)
invoke
是一个宏,可能必须在编译时查看其所有参数,因此可以正确扩展它。它不能轻易使用代码中稍后出现的内容,因此您必须确保它更早出现。例如,hello
的地址取决于宏的扩展大小。
对数据的引用(例如mov stuff,1
)具有固定的大小,可以在以后修复。也许是在汇编程序的第二次传递中,或者是链接器。