原本是不想写的,因为这个APP的这个版本其实很简单,后来想了下觉得还行记录一下吧。主要是记录每一次逆向能加深其中学到的知识点内容。也算是给自己一个交代,无论以后还是菜鸡也好还是成了大牛也罢,至少这一刻我没有虚度。
APP:易班
版本:5.0.5
使用到的工具:Frida、adb、jadx-GUI、Fiddler、MDEX、Xposed、MT管理器、逍遥模拟器
安卓版本:7.1.2
目标:实现账号密码登录
一、先抓包分析API接口
可以看出来是个post请求,加密的请求分析下来发现都在data里面。
其实加密的就两个地方,一个是password,一个是sig。
下一步就是放到jadx中,但是因为这个APP加壳了,所以应该是先脱壳
二、脱壳
我是用工具MDEX脱壳的,需要安装Xposed。
具体怎么说呢……非要写笔记还真不好描述,就是把APP和MDEX下载好,然后脱壳,再到指定路径把文件拷贝出来,然后再把脱壳后的dex文件从手机拷贝出来弄到电脑本地,再拖到jadx中就OK了。
三、Java层分析加密
这里接下来的查找逻辑其实和JavaScript逆向的逻辑就比较类似了,先Ctrl+F找一下子。
这里不限于password、什么login这些都可以,这个我就不细说了,因为这个问题细说就很无聊了。总之接下来我找到了这里
怎么说,还能怎么说……
String encryptPassword = EncryptionHelper.encryptPassword(str2);
双击encryptPassword进入
就到了这里。
private static final String TAG = "EncryptionHelper";
private static final String key = "yibanEncryPlugin";
private static final String transformation = "RSA/None/PKCS1Padding";
public static String encryptPassword(String str) {
return new String(EncryptUtils.encryptRSA2Base64(str.getBytes(), base64Decode(JNIHelper.getEncodePwdPublicKey().getBytes()), 1024, transformation));
}
RSA的加密赫然在眼前,还能说什么,找JNIHelper.getEncodePwdPublicKey().getBytes()是什么,也就是找加密的私钥是什么东西。这里至少需要知道RSA加密的基本逻辑和原来。
这里的找不是真的让你肉眼去找,而是frida hook。
如果直接hook ,hook出来的是一串数字,纯一串int类型的数字,这个不能直接用,具体怎么转换完了再写博客详说。
我从网上找了个直接hook RSA原生的语句,运行之后就直接hook住了他的str类型的秘钥。
至于sig这个参数,我发现这个版本其实不用也OK,这让我惊喜又意外的。
所以现在就可以直接把密码加密发送请求试试了。
然后这样就成功了。
另外,我这边版本好像现在登录不了了,不知道为什么,我已经学到了我想学的东西,至于其中的原来嘛,或许换个高版本的就可以了。