2017-02-11 34 views
2

作为一个安全大学项目,我应该编写一个PE感染者的代码。但我是一个汇编程序的初学者,因为我不知道如何处理变量而导致多次崩溃。装配中的变量访问(MASM32)

我知道,在一个正常的程序中,我们有一个。数据部分初始化变量,和。数据?未初始化的变量为

但是在这种情况下,每个教程似乎都认为应该在。代码部分中定义变量。

从而导致类似的东西:

.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

这很奇怪,但我的文章的第一行系统地删除,即使我编辑它...但我确实打招呼:p – FTW

+0

根据网站政策,你不应该添加诸如“你好,”和“感谢您的帮助”到您的文章。这可能是为什么网站自动删除那些(?) – fuz

+0

哦...好吧然后 – FTW

回答

1

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

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

对数据的引用(如在您的mov stuff,1中),具有固定的大小,可稍后进行修正。也许在汇编程序或链接程序的第二遍中。

+0

我真的不明白你的观点。难道我们不完全是为了这个问题而搬迁吗? – fuz

+0

好的为了调用,我做了一些测试,它的工作原理,但**的东西**?我不确定明白我应该做什么。使用LOCAL变量? – FTW

+0

fuz:我忽略它是什么 – FTW