引言
在Android逆向工程中,对于需要进行保护的应用程序,常常会对一些敏感函数进行HOOK操作。本篇博客将介绍如何对Android系统核心库libc.so中的execve函数进行内联HOOK操作,并对函数进行加壳保护,防止被恶意调用。
ART函数抽取
ART(Android Runtime)是Android系统中的一种运行时环境,负责将应用程序的DEX文件编译为本地机器代码。在逆向工程中,我们常常需要对ART的函数进行抽取,以便进行反向分析和HOOK操作。
函数抽取方式
在Android逆向工程中,我们可以使用工具apktool或者IDA Pro来进行函数抽取。具体操作如下:
-
使用apktool反编译目标应用程序APK文件:
apktool d target.apk
-
进入反编译生成的目录,找到smali文件夹下的对应代码文件,即可获得函数的smali代码。
-
使用IDA Pro加载目标应用程序APK文件,找到对应的so库文件,即可进行反汇编分析和HOOK操作。
execve函数分析
在本篇博客中,我们将抽取目标函数execve,该函数在libc.so库中,用于执行外部命令。其原型定义如下:
int execve(const char *pathname, char *const argv[], char *const envp[]);
函数HOOK方式
函数的HOOK操作主要通过替换函数的调用地址来实现。在本篇博客中,我们将采用内联HOOK的方式,将目标函数的调用地址替换为我们自定义的函数。
函数内联HOOK
在进行函数内联HOOK操作之前,我们需要先获取目标函数的调用地址。
获取函数调用地址
我们可以通过使用IDA Pro或者frida等工具获取到函数的调用地址。具体操作如下:
-
使用IDA Pro加载libc.so库文件。
-
找到目标函数execve,记录其调用地址。
-
或者使用frida脚本动态获取函数地址:
var libc = Module.findBaseAddress('libc.so'); var execveAddr = libc.add(0x12345678); // 以实际地址为准
替换函数调用地址
获取到函数的调用地址后,我们可以使用内联HOOK的方式将其替换为我们自定义的函数。具体步骤如下:
-
使用IDA Pro分析libc.so中execve函数的汇编代码,获取到函数的指令长度。
-
将自定义函数的汇编代码按照目标函数的指令长度进行调整。
-
在目标应用程序中找到目标函数的调用代码,并将其替换为自定义函数的汇编代码。
// 目标函数execve的调用代码
blx execveAddr
// 自定义HOOK函数的内联汇编代码
(ldr r0, =pathname)
(ldr r1, =argv)
(ldr r2, =envp)
(blx my_execve)
// 自定义HOOK函数的实现
my_execve:
// Add your code here
// 调用原始execve函数
mov r12, execveAddr
ldr pc, [r12]
// 替换函数调用地址
将目标函数execve的调用代码替换为自定义HOOK函数的内联汇编代码
函数加壳保护
为了进一步保护所进行的HOOK操作,我们可以对目标函数进行加壳保护。具体步骤如下:
-
使用C或C++编写代码,在代码中实现对目标函数的加密操作。
-
加密目标函数的指令,并将加密后的指令写入到目标应用程序中。
-
使用函数内联HOOK的方式将替换目标函数的调用地址。
-
在自定义HOOK函数中进行解密操作,并调用原始execve函数。
// 加密目标函数execve的指令
encrypt_execve();
// 使用函数内联HOOK的方式替换函数调用地址
inline_hook_execve();
// 自定义HOOK函数的实现
my_execve:
decrypt_execve(); // 解密execve的指令
call execveAddr; // 调用原始execve函数
结语
本篇博客介绍了如何对Android系统核心库libc.so中的execve函数进行内联HOOK操作,并对函数进行加壳保护。希望通过本文的介绍能够帮助到正在进行Android逆向工程的开发者们。
本文来自极简博客,作者:浅夏微凉,转载请注明原文链接:Android逆向:ART函数抽取加壳——对libc.so