【问题标题】:Assembly analyzing system() function called in C在 C 中调用的程序集分析 system() 函数
【发布时间】:2015-07-11 11:57:51
【问题描述】:

所以我做了一个非常简单的 C 程序来研究 C 在内部是如何工作的。它在 main() 中只有 1 行,不包括 return 0:

system("cls");

如果我用ollydebugger来分析这个程序会显示这样的东西(分号后面的文字是ollydebugger生成的cmets。

MOV DWORD PTR SS:[ESP],test_1.004030EC     ; ||ASCII "cls"
CALL <JMP.&msvcrt.system>                ; |\system

谁能解释一下这是什么意思,如果我想将 system() 中调用的“cls”更改为另一个命令,“cls”存储在哪里?以及如何修改?

【问题讨论】:

    标签: c assembly intel


    【解决方案1】:

    您使用的是 32 位 Windows 系统,其对应的 ABI(调用函数时使用的假设)。

    MOV DWORD PTR SS:[ESP],test_1.004030EC  
    

    等效于push 4030ech 指令,它只是将字符串cls 的地址存储在堆栈上。
    这是将参数传递给函数并告诉我们字符串 cls 位于地址 4030ech 的方式。

    CALL <JMP.&msvcrt.system>                ; |\system
    

    这是从 CRTsystem 函数的调用。
    名称中的 JMP 是由于默认情况下链接如何与 Visual Studio 编译器和链接器一起工作。

    所以这两行只是将字符串的地址传递给system 函数。

    如果你想修改它,你需要通过检查 PE 部分来检查它是否在可写部分(我认为不是),你的调试器可能有一个工具。或者您可以尝试以下方法:
    检查4030ech的内存,你会看到字符串,尝试编辑它(这取决于调试器)。

    注意:我使用 TASM 表示法表示十六进制数,即 123h 在 C 表示法中表示 0x123

    【讨论】:

    • 那么如何获取test_1.004030EC中存储的数据呢?因此 test_1.004030EC 中的值被移动到 DWORD PTR SS:[ESP]。那么我可以在 ESP 寄存器中看到移动的值吗?
    • @Dashadower 它被移动到[ESP]注意方括号。这意味着 DWORD 4030ech 存储在寄存器ESP 内的地址中。因此,如果 ESP 包含 1000h,则 DWORD 存储在 1000h 而不是 ESP
    • @knh241 啊。谢谢你。我现在明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2012-06-11
    • 2014-05-03
    • 2012-01-21
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多