学习安卓逆向分析的一个小菜鸟,记录分析的“快乐时光”,小白图个乐,大佬乎喷
分析的APP
铁甲
包名:com.cehome.cehomebbs
版本号:4.1.1.0
最低版本使用:Android 4.4 (KITKAT)
抓包分析
把APP安装到安卓模拟器上后,配置好代理,打开APP发现Charles有抓取到数据
说明该APP没有做代理验证,不需要通过xposed 进行代理检测过滤 也不需要证书校验;
---------------------------------------------------------------------
通过Charles抓包,输入手机号:13888888888,密码:a12345678
获取到login登陆的包 /app/appPersonalCenter/login
通过观看,可以发现,大部分的值都是 系统抓取模拟器信息生成,或者是自己生成的
其中 post的 data 数据是被加密的,并且可以看到内容是被URL编码的
还有一个参数 就是 token 是 加密的
开始反编译分析
打开 jadx-super 进行反编译apk 搜索关键词进行关键点定位
一般来讲 这种post请求,我比较喜欢搜索URL api上的关键词
比方这个 我就比较喜欢用 appPersonalCenter/login 做关键词搜索
勾选上代码选款进行搜索后,搜索到一条信息,很明显这个就是我想要的;
双击进去,发现这里没有我想要看到的数据包请求的地方,说明有其他的地方调用了这个类;
点击这个类,右键查找用例,展现出几个调用了这个类的地方;
在展示出来的地方,我发现了一个关键词 login
那么有可能就是,在这两个调用的地方进行构造登陆包,然后加密的;
点击第一个进去瞅一眼,发现这个地方没有账号密码获取 加密的点;
那么就从第二个地方重新选择进入,诶,在这里就可以发现,在这个函数开始就开始获取
手机号码,并且进行去除空格处理,在获取了密码;
然后判断 两个参数 是否为空,如果不是空就开始进行加密处理;
encrypt(JsonUtils.toJson(replace, obj), "j33$E@GctUXJtVfO")
这个就是加密函数
点击进入加密函数中去看一下,可以很明显的看到这个是一个AES的加密
ECB/PKCS5Padding 的加密模式
"j33$E@GctUXJtVfO" 这个就是加密的key值
JsonUtils.toJson(replace, obj) 这个是要加密的值
进入 这个 JsonUtils.toJson 函数中看一下 是怎么处理这个加密的值
肉眼看就是做把手机号码和密码进行json
果不其然,这个方法仅仅就是对 手机号和密码进行了json而已 没有添加另外的值
那么 username 匹配 手机号 password 匹配密码 通过json化的话 应该是
{
"username":"13888888888",
"password":"a12345678"
}
这样的 ,然后去除空格后,连接起来应该就是这样的
{"username":"13888888888","password":"a12345678"}
然后打开 wt-js 加密库工具进行 加密调试
加密值:{"username":"13888888888","password":"a12345678"}
key值:j33$E@GctUXJtVfO
ECB/pkcs7 模式进行调试
加密结果数据为:
IFD+RH/T0lUJe1CkZ1tKnKl7t6LVF2Vo46CS1QY8NKl2WsQb80Jk1WWgWq3GI/c5Gnq0yRd9eQf6QQkiNAFzgQ==
原来的抓包数据为:
param=
IFD%2BRH%2FT0lUJe1CkZ1tKnKl7t6LVF2Vo46CS1QY8NKl2WsQb80Jk1WWgWq3GI%2Fc5Gnq0yRd9eQf6QQkiNAFzgQ%3D%3D
进行URL解码后:
IFD+RH/T0lUJe1CkZ1tKnKl7t6LVF2Vo46CS1QY8NKl2WsQb80Jk1WWgWq3GI/c5Gnq0yRd9eQf6QQkiNAFzgQ==
可以看到一模一样
那么在这里 这个data 数据中的 加密数据的方式已经解决了,还有一个 token值
针对这个token值的关键代码的定位,我的想法是这样的;
因为token是在请求包构造的时候才出现的,而且搜索token这个关键词的话,估计也会出现很多的代码出现点;
所以可以尝试找一下在请求参数中一些不常出现的一些参数的关键词;
最终我找到一个大部分情况下不常用的关键词 : visitorid
jadx 进行关键词搜索
可以发现,就可以比较精确的找到一个关键点,双击进入查看
然后就可以清除的看到token的参数的构成,也是进行了一次加密
String uuid = UUID.randomUUID().toString();
systemHeader.put("token", AesUtil.encrypt("cehomeapp@" + uuid, "j33$E@GctUXJtVfO"));
并且可以看到,加密前 这个uuid 是通用唯一识别码,每次是随机生成的;
然后在前面加上了 字符串 “cehomeapp@”
然后进入了这个 encrypt的加密函数中,发现,也是一样是一个AES的加密
ECB/PKCS5Padding 的模式
那么就可以直接的进行加密尝试了
uuid 是随机生成的,并且赋值给了 visitorid
那么我们在 之前抓包的数据里面拿到 visitorid的值
0d208b74-718a-4034-a77c-e58b989ac205
aes的密钥是:j33$E@GctUXJtVfO 和原来的一样
并且在前面加上 cehomeapp@ 然后 在进行 wt-js的加密尝试
加密出来的结果为:
TwvNF/q/bEIuzb1qKbJUsgelUJtjSnnq3dwPsBOye+ENMVWkqbtnpRsg9EMf7JO+
抓包的数据结果为:
TwvNF/q/bEIuzb1qKbJUsgelUJtjSnnq3dwPsBOye+ENMVWkqbtnpRsg9EMf7JO+
一样,至此,两个加密数据分析完毕!