所以我做了一个非常简单的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”存储在哪里?我该如何修改它?
答案 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
。