吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14308|回复: 30
收起左侧

[Android 原创] 5种萌新技巧定位APP_SIGN代码

[复制链接]
LoLik 发表于 2020-5-8 01:56
本帖最后由 LoLik 于 2020-5-10 14:14 编辑
我又来了
但贴没写完,更新(2/5)
一天水一个小技巧.
(因为写帖子很累,怕自己懒坏了,先发出再更,
保证绝不太监!虽然有的技巧我还没编好...)

准备面试,断更一段时间 (手动狗头)

.

目录

  • (0)问题是什么?
  • (1)精准式HOOK
  • (2)地毯式HOOK
  • (3)字符串搜索技巧
  • (4)全局LOG大法
  • (5)组合方法

.

0 问题是什么?

我们萌新在搞逆向时都有一个尴尬问题,
找不到SIGN方法!找不到类似问题的关键代码!
在茫茫代码中乱搜一通,可怜弱小又无助,

所以就打算水这一贴,尝试专门记录这个问题,
理论+实战,找一些方法,
在海量代码中定位SIGN或其他关键代码,

我也在学习摸索中,
争取在这个老生常谈的问题里,
每种姿势都写出点新花样来.
(但基础上,还是懂一定的开发)

.

1 精准式HOOK

(1)理论

对于开发者的习惯,通常来说,他们会用一组惯例API,去构造SIGN的字段组合,

例如把账号/密码/设备指纹等信息,以KEY-VALUE的形式放在一个MAP中,
例如用StringBuilder把一段一段String合成一个串,再算SIGN,HTTP SOCKET发包.

所以得到关键结论:
SIGN前会调用Map.put(),调用StringBuilder.append(),SIGN后会调用网络相关类包.
这个Map和StringBuilder很大可能在SIGN方法或同一类中,
通过查看他们的调用栈,就能找到SIGN.

思路是这样的:
hook sign必出现的API ----> 输出API调用栈 ----> 在栈信息将公共类库排除---->剩下的哪个方法像就去看哪个

最常见是Map.put(key,value) StringBuilder.append(&key=value).
利用该惯例,我们以XX书的APP为例,对关键API,进行针对性的HOOK实战测试.

.

(2)实战(X红书APP)

光说不练假把式,
这里以商业APPX红书APP为例,
分析的开始是用Charles,
先抓一个电话号密码登陆的POST包.

1.png

2.png

编写FRIDA HOOK JAVA MAP并输出KEY VALUE的脚本,
把APP停在登陆界面,
随便输一个账号密码但是不点登录,

先运行该脚本,再点击登陆按钮,
等APP出现号码错误的反馈后,
在终端立刻运行exit退出FRIDA,
看输出了什么内容.

直观的就看到了POST包中的各个字段关键字,
虽然没看见SIGN,但仔细看看下面那个xy-common-params,

3.png

4.png

5.png

联想SIGN的生成方式(SIGN==字段组合串的摘要值)
它应该就是SIGN前的字段组合了,这部分调用9999999%会相当的接近SIGN关键代码.
这运气真的不错,一上来就蒙对了(你不蒙对怎么拿他水一贴...)

渐入佳境,开始输出更详细的HOOK信息,
尝试通过查看MAP的调用栈去找SIGN生成的代码.
在上面的FRIDA代码基础上稍微修改一下,
这次把调用栈给打印出来
6.png

成功输出了详细信息,
但是傻眼了,没完全法看.
得想个办法,把信息保存到本地,格式化再查看它.
7.png

要写FileStream之类的东西把消息保存到手机吗?
然后再拖到电脑上查看?或者传送到Python?
我知道你们懒,我也很懒,不喜欢学python和别的frida api.

所以这里介绍一个,不写代码直接保存成文件的偷懒方式.
windows上cmder这个终端软件,
可以把所有输出过的命令保存成文件,

按照如图所示勾选log console output选项,
下面填一个日志路径,点保存即可,

这样每次打开一个终端,
就会自动生成一个新的独立的日志文件,
敲过的命令和输出都自动保存在里面.
8.png

9.png

用VSCODE打开日志文件,
根据自己显示宽度选换行或不换行,
可以直观的看日志了.
10.png

stack部分,这换行都没有,还是没法看.
不要慌,下面把stack这部分字符串粘贴出来,
扔进JAVA里,写一句helloworld级别的代码,
就可以看了.
11.png

12.png

怎么样?
佩服不佩服我的偷懒技术?
不写代码就把这个调用栈给格式化可视化了.
有水友要问了,费了半天力气,这东西有什么用?

大家不要慌.听我说(手动狗头)
这个SIGN代码, 99999%逃不出这MAP.PUT的调用栈,
别看他栈很深,排除掉那种okttp和java的公共代码,
剩下的用户类没有几个,
挨个翻一下就能找到了,稳住.

13.png

去掉okhttp 去掉java.util,剩下13个类,
接下来挨个看一遍,就完事了.

什么?要看代码?好难,想偷懒.
知道你们懒,我也很懒...
这里介绍一个不用看代码的方法,

其实只要看代码顶部的导包,
有没有例如
import java.util.LinkedHashMap;
import java.util.Map;
有没有出现map就行了,没有的话直接看下一个.
14.png

当你感到绝望,却坚持到底,
搜到com.xingin.skynet.g.b.intercept的时候,
会惊声尖叫,谁是最可爱的代码?是他是他就是他.
15.png

16.png

17.png

18.png

到这里,这个四两拨千斤精准HOOK定位SIGN的实战就结束了,
还有一些要补充下,为什么不在JS里通过代码,把日志文件保存到手机?
其1,因为要介绍点不一样的技巧,
其2,萌新写多了代码会出BUG,不写或者少写就解决问题,美哉.
其3,萌新想偷懒,不想学更多FRIDA_JS_API和Python.
其4,公共API调用频繁,尤其是String等类包,
在大型商业APP中,HOOK几个公共API类以后,
只是输出参数都可能会卡,python send()也很卡.

.

2 地毯式HOOK

(1)理论

飞机的地毯式轰炸相信大家都很了解,
那地毯式HOOK是什么呢?

今天小编就来帮助大家了解一下它到底是什么?
地毯式HOOK就是利用敏捷工具FRIDA开发成本低的特点,
在搜字符串迷茫,精准HOOK不理想的情况下,另外一个选择,
大范围的HOOK含有一部分关键词的类包,通过大面积的轰炸砸中SIGN方法流程.
以上就是它的含义和出处,希望小编精心整理的这篇内容能够解决你的困惑,
对此,你有什么看法呢?欢迎在评论区下方留言.
对不起,串戏了...
Snipaste_2020-05-08_20-59-37.png

言归正传,
地毯式轰炸需要飞机和足够的炮弹,
地毯式HOOK也需要趁手的武器,
方便我们指哪打哪,在哪画个圈,就轰炸哪,
FRIDA是个基础类库,功能还需要组装封装一下,
可以使用任何类似obection,zenTracer,r2frida的工具,
或者做一个类似的东西,工具的事情不做太多探讨,
重点放在思路和过程原理,
这里前提假设我们现在有了这种一键HOOK的东西,
用它来展开分析.

功能:
轰炸机.png

.
分析思路与使用过程:
思路.png

.

(2)实战(喜马X听书APP)

0 抓包看字段

抓包.png

1 统计模糊关键词
sign account login都是常见的关键词,
实战用什么词要自由发挥,

确定了大致的关键词后,
使用AS_PROFILER_TRACE或者OBJECTION等工具,
看一个APP运行时内存中,
是否含有这样字段的类包

这里用OBJECTION为例,
内存中搜索,
确认是否含有带这几个词的类.

2 obj命令.png

1 obj搜类.png

2 确定具体的类包名关键词
OBJECTION的输出比较多,
不方便在终端控制台里查看.

通过官网的说明,
找到了他日志文件的路径,

编辑器打开OBJECTION的日志文件,
查看运行命令的输出内容,
然后观察统计出公共前缀包名类名.
3 obj日志路径.png

4 obj日志.png

.

3 将统计出的类包名,添加到一键HOOK工具的配置文件中,开始对他们HOOK.
比如你设定的前缀是"com.ximalaya.ting",
那么所有包含这个前缀的包名类名,
就全部被HOOK,简单粗暴.
5 hook器配置文件.png

大概是这样运行的,代码写的不优雅,具体不献丑了.
工具大致.png

4 触发HOOK,获得日志信息
这里最终大概HOOK到一万个方法,
接着点击登录按钮,触发HOOK回调.
HOOK数.png

输出了两个版本的日志,
一个没有栈版本的,方便看流程
6 简约LOGER.png

一个有栈版本,方便看调用序列
7 详细栈LOGER.png

.
5 通过日志的输入输出调用序列等信息的辅助,定位SIGN位置.
现在有了HOOK回调日志,可以分析了.
先回头看一眼抓包的sign特征,
40个16进制字符,也就是20个字节,
有经验的大佬肯定已经猜出了SIGN用的摘要方法是什么,不过这是后话,

接着做定位的事情,
把日志文件用NotePad++之类的打开,
用搜索的正则功能,搜40字符的16进制数,
看谁的返回值匹配上这个特征.
效果不错,直接定位到SIGN方法.
8 正则1.png

8 正则2.png

9 定位到方法.png

.
实际上也可以不用正则,
把抓包和跑HOOK日志同时进行,
把POST的SIGN值直接粘贴,
拿到日志文件里搜看谁的返回值匹配.

或者不搜,直接看翻一翻日志,如果没有做名称混淆,
也许能直接看出来谁是SIGN方法,
根据跑HOOK的效果来自由发挥.

言归正传,
接着刚才的分析,
看到底是不是SIGN方法,

问题是APK有许多DEX,
现在要确定下getLoginParamSign在哪个DEX文件中,

因为楼主的电脑太破了,APK都扔进JEB跑不动,所以要想个办法,
这里使用某个github大神开发的dexfinder工具,
跑出了它在哪个DEX,
感谢这位作者.
10 class finder.png

拖进JBE搜搜,
验证了分析成果,
它果然是我想要的SIGN方法,
不过他是一个C++的函数.
11 JEB定位代码.png

这里额外说一个有意思的事情,
在HOOK日志中,因为太显眼了,
就在SIGN方法的上面,发现
有一串传递给JCE SHA1的byte[]参数,
SHA1_JCE.png

这东西是啥?
把它粘贴出来放进IDEA JAVA里输出为String,发现就是POST包的字段基础上,
多加了一个MOBILE串
手动用SIGN方法的参数+上这个MOBILE串后转大写字符,
再做一个SHA1,结果就是SIGN方法的返回值,
这下连SO方法都不用看了,蒙出了SO SIGN方法计算过程.
其实只是在SO中用JNI调用了JCE的SHA1而已.
最终串.png

免费评分

参与人数 5吾爱币 +5 热心值 +5 收起 理由
forever丶snow + 1 + 1 大佬什么时候继续更新?
z06260 + 1 谢谢@Thanks!
幼稚范er + 1 + 1 谢谢@Thanks!
windy_ll + 2 + 1 我很赞同!
む人生似梦 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

  • · 好帖|主题: 541, 订阅: 84

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

赤座灯里 发表于 2020-5-8 06:25
本帖最后由 赤座灯里 于 2020-5-8 07:21 编辑
要写FileStream之类的代码把日志保存到手机,
然后在ADB PULL到电脑上查看吗?
我知道你们懒,
我也很懒,
.
.
所以这里用一个不写代码的偷懒方式.
windows上cmder这个终端软件,
可以把所有输出过的命令保存成文件,
然后按照如图所示勾选log console output选项,
下面填一个日志路径,点保存即可,
这样每次开一个终端,就会在路径下生成一个新的日志文件.

不知道意义何在。
数据用send发给python后能直接保存到电脑,不然为何用frida?frida精髓之一就是与pc端互联互通。

不调send()回传PYTHON,那个操作好像更卡.

卡只能说没做过滤器。不过滤任何操作都会卡
 楼主| LoLik 发表于 2020-5-8 10:14
赤座灯里 发表于 2020-5-8 06:25
不知道意义何在。
数据用send发给python后能直接保存到电脑,不然为何用frida?frida精髓之一就是与pc端 ...

已经重新编辑,好好说明了
wanglinok 发表于 2020-5-8 06:04
余佳卓 发表于 2020-5-8 06:37
感谢楼主
c66d88 发表于 2020-5-8 07:14
文章是好,可是必需要先学会C话言,不然简直就是天文数字

a59322 发表于 2020-5-8 08:53
已看完,思路可以。
WX2886 发表于 2020-5-8 09:00
萌新表示看不懂
头像被屏蔽
xiguazhi 发表于 2020-5-8 09:03
提示: 作者被禁止或删除 内容自动屏蔽
凌晨四点半 发表于 2020-5-8 09:10
学到东西了
mokson 发表于 2020-5-8 09:31
大神级别,无法理喻。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 17:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表