gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:25:05 24 4
gpt4 key购买 nike

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

很容易使用 objdump 查看库中有哪些函数,并使用 ltrace 查看每次调用。

如何确定函数参数是什么?

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

这似乎是从那里迈出的一大步,“此函数将指向具有以下字段的结构的指针作为其第一个参数......”是否有用于此类事情的自动化工具?

注意:我对函数的工作原理一点都不感兴趣,我只关心如何向它们提供正确的数据。

最佳答案

一个好的开始是像 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 也不会自动检测所有信息,因为它取决于很多因素并且可能非常困难:)

关于c - 如何对C库进行逆向工程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21457005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com