前置条件
1.首先我们假设已经搭建好了抓包工具 charles
2.并且有一个可运行的虚拟或者真实设备 获取root权限,同时安装了adb
3.选择一款hook工具 此处选择frida
以上没有达成的可以找我历史文章
选择一款应用 某点小说
某小说应用为案例 比如我们想看小说的基本信息
去应用商店下载并且安装app到模拟器(优先低低版本 容易分析)
分析接口以后发现可以抓包但是没有数据
通过配置postern+charles可以解决这个问题
charles这么配,走socks5
然后模拟器装postern
可以抓到我需要的请求数据包了
开始hook app
但是启动客户端frida需要知道应用的包名
此处有一个命令 adb shell 进入手机命令行
dumpsys window windows|grep com
命令可以修改
此时反斜杠后面就是包名
有了包名就可以进行hook了,第一个思路hook 一个app的string构造函数
Java.perform(/*hook string的js方法*/
function hook_string_factory() {
var StringFactory = Java.use('java.lang.StringFactory');
StringFactory.newStringFromString.implementation = function (content) {
console.log("java.lang.StringFactory.newStringFromString->" + content);
var result = this.newStringFromString(content);
return result;
};
})
hook_string_factory()
进行hook 然后打印所有string构造
frida -U -f com.qidian.QDReader -l .\hook-string.js -o output.log
打印结果就出现了
我们捕获到自己需要的字符串以后 可以通过if判断在里面打印一个堆栈 然后通过定位阅读反编译后的代码 ,一点一点分析请求参数 ,加密参数等等
此处的反编译工具推荐jadx ,jeb,gda等等
到了这里问题来了 string没有hook到我想要的参数
frida对map的put函数进行hook
于是我选择map进行hook,hook打印map中每个进行调用put的函数
当请求头包含borgus,或者qdsign的一些字符串时候 打印一个调用栈
打印结果如图
发现这个参数是一个native变量 需要取so中进行分析 介于为了写文章 so难度较大 就不展开说了
第一个参数经过hook发现是url
第二个参数是get/post 请求形式
第三个是responsebody ,就是请求头request的body
经过多次点击触发
发现第一个参数url 打印结果没有我想要的v3/bookdetail/get这个请求
调用so加密接口的地方不止一个
所以so调用同一套加密算法的入口应该不止一个位置
我放弃map调用栈的方式
后来我开始分析这个请求
这个url的请求部分除了url以外可以剩余的header选项都可以通过so层返回,这个结论是我hook上面的native函数得到的结论
接下来我把目标放到了拦截器上,就是发送一个请求到业务逻辑之前,已经得到返回结果渲染到页面之前都是经过N个过滤器interceptor
我还是hook map,不过是吧请求参数换了一个关键字 get参数
hook map ,包含isoutbook关键字就打印调用栈
终于我得到了完整的拦截器的调用栈
通过hook我发现请求头经过这两个拦截器的时候发生了变化,应该就是填充了borgus等一系列加密参数
但是我不知道borgus等参数的具体添加位置
我将目光放到了请求Request的addheader方法上 开始hook 没发现什么有价值的东西
但是通过尝试我通过调用栈发现了一个新的拦截器
通过打印发现所有我需要的请求体headers参数都来自java的native方法addRetrofitH
构造request请求传递到so层
看声明发现传递到native方法是一个对象(如何构造request对象?)
返回一个request (传入传出headers发生了什么) 答案就是 传入的header为空 传出的header加密参数全部填充完毕
到了这里 我手动拼凑了一个请求居然拿到数据了
因此我最后构造了一个代码
如下(可修改用作rpc)
构造请求发送然后打印出数据
这里的book_id找规律可以发现他们统一有一个103前缀,其他的位通过1开始递增轮询 应该就可以找到所有小说了
到这里小说的详情页就可以拿到了(通过遍历id+rpc构造请求)
案例仅适用于学习分析
具体代码可以参考github
https://github.com/victor-zhao-177/appspiderHook