程序集分析在C中调用的system()函数

Assembly analyzing system() function called in C

所以我做了一个很简单的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