原本是不想写的,因为这个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 逆向 的难度和复杂度更高。