前言
这几天莫名其妙的迷上了安卓逆向,好像就是因为前一段时间看了几篇帖子吧。其实,我本身就一直挺喜欢逆向的,以前也玩过安卓逆向但那时候(大概高中吧)的知识储备根本不够就一直搁置了,然后前一段时间无意间看到了几篇帖子直接当场就给我开启了新世界的大门!很快啊!我没有闪!然后这几天我就找个APP开始尝试破解,VIP什么的都成功修改了,但是有个别VIP功能却依然存在限制,在代码中也没找到。于是我想问题可能是出在了联网这块,我也不确定,但还是先抓抓包看一下吧,一抓一看发现全加密了……于是就有了这篇文章
抓包
抓包这块儿我用的小黄鸟,安卓抓包听说非常好用,试用了一下确实如此
示例包,这是获取用户信息的一个响应,可以发现data是经过了加密的
{"time":"2020-11-16 11:46:51","version":"1.0","status":"y","data":"31366e87e29ec31321bab940b0114871175a09579f8ec074b938954ccf765ae389eed08c82c864a66b4df930e7437374e001696486e045fd483c73fc70ef15caa33c9d30773bd8b2157a844fbb175d3ddacbbf00851a21a40987c7e8c96c88554f46730348df6f789e1a145b4317515cca51267d1e40c060d79ce52c5f8684556cfb79ee9c4e18fcb0e49b95f040fadb677930b9b9f7eddeaf252a66f24bf80e92579286edb6b95afc424be81506772e7283a88cdfbce749b3f60f23af182c7d350841138d7ace778c7a497bddab4c2bb79ceffad5fcb97dd36317f99592d00a2c6400e3a7a81ff900756b09ef1c8b279fa3e10c4ac267d62e688e9a8cd90baf8599a162fc01842285aeb651a630b95d6116f9162f930b6add4fc5f278427c79fa3b78b44d8c4a35d1e84e5ff91ebc031b0d5f7c84c839009873a0c4f5a7909fdb4083e6d00db38f16993b6588ee0db26cfbd5cd0fd86988b35878b22b2876aca7a07acddc5404e41db1f09b0c9840355a91a865e8d8b0da52e58d6e5f7e754f5e86ed984c39169d74f7c810bb212d51b4adf142008659a848da82f03b629ab6a484754b2289ea7288612f2be6c18f5a5092065e0a4996ca1d81866ebe388037c67b5fc01062a3d99b0c8d5c5efe162d67ba7a64a14176864e77a24d38a306331771bdab4ad1a63f8f953b9de5924045990da674290266666d710769dda2839ffbebaf2c7d11e56bd5473f3542c2a926fa4e537dc31420c7ef0e48c62563d1a2441d4af605ca4bf53d68c0d44e4c8780c3157151186e9c2bdafcee14767819dede1ae1e1f82620883c79d41349db2df454f301bebccda79fa6275d45a9818ed2ca8a10a0938b99810da842f24ccdcaae03e1477e264338729fcb55ac6b783f1e9f5707bc439423f245af5351adb3bb312068bfd8ccf7dd1508fb064889ba9b1e73a0ad308d573f5db43fd3e70ced8a8e4c70ff67fc0300af78e239e1f0c320c0b47ab7d657c2dfbd62f0fe53865e9a86bc6c8e7405d0309a1a0f8521d39c0960c49ccdb6a36f6dafc1c4048af3b895ed","sign":"1a7cacee5c646fc072b5e291ed315399"}
寻找加解密类
由于不清楚这个是由什么加密的(普遍都是AES,但是我之前修改的时候没看见有加密相关的类,可能是没留意吧),我就随意的在代码里搜了一下data……
然后就找到了这个,看包名bean,我修改VIP时就是在这个包里搞的
分析加解密逻辑
换了个工具,MT管理器不是太好用,我只拿MT管理在手机上做最后的修改打包用,分析什么的还是PC的工具好用。
进入了这个类后可以看到一串贼拉显眼的字符串
“30327A776E637869613969366E316C74”
不出意外的话应该就是关键的key之类的东西
转成Java后
运行逻辑就非常清晰了,因为这个是给请求做处理的类,所以这里的p0就是data,str不出意外的话就是key。
跟入a.b()
确实是AES,这个方法的Cipher用的是加密模式,也就是说这里是加密方法。
在方法中的第二行可以看到p1参数也就是第二个参数被进行了一次处理
byte[] ba = b.a(p1);
跟入b.a()
复现算法
ok,在这里也没有再对key做其他处理了,这里就是最后一层了,接下来要做的就是复现它的算法拿到真正的key
由于smali语言被直接转成了Java那我就直接复制了,但是很快就发现了一个问题。
if ((ilength%2)) {
String sstr = new StringBuilder()+"0"+p0;
ilength = ilength+1;
}
…………
if ((ilength%2))???
应该是转换出错了,只好看smali了
0006可以看到这个if是在判断ilength取余2是否不等于零,不等于零才会执行if块内的代码。
据此补充完整后运行发现substring超出下标了,检查了一下发现代码如果这样写铁定出错。刚开始怀疑是smali转Java出错了,结果仔细对比smali后发现没什么出入了,突然有点怀疑人生了……
换了个工具
刚开始怀疑是smali转Java出错,结果对比smali发现没什么出入,我就开始怀疑是不是工具的问题了。
反编译出错这种事之前也是有见过的,比如:震惊!Java变量重复声明居然能运行?
果断换工具重新反编译
可以发现不一样了,果然是反编译出错了。
CV大法好
接下来果断施展CV大法,很快啊!咔一下我就报错了……解密失败。我大意了啊!再仔细看看,然后我找来了它的解密方法,因为GDA的缘故之前一直没注意到,换了JEB才看到
可以看到,解密时对整个data进行了一次操作
我人都傻了,为啥加密的时候没看到?算了不想了估计请求响应不一样吧。
源代码
再从我之前的项目里扣出来一个加解密工具类,CV几下就有了下面这个
package cn.b0x0;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author SomUrim
* @version 1.0
* @Description 某视频APP通信数据解密
* @data 2020/11/16
*/
public class ShortvDataDecrypt {
private static final String KEY_ALGORITHM = "AES";
//默认的加密算法
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String data;
String key="30327A776E637869613969366E316C74";
String str;
while (true){
System.out.println("输入Data:");
data=scanner.nextLine();
if(!data.equals("exit")){
str=decrypt(data,key);
System.out.println(str);
}
}
}
/**
* AES 解密操作
* @param data
* @param password
* @return
*/
public static String decrypt(String data, String password) {
byte[] ba = keyHandle(password);
try {
//实例化
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
//使用密钥初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(ba, "AES"));
//执行操作
byte[] result = cipher.doFinal(contentHandle(data));
return new String(result, "utf-8");
} catch (Exception ex) { Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public static byte[] keyHandle(String arg5){
int v0 = arg5.length();
if(v0 % 2 != 0) {
arg5 = "0" + arg5;
++v0;
}
int v0_1 = v0 / 2;
byte[] v1 = new byte[v0_1];
int v2;
for(v2 = 0; v2 < v0_1; ++v2) {
int v3 = v2 * 2;
v1[v2] = (byte)Integer.parseInt(arg5.substring(v3, v3 + 2), 16);
}
return v1;
}
public static byte[] contentHandle(String arg6){
if(arg6.length() < 1) {
return null;
}
byte[] v0 = new byte[arg6.length() / 2];
int v1;
for(v1 = 0; v1 < arg6.length() / 2; ++v1) {
int v2 = v1 * 2;
int v3 = v2 + 1;
v0[v1] = (byte)(Integer.parseInt(arg6.substring(v2, v3), 16) * 16 + Integer.parseInt(arg6.substring(v3, v2 + 2), 16));
}
return v0;
}
}
{"id":"61***90","username":"VC***YT","nickname":"祝*宁","phone":"","img":"http:\/\/cdn-img-new.***.com\/media\/headico\/24.enc?ext=.png&_v=2020004&time=1604160000&token=d8969542f2ed9aed7c72956f281844ce","group_id":"","group_name":"游客","balance":"0","sex":"0","group_start_time":0,"group_end_time":0,"share_num":0,"parent_name":"","nickname_updated":null,"account_img":"https:\/\/***.site\/image.php?type=account&username=cdc4ea458ad6561a24fad78d85421e76&ext=.png&v=1.0&_v=20191232","user_tips":"剩余观看次数:0\/8","is_vip":"n","follow_num":0,"fans_num":0,"love_num":0,"post_num":"0","service_link":"https:\/\/t.me\/***","province":"","city":"","country":"","account_password":"****","total_count":"0","ads":null}
解密成功!
来源:freebuf.com 2020-11-17 12:24:46 by: SomUrim
请登录后发表评论
注册