从0开始逆向分析一个app 某点小说

原创 已于 2023-12-11 19:44:38 修改 · 2.1k 阅读 · 9 · 13 · CC 4.0 BY-SA版权 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 文章链接:https://blog.csdn.net/blackblackblack223/article/details/134725402

前置条件

1.首先我们假设已经搭建好了抓包工具 charles 2.并且有一个可运行的虚拟或者真实设备 获取root权限,同时安装了adb 3.选择一款hook工具 此处选择frida 以上没有达成的可以找我历史文章

选择一款应用 某点小说

某小说应用为案例 比如我们想看小说的基本信息 去应用商店下载并且安装app到模拟器(优先低低版本 容易分析) 在这里插入图片描述

分析接口以后发现可以抓包但是没有数据

通过配置postern+charles可以解决这个问题 charles这么配,走socks5 在这里插入图片描述

然后模拟器装postern 在这里插入图片描述

可以抓到我需要的请求数据包了

在这里插入图片描述

开始hook app

但是启动客户端frida需要知道应用的包名

此处有一个命令adbshell 进入手机命令行 dumpsys windowwindows|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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇