所以我做了一个非常简单的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”存储在哪里?我该如何修改它?
最佳答案
您使用的是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 表示法,即 123h
在 C 表示法中表示 0x123
。
关于c - 程序集分析在C中调用的system()函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31356948/