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

标签 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”存储在哪里?我该如何修改它?

最佳答案

您使用的是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/

相关文章:

c++ - Socket connect() 总是成功(TCP over ActiveSync)

assembly - 我正在尝试创建一个引导加载程序,其中包含由星号组成的圣诞树,但我不知道如何使用相同的循环来打印

c - 在 c 代码中显示溢出的工具

x86 - 如何解释 perf iTLB-loads,iTLB-load-misses

c - 如何处理复杂 C 代码中的多个参数选项

c - C 中的 GET HTTP 请求(消息体)

c - 非阻塞 TCP 接受器不从套接字读取

assembly - 为什么 cmp $0xffffffffffffffff, %edi 用于汇编?

c - 如何使用英特尔 C 编译器为双函数返回 NULL?

c - <stdatomic.h> 中的 atomic_store/load 是否适用于 Intel 上未对齐的跨缓存行数据?