作为一个安全大学的项目,我应该编写一个体育感染程序。但是我是一个程序集的初学者,因为我不知道如何处理变量,所以我有多次崩溃。
我知道,在常规程序中,我们有一个用于初始化变量的.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变量在编译时是未知的,这在我看来是合理的,但是.路是什么?
发布于 2017-02-11 15:37:33
大多数操作系统不允许写入代码段,这是其恶意软件保护的一部分。使得感染代码变得更加困难。:-)
invoke是一个宏,它可能必须在编译时看到它的所有参数,因此可以正确地展开它。它不能很容易地使用代码后面出现的东西,所以您必须确保它出现得更早。例如,在这里,hello的地址将取决于宏展开的大小。
对数据的引用,如在您的mov stuff,1中,有一个固定的大小,可以在以后进行修复。也许在第二次通过汇编程序,或由链接器。
https://stackoverflow.com/questions/42172573
复制相似问题