声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
字数 646,阅读大约需 4 分钟
前言
有师傅问我,用Frida的时候,什么时候hook Java层,什么时候hook native层。
我的回答是取决于你的目的,你要做什么事情。想要达成同样的目的,可能有不同的解决方案,区别在于是否方便、性能等的区别。
环境说明
本文采用的案例来源:https://bbs.kanxue.com/thread-285362.htm 的附件。同时推荐阅读这篇文章,对入门JNI很有帮助。
-
• APK反编译 jadx -
• so反编译 IDA9.0
如何识别Java函数还是native层
拿到一个APK文件,反编译为Java代码,查看其中的类方法。
方法中没有native
字段是就是Java方法,带native
字段的,说明是在native层实现的,保存在so文件中。
具体在哪个so文件中,一般调用so中函数,首先要加载so文件,类中会出现下面代码的字段。
static {
System.loadLibrary("hello");
}
我们就可以在lib目录下寻找文件名类似libhello.so的文件。
当然,我们也可以通过Frida脚本获取。这个后续再说。
hook的时机
当然,我们的目的肯定不是识别函数是什么函数。目的是hook指定的函数获取我们想要的东西,比如加密后的密文或者加密前的明文。
就像上面说的,hook哪一层取决于我们的目的是什么。
以常见的数据包加密为例,我们通过代理抓包,发现HTTP请求体和响应体被密文加密了。
username=xxxx&password=xxxxx
然后,我们通过关键词搜索,或者打印堆栈信息,定位加解密函数如下:
// input 明文,return 加密后的密文
publicnative String encrypt(String data);
// input 密文,return 解密后的明文
publicnative String decrypt(String encryptData);
因为Java层存在调用接口,我们可以通过Java层的hook方式,hook这两个函数,打印传入参数和返回值,或者frida rpc + 主动调用,来实现数据包主动加解密。
这就能实现我们加解密数据包的目的了。而不需要在意native层的具体实现。
那什么时候深入native层进行hook呢?
Java层解决不了问题的时候。
比如,我们想把这个加密过程从APP中分离出来,用其他方法实现。就可以用Frida hook native层的函数,如果是通用的加解密方法,获取key和iv。
或者so层在请求包中添加了sign签名,我们需要hook获取这些值。
欢迎关注公众号~~~
原文始发于微信公众号(进击的HACK):Frida何时hook Java层,何时hook native层
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论