将日志插入现有的二进制代码,ARM

逆向工程 C++ 手臂 修补
2021-06-10 07:34:31

我想向共享 ( .so) 库中的某些函数添加日志记录(ARM、Android,混合了 Arm 和 Thumb 模式;C++,一些函数是虚拟的,因此是无名的,通过 VFT 调用。)

有没有人已经有代码可以做到这一点或几乎做到这一点?(向现有函数添加日志记录。)

(我正在考虑在运行时(即时)打补丁,但你可能会建议一些静态的东西。)

这些过程通常以PUSH/STM指令开始,但很难将分支置于一条指令中,至少在拇指模式下是这样。 如何修改现有程序?

另一个问题是检测驻留在 PLT 中的代码。 如何检测 PLT 中的代码,如何“取消引用” plt 条目?

相关信息:

缓存问题在这里讨论: 在运行时修补 ARM7 代码(但目前没有代码)。

Qt 特定的东西:http : //www.ntcore.com/files/qtrev.htm或(相同的)http://www.codeproject.com/Articles/31330/Qt-Internals-Reversing关于 Qt 信号和插槽

关于打印出 RTTI(当然,当它可用时)。

UPD:reDroid:Android NDK/C++/Qt 的逆向工程工具(来自 github)

3个回答

Android Dynamic Binary Instrumentation Toolkit (adbi)应该允许您做您需要做的事情。

适用于 Android ARM + Thumb 的简单二进制检测工具包。

检测基于库注入和挂钩函数入口点(内嵌挂钩)。

该工具包由两个主要组件组成:劫持工具和基础库。

劫持

劫持工具提供注入功能。它支持多种模式以支持新旧 Android 设备。hijack 在命令行上提供帮助。

基础库提供挂钩和取消挂钩功能。基础库被编译为静态库,因此可以直接包含在实际的检测库中。这样做是为了我们可以将所有内容保存在 /data/local/tmp 中。

您可以按照Jason Geffner 的建议使用 Dynamic Binary Instrumentation 来实现您想要的

您可以使用英特尔的PINdroid阅读有关Android Binary Instrumentation 的此演示文稿

我通常做的是找到一个合适的 BL 或 BLX 指令,并在我的日志记录代码的末尾用 BL 替换它,然后跳转到原始目标。

原始代码:

MOV R0, #123
BLX  somefunction

然后在C我写一些函数:

int hooksomefunction(int arg)
{
     // insert logging code here

     return somefunction(arg);
}

并将原始代码更改为:

MOV R0, #123
BLX  hooksomefunction

插入您自己的调用的其他方法:

  • 在一些不太可能实际使用的错误处理代码上插入您的代码。
  • 编写跳过一些指令,将这些指令复制到钩子的开头,调用日志代码,然后跳回。