如何对C库进行逆向工程?

时间:2014-01-30 12:48:37

标签: c dll reverse-engineering disassembly

假设我在Linux上有一个动态库(.so)。我还有一个使用该库的现有应用程序。图书馆被剥离了。我想为库生成一些(近似的)头文件,以便我可以编写另一个使用它的程序。

使用objdump来查看库中的函数是很容易的,并且ltrace可以查看正在进行的每个调用。

我如何弄清楚函数参数是什么?

一些想法:我可以使用LD_PRELOAD或dlsym类型技巧来加载一个shim库,它在原始库中调用任何函数时查看堆栈。我也可能在转储寄存器的垫片中做一些事情(这是在ARM上,所以我认为它是r0-r3)。通过更多的工作(通过查看反汇编),也可以确定寄存器是否包含将被解除引用的指针,然后使用shim函数转储该指针处的内容。

从那里开始似乎是一个很大的步骤“这个函数将第一个参数作为带有以下字段的struct的指针......”是否有任何自动化工具用于此类事情?

注意:我对函数的工作方式一无所知,只关注如何为它们提供正确的数据。

1 个答案:

答案 0 :(得分:3)

一个好的开始是像Objdump,HopperApp或IDA Pro这样的反汇编程序。后者为非特殊情况自动检测参数。

如果你想了解自己的工作方式,我会查看不同的“调用约定”(维基百科是一个好的开始)。

__stdcall示例:假设您有x86 .so库,这样的事情发生在二进制文件中:

push 3
push 2
push 1
call func ; void func(int a, int b, int c) where a=1, b=2 and c=3

参数以相反的顺序被推送到堆栈。 EAX,ECX和EDX可以在函数内部使用(由调用者保存)其他寄存器必须从函数本身明确保存(由被调用者保存)。 这并没有告诉你关于参数背后的数据类型的任何信息。这通常需要更多的逆转来解决。

即使IDA Pro也不会自动检测所有信息,因为它取决于很多因素而且非常困难:)