原本是不想写的,因为这个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,这让我惊喜又意外的。
所以现在就可以直接把密码加密发送请求试试了。
然后这样就成功了。
另外,我这边版本好像现在登录不了了,不知道为什么,我已经学到了我想学的东西,至于其中的原来嘛,或许换个高版本的就可以了。
原本是不想写的,因为这个APP的这个版本其实很简单,后来想了下觉得还行记录一下吧。主要是记录每一次逆向能加深其中学到的知识点内容。也算是给自己一个交代,无论以后还是菜鸡也好还是成了大牛也罢,至少这一刻我没有虚度。...
int
RSA
_
padding
_add_
PKCS1
_type_1(unsigned char *to, int tlen,
const unsigned char *from, int flen);
int
RSA
_
padding
_check_
PKCS1
_type_1(unsigned char *to, int tlen,
const unsigned char *from, int flen, int num);
int
RSA
_
padding
_add_
PKCS1
_type_2(unsigned char *to, int tlen,
const unsigned char *from, int flen);
int
RSA
_
padding
_check_
PKCS1
_type_2(unsigned char *to, int tlen,
const unsigned char *from, int flen, int num);
最近遇到一个项目,需要进行
RSA
的验签,
RSA
的密钥为2048位即256个字节长。
上游是先对一个文件进行SHA256做hash,得到32字节的摘要,然后进行填充,填充规则为前面两个字节为0x00,0x01,然后填充全FF,接下来是32字节的摘要数据,这样填充之后的总数据长度为256字节,然后使用
RSA
的私钥对这256字节进行签名,下发下来,下游需要对这个签名进行处理,得到原始摘要,然后跟自己计算的摘要比对,验证通过则合法。
涉及的知识点如下:
一、
RSA
签名算法的填充方式,常用的有如下三种
前一篇文章:http://blog.csdn.net/qq372848728/article/details/78687876int
rsa
_key_encrypt(EVP_PKEY *key, const unsigned char *orig_data, size_t orig_data_len,
unsigned char *enc_data, size_t &enc_data_len
Android
UtilCode是一个功能强大且易于使用的
Android
库。该库封装了
Android
开发中常用的具有完整演示和单元测试的功能。通过使用其封装的API,可以大大提高开发效率。该程序主要由两个模块组成,它们是utilcode(通常在开发中使用)和subutil(在开发中很少使用),但是utils有助于简化模块。
GitHub地址:https://github.com/Blan...
代码如下 使用教程:https://www.bilibili.com/video/av380475343
// ==UserScript==
// @name 一键Hook加密算法
// @namespace By:亮亮
// @version 1.2
// @description 一键Hook Crypto
RSA
几个基本的方法 AES DES 3DES Hmac SHA
// @author lianglian
APP
逆向
和web
逆向
的区别在于,
APP
逆向
是针对移动应用程序的
逆向
工程,而web
逆向
是针对网站的
逆向
工程。
APP
逆向
需要对移动应用程序的二进制代码进行分析和破解,而web
逆向
则需要对网站的前端和后端代码进行分析和破解。因此,
APP
逆向
的难度通常比web
逆向
更高。
在
APP
逆向
中,常见的难点包括反调试、加密、混淆等技术,需要使用一些专业的工具和技术进行破解。而在web
逆向
中,常见的难点包括反爬虫、验证码等技术,需要使用一些爬虫和自动化测试工具进行破解。
总的来说,
APP
逆向
和web
逆向
都需要一定的技术和经验,但
APP
逆向
的难度和复杂度更高。