【问题标题】:Variables access in assembly (MASM32)汇编中的变量访问 (MASM32)
【发布时间】:2017-02-11 05:27:37
【问题描述】:

作为一个安全大学项目,我应该编写一个 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)时是未知的,这对我来说似乎是合法的,但是......那是什么方法?

【问题讨论】:

    标签: assembly masm32


    【解决方案1】:

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

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

    对数据的引用,例如在您的mov stuff,1 中,具有固定大小,并且可以在以后进行修复。可能在汇编器的第二遍中,或者在链接器中。

    【讨论】:

    • 我不太明白你的意思。我们没有专门针对这个问题进行重定位吗?
    • 调用好了,我做了一些测试,它工作了,但是 stuff 呢?我不确定我应该做什么。使用本地变量?
    • fuz:我忽略了它是什么
    • @FTW - 如果要使用变量,则必须将它们放在可写段中,例如数据或堆栈。在代码段中有变量表明本教程使用了相当旧的代码。就像从 386 成为当前处理器时一样。
    • 确实,但我无法做到这一点。无论如何,我想出了如何解决,只需为链接器设置一个选项以设置可写部分: /SECTION:.text,EWR 并且它可以工作。感谢您的回复。
    猜你喜欢
    • 2019-12-31
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多