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

时间:2014-01-24 19:17:08

标签: 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函数...... 这太乏味了......

所以我的问题是我在正确的道路上......? 在这个问题上有更好的解决方案吗?

任何人都能给我一些帮助..?谢谢!

2 个答案:

答案 0 :(得分:1)

要直接调用库函数,您必须知道它们的参数是什么以及调用约定是什么,因此您可以在模拟堆栈中从后者中提取前者,调用函数,然后调整模拟堆栈以反映该调用的结果。

答案 1 :(得分:1)

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

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

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

就你而言,是一堆机器指令在ram和寄存器,alu操作,加载,存储等操作。然后最终你要么系统调用输出“Hello 7 \ n”)或者你将获得一系列系统调用输出H输出e输出l输出l输出o输出''输出7输出CR,输出LF。你只需要处理系统调用......