android reverse
基础
如何判断apk文件是32还是64:
ARM 32位对应的是armv7架构、armv6架构、armv5架构
ARM 64位是armv8架构
常用的abi:
armeabi: armv5架构和armv6架构 (32位)
armeabi-v7a:armv7架构 (32位)xxx
armeabi-v8a:armv8架构 (64位)
x86:x86架构 (32位)
x86_64:x86_64架构 (64位)
签名:
签名的算法一般用消息摘要算法(不可逆)
md5、、、
签名的源数据一半来自于数据包
签名之前对源数据进行排序,头尾可能会有固定字符串
常用方法与流程
1.一般会先抓包,分析参数名,查看待会逆向分析需要找哪些字段
2.抓包细节:清除缓存、cookie等
3.DevicesId的处理细节:找出关键请求
4.常规手段:
静态分析:搜索链接、参数、算法关键字
Log输出 DDMS 用处:一打开APP就加密了的数据 (也可用hook)
JEB动态调试
通过解密获取参数
APP资源ID
通过定位加密函数解决问题
零散
看到StringBuilder
要找toString
:输出的地方
log输出、匿名管道、smali插桩
smali插桩:大概就是调试代码,插入代码,打印出想看到的东西
1 | 输出byte |
最主要的是理清它的加密思路,适当记录
做算法逆向分析的时候,要结合流量包来看是否可逆验证
**Hook:**顾名思义,就是“钩子”,也称作“钩子技术”,其原理是先将需要修改的函数“钩住”,然后使用自定义的函数替换原函数,让程序在运行时执行自定义函数,从而达到动态修改软件的目的。
拿到一个加密的,也可以先自己试试是否是MD5等
多抓两个同样的包,对比一下加密后的字段,哪些在改变,哪些没变
然后判断算法:比如分组算法分为对称和非对称
app中的加密方式一般都是相通的,不一定要找登录的,如果登录的太困难,也可以从注册下手分析。
动态调试对比静态分析的好处在于:当一个加密字段由多个参数构成时,jeb动态调试可以直接看到用了哪些参数,然后再回去静态分析
jeb分析时,回溯到类时,要注意是否是重载函数,确定好参数对应的个数
算法分析
案例4:xx合伙人.apk
搜链接:/App/Login/login
搜参数:”apisign”
这个app搜的话,只能搜到这一个位置,所以很确定就是它。
下一步,就是反编译进入分析函数
对比后发现,就是我们抓包得到参数,data=...&apisign=....
代码解释:
1 | label_35: |
目标明确:
1.找到v2的内容,看了一下,应该是好几个字段拼接的(这里可以直接看到)
2.v7拼接后的样子
3.L.json后的v2
v2的内容
L.d("请求参数Params=========", v2.toString());
ddms
抓包就可以看到,v2.toString是什么东西
但是其实自己分析也可以找到,往上回溯,发现很复杂
但是想了一下,这个简单的apk,应该不会这么复杂,而且抓包看到的是明文,说明我可能找的不对
抓包可看到。data的值为:
{"password":"12345678","phone":"12324354523"}
查找data
可能存在的地方,
找了好多地方,都不对,摆烂,放弃。。。。。。
题外话:
这里的v7是一个集合,方便存储
L.d安卓端的一种输出方式
toMD5加密函数
update()可以使用多次
digest()只能使用一次
hook的缺点:
密钥和加密是分开的
有可能抓不到最后的加密结果和初始的明文
RSA_No_Padding四种加密方式:
明文倒序 + {0}
{0} + 明文倒序
明文正序 + {0}
{0} + 明文正序