我想将日志记录添加到共享(.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)。

#1 楼

Android Dynamic Binary Instrumentation工具包(adbi)应该允许您执行所需的操作。


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

仪器基于库注入和挂钩功能
入口点(内联挂钩)。

该工具包由hijack工具和
基本库两个主要组件组成。 br />
hijack

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

libbase

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


#2 楼

您可以使用动态二进制工具来实现Jason Geffner建议的功能。

您可以使用Intel的PINdroid。阅读有关Android Binary Instrumentation的演示文稿。

评论


至于Pin,有ARM支持吗?引脚用于程序的检测。它支持IA-32和Intel(R)64的Linux *,Windows *,macOS和Android *可执行文件。

– 18446744073709551615
2014年5月23日在11:03

如果我没记错,那么可以,您也可以将Pindroid用于ARM。我没有在Android中使用它。但是根据我的看法,可以。 Pindroid教程

–john4tech
14年5月23日在11:11

#3 楼

我通常要做的是找到一个合适的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


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


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