关于新版高校体育登录请求加密方法的逆向和再破解

标题上为什么说是再破解呢?因为已经有某开源平台上的大牛给我们铺过路了,具体是哪位在这里就不说了,懂的人自然能找到。这位大牛也很久没有更新了,在高校体育的大更之后,原先的登陆方式已经失效了,事实上只要在大牛的项目上稍加修改即可,下面就是关于这部分需要修改的内容,对新版高校体育get请求加密算法的逆向。

抓包

host改成了http://www.sportcampus.cn

GET请求包含了sign,info,mobile,password,type

sign:加密后的32位字符

info:就是下面的uuid

mobile:手机号

password:密码

type:手机型号

(账号密码竟然还是一如既往的明文传输)

GET请求格式还是和以前一样,大牛的代码里也已经分析过了,关键在于加密后的sign部分变了

实际上只要将大牛代码中get方法的参数直接换成抓包抓到的GET请求就可以登录成功,但是因为不知道如何加密所以更换账号就要重新抓包再修改代码,这样复用性太差,而我们要实现的是对任意输入的账号和密码都能登录

解析data格式化

{
	"info": "89FEF6F4589004705139B63C8EAF47BE",
	"mobile": "XXXXXXXXXXX",
	"password": "123456",
	"type": "XXXX"
}

公共Header信息

这里和以前比发生了变化

headers = {
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; FRD-AL10 Build/HUAWEIFRD-AL10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
    'versionCode': '340',
    'versionName': '2.3.15',
    'platform': 'android',
    'xxversionxx': '20180601',
    'uuid': '',
    'utoken': '',
    'BDA9F42E0C8A294ECDF5CC72AAE6A701': '0,0,0,0,0',
    'Host': 'www.sportcampus.cn',
    'Connection': 'Keep-Alive',
    'Accept-Encoding': 'gzip',
}

这个'0,0,0,0,0'不清楚是啥,以前是'1,0,0,0,1'

反编译逆向分析sign的加密方法

首先打开高校体育apk安装包

反编译classes.dex回jar包(app内的java源文件都被编译整合在这个文件中)

打开jar包:

里面的包名并不是高校体育的包名,而是tencent的包名,很明显该app被加了壳,加的是腾讯乐固壳

(这个软件竟然还加壳~~)

脱腾讯乐固壳

由于博主研究过windows平台的壳,因此脱安卓壳相对容易一些,乐固壳加壳原理也很简单,加密原来的dex文件,将app默认启动类修改为乐固壳,再动态解密加载app原来的类

具体的脱壳方式就不详细说明了,论坛里会有一些方法,这里重点讲的是高校体育加密的过程

博主脱出真正的dex文件后反编译打开:

现在的包名是高校体育真正的包名了,各个activity也一目了然

分析LogActivity

LogActivity就是登陆界面的活动了

找到登录按钮的点击事件,箭头所指的部分就是发送GET请求

可以看到sign的值是localObject对象中的sign成员,往上找可以找到

localObject = b.a(localDataUser);

这里混淆了类名和方法名,点进a方法分析

不出所料这个a方法果然是加密方法

加密密匙就不贴出来了,跟以前的一样并没有变化,大牛的代码里也写着。

这里的代码被混淆过了,return下面竟然还写着语句,按理讲应该永远也执行不到,可实际上上面的代码都是混淆代码,没有用,而return下面的代码才是真正的加密方法。

可以看到paramT是传入的参数,博主一开始一直在研究如何通过传入的对象转换为要加密的字符串,后来回头一看发现这句代码

localDataBean.data = paramT;

是的,localDataBean这个对象里的数据就是最终get请求中的数据,而data=paramT,传入的对象经过处理后变成的字符串就是get请求中的data,也就是刚刚的{"info":"89FEF6F4589004705139B63C8EAF47BE","mobile":"XXXXXXXXXXX","password": "123456","type":"XXXX"}

再由上面的localObject = b + "data" + paramT;(b为密钥)可知,被加密的字符串应该为 密钥+"data"+'{"info": "89FEF6F4589004705139B63C8EAF47BE","mobile":"XXXXXXXXXXX","password":"123456","type":"XXXX"}'

找到了被加密的字符串和加密的密钥,只剩加密的方法了

加密方法

继续分析刚刚的方法,有这样一句代码

localDataBean.sign = a((String)localObject);

这个a方法应该就是加密方法,点进去:

是的,很明显这就是MD5加密,其实这个加密算法版本更新后并没有改变,前面大牛的代码里也已经写出来了

我整理成了下面的java代码:

public static String jiami(String oldstr)
	{
		String paramString = oldstr;
		
		Object localObject1 = "";
		try {

			byte[] arrayOfByte = MessageDigest.getInstance("MD5").digest(paramString.getBytes());
			int i = arrayOfByte.length;
			int j = 0;
			paramString = "";
			for (;;) {
				localObject1 = paramString;
				if (j >= i) {
					break;
				}
				Object localObject2 = Integer.toHexString(arrayOfByte[j] & 0xFF);
				localObject1 = localObject2;
				if (((String) localObject2).length() == 1) {
					localObject1 = new StringBuilder();
					localObject1 = "0" + (String) localObject2;
				}
				localObject2 = new StringBuilder();
				paramString = paramString + (String) localObject1;
				j++;
			}
		} catch (NoSuchAlgorithmException e) {
			// TODO: handle exception
		}
		return (String) localObject1;
	}

其实这么多代码用pyhon只需要几行

import hashlib
def jiami(s):
    hl = hashlib.md5()
    hl.update(s).encode('ascii'))
    return hl.hexdigest()

注意这两个方法传入的参数为刚刚的 密钥+"data"+'{"info":"89FEF6F4589004705139B63C8EAF47BE","mobile":"XXXXXXXXXXX","password":"123456","type":"XXXX"}'

修改大牛的代码成功登陆

然后开始自动XXXX(手动 #滑稽)

懒惰推动学习和进步!

都说脱壳容易修复难,博主下面会着手研究修复脱完壳后的apk,并添加一些功能实现在手机上就能实现某些(特殊)功能。

不要留言要东西,溜了~~

(官方就不要和谐了吧吧吧---)

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值