今日目标
今天的目标是很多读者朋友在采集微信文章时常用站的 app 版本
aHR0cHM6Ly93d3cud2FuZG91amlhLmNvbS9zZWFyY2gvNjU1NTQ3NDYwMzMwMTAyMDk0MQ==
抓包分析
抓包使用的是 Charles + Postern 的组合
使用大黄鸟 app 抓包也是可以的,Charles 看着会更舒服一些
打开 app 搜索任意内容,切换到微信栏目就可以抓到以下的请求包了
点击这个请求可以看到请求参数还有请求的结果都是加密的
请求的参数是k、v、u、r、g、p
的名字,所以通过参数名检索的方法很难定位到很准确的结果
静态分析定位逻辑
apk 包推荐使用 jadx 1.2 打开,用 1.3 搜索的时候老是崩溃
通过以请求链接的部分v2.get
作为搜索关键词可以定位到下面的搜索结果
最后一个搜索的结果和我们的请求链接最匹配
点进去可以看到下面的内容
可以看到图中红框的部分应该是请求的部分,红框下面是返回的部分
分别经过了encrypt
和decrypt
两个方法
先讲讲我是怎么确定是这两个方法的
红框部分中定义了一个hashMap
,通其中put
了一个Content-Length
,这个搞过 js 逆向的都知道,这个是代表了请求提交内容的长度
这个长度是通过encrypt.length
得到的,而encrypt
是通过ScEncryptWall.encrypt(str, str2, str3);
得到的
而返回部分的代码是在判断了f0.b
得出的,在f0.b
的判断中有一关于response success
的输出,进一步确认了我们的判断
所以这里的encrypt
和decrypt
两个方法是分析的重点
进一步追进去可以看到这两个方法都是native
方法,定义在libSCoreTools.so
里面
动态调试确认逻辑
既然是 native 方法,通过 IDA 分析这几个也是导出方法,这里 hook 的方法就很多了。
我们直接用frida hook
看下出入参看看是不是符合我们在上一部分的猜想
先看encrypt
function hook_encrypt(){ Java.perform(function () { var ScEncryptWall = Java.use('包名.类名'); ScEncryptWall.encrypt.implementation = function (str1,str2,str3) { console.log('str1: ', str1); console.log('str2: ', str2); console.log('str3: ', str3); var res = this.encrypt(str1, str2, str3); console.log('res: ', res); return res; } }) } setImmediate(hook_encrypt)
通过hook
可以得到以下结果
str1 = 请求的 url str2 = 请求提交的参数(明文) str3 = 空
返回的结果就是加密好的参数了
同样的hook decrypt
function hook_decrypt(){ Java.perform(function () { var ScEncryptWall = Java.use('包名.类名'); ScEncryptWall.decrypt.implementation = function (data) { console.log('data: ', data); var res = this.decrypt(a); console.log('res: ', Java.use('java.lang.String').$new(res)); return res; } }) } setImmediate(hook_decrypt)
打印结果如下
参数是请求的返回值,解密的结果是列表页的内容
完事~,Python RPC 调用一下就可以爽爽的采集相关的文章了
好了,以上就是今天的全部内容了。
我是没有更新就在摸鱼的咸鱼
收到请回复~
我们下次再见。