在C

时间:2015-07-11 11:57:52

标签: c assembly intel

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

system("cls");

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

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

有人可以解释这意味着什么,如果我想将system()中调用的“cls”更改为另一个命令,那么“cls”存储在哪里?我该如何修改它?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

注意:我对十六进制数字使用TASM表示法,即{C}表示法中的123h表示0x123