c - 如何使用libc函数在c中模拟asm代码?

标签 c assembly compiler-construction compilation

测试平台为 Linux 32 位。

所以基本上我正在尝试使用 c 来模拟/翻译汇编代码,

目前我的代码可以通过系统调用(int 80)处理小的汇编代码 和其他..

但是当我想翻译 libc 函数调用部分时, 我很困惑..

这是一个例子:

section .data
.LC0:
message db "this is a test %d %d %f ", 10

section .text 

   movl    $1, 32(%esp)
   movl    $1, 36(%esp)
   movl    $1, 40(%esp)
   movl    $1, 44(%esp)
   movl    44(%esp), %eax
   movl    %eax, 16(%esp)
   movl    40(%esp), %eax
   movl    %eax, 12(%esp)
   movl    36(%esp), %eax
   movl    %eax, 8(%esp)
   movl    32(%esp), %eax
   movl    %eax, 4(%esp)
   movl    $.LC0, (%esp)
   call    printf

我对如何翻译成这样的东西感到困惑:

   unsigned int v_ebp[100000];
   unsigned int v_esp = v_ebp + 9999;

   ........

   printf(.LC0, (unsigned int)(v_esp - 4), (unsigned int)(v_esp - 8), (unsigned int)(v_esp - 12));

我在想一个比较“笨”的办法就是模拟printf分析的方式 第一个参数,找出它被要求使用多少变量(一般应该等于 %xx 的数量),并获取它们 一个一个在模拟栈上

看起来这种方式是可行的,但是如果我选择这种方式, 我必须做类似的事情 汇编代码中几乎所有的 libc 函数... 这太乏味了......

所以我的问题是我走的路对吗..? 这个问题有没有更好的解决方案?

谁能帮我点忙..?谢谢!

最佳答案

如果您正在模拟的代码在二进制文件中有足够的调试信息,您知道函数调用是 libc 调用,那么您可以使用 keshlam 所说的处理器调用约定来模拟这些调用。您可能必须解析格式以确定预期的参数数量,然后对于每个参数,您必须模拟该参数,获取您正在模拟的 ram 或寄存器,将它们转换为模拟器中的变量,然后进行 libc 调用。

不关心可能更容易,根本不关心 libc 调用,只关心系统调用,int 80 等。 printf 和任何其他这些调用只是您模拟的更多机器代码,然后最终它会进行较低级别的系统调用,输入一个字符串或输出一个字符或写入文件或其他任何内容,然后您模拟它。

a=7;
printf("Hello %d\n");

就您而言,是一堆在 ram 和寄存器、alu 操作、加载、存储等上运行的机器指令。然后最终您将得到一个输出“Hello 7\n”) 的系统调用,或者您会得到一系列的系统调用 output H output e output l output l output o output ' ' output 7 output CR,output LF。而您只需处理该系统调用...

关于c - 如何使用libc函数在c中模拟asm代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340677/

相关文章:

c - 多次调用打印函数后的未定义行为

c - 消息不会在服务器端打印 - 套接字

C语言无法打印array[i][j]

linux - 在 64 位 Linux 和 64 位处理器上运行 32 位汇编代码 : Explain the anomaly

c - C编译器是用什么语言写的?

c - 带有指向字符串文字的 char 指针的 strcat

c++ - 在这种情况下,为什么编译器要专门用于存储冗余变量的内存位置?

c - 这个汇编语句是什么意思?

c - flex 如何识别子字符串?

c - 如何打开文件并放入数组,C