标题上为什么说是再破解呢?因为已经有某开源平台上的大牛给我们铺过路了,具体是哪位在这里就不说了,懂的人自然能找到。这位大牛也很久没有更新了,在高校体育的大更之后,原先的登陆方式已经失效了,事实上只要在大牛的项目上稍加修改即可,下面就是关于这部分需要修改的内容,对新版高校体育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,并添加一些功能实现在手机上就能实现某些(特殊)功能。
不要留言要东西,溜了~~
(官方就不要和谐了吧吧吧---)