NDK Hook
前言
本文将在前文的基础上,利用 frida
对第一个 NDK 程序进行原生函数的 hook
。前面实现了一个简单计算器功能的 NDK 程序,本文将对其中的加法进行 hook
使之无法计算出正确结果。
为了客观公正,我们需要忘记自己是如何编写的这个程序。只能知道,这个程序有一个使用 native 实现的加法,我们需要去 hook
它。对了,生成的链接库的名字我们也得知道。
本文用到的 APK 来自于前文中编写的 APK,可以从这里直接下载。NDK_TEST.apk 。
IDA 分析
既然知道是要进行 native 层的 Hook
了,那就将 apk
文件直接用压缩软件解压,然后在 NDK_TEST/lib/x86
下找到文件 libcalc.so
(因为前文中设置的名字就是 calc
)。
然后打开 ida32
(别问我为啥要用 32 位的,问就是用 ida64
它让我用 ida32
的) ,将上述的 libcalc.so
直接拖进 ida
中。
然后打开 Exports
面板,查看有哪些函数。
嗯,函数有点多,一个一个找不现实。但是我们知道我们要找的函数是给 Java
用的,应该和这个关键字有关系,于是我们 Ctrl+F
搜索一些关键字 “Java” 。果然搜到了所有想要的函数。
这里我们选择加法,没有为啥,就是随便选了一个,其他的都是同理的。
然后我们双击我们想要查看的函数,这里我就想看加法 Java_com_example_ndk_1test_MainActivity_add
,双击进去,已经看到了我们的 log
TAG 信息.
这个看着不舒服,我们来看看 C
代码,按一下 F5
,我们就查看反编译的 C
代码。
这个代码看起来就很舒服了,第 4 行就是我们函数对加法的返回值,那我们就决定修改它了。
虽然我们早就知道这个源码是啥样,但是我们必须假装不知道。所以“多此一举”来看源码。
frida hook
有了上述的分析,我们只需要 hook
掉 Java_com_example_ndk_1test_MainActivity_add
方法的返回值就好了。
那么就不废话了,直接上代码。
loader.py
1 | import frida |
inject.js
1 | console.log("Script loaded successfully "); |
代码很好懂,这里就不解释了。就是 onLeave
即返回要返回的时候下一个钩子,我们将所以加法的结果都修改为返回 114514
。
运行测试
上述代码写好之后,我们就接上调试机,然后开始进行调试。
运行结果,终端显示如下
调试机端显示如下,可以看到 114
+ 514
= 114514
。计算错误, Hook
成功。
总结
本文只是简单使用体验一下 NDK 的 Hook
其中还有大量的知识不娴熟或者新学中,并且还有大量未知的知识。如 frida 除了 onLeave
还有哪些类似的函数,这些函数的参数是什么,参数又是怎么样的结构?等等。边学边记吧。
参考链接
参考链接1: frida 对 NDK 进行 Hook https://blog.csdn.net/cpongo1/article/details/102580584
参考链接2: frida onEnter 函数 https://frida.re/docs/quickstart/
参考链接3:frida 接收参数 https://bbs.pediy.com/thread-248772.htm