首先找到java层加密的地方,我是通过addheader来寻找到sheile添加进来的
public interface Interceptor {
public interface Chain {
int connectTimeoutMillis();
Connection connection();
Response proceed(Request request) throws IOException;
int readTimeoutMillis();
Request request();
int writeTimeoutMillis();
}
Response intercept(Chain chain) throws IOException;
}
// 向上找发现com.xingin.shield.http.XhsHttpInterceptor
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response;
long currentTimeMillis = ContextHolder.sJavaLogEnabled ? System.currentTimeMillis() : 0;
C25958b bVar = this.predicate;
if (bVar == null || bVar.test(chain.request())) {
response = intercept(chain, this.cPtr);
} else {
response = chain.proceed(chain.request());
}
if (ContextHolder.sJavaLogEnabled) {
String str = TAG;
StringBuilder sb = new StringBuilder();
sb.append("cost");
sb.append(System.currentTimeMillis() - currentTimeMillis);
Log.i(str, sb.toString());
}
return response;
}
public native Response intercept(Interceptor.Chain chain, long j) throws IOException;
通过分析是先后调用initializeNative、initialize、intercept函数,然后使用懒神的脚本,发现initializeNative、initialize、intercept在libxyass.so中,偏移地址为0x73be5、0x73279、0x73465
然后使用龙哥的unidbg脚本运行起来
unidbg调通后打开so,跳到所需的地址中,发现未知的乱码
按ctrl+s
其实有经验的人会知道seg000、datadiv_decode是字符串混淆
然后继续使用懒神的脚本,把so dump出来,然后修复
修复so命令 SoFixer64/SoFixer32 -m [so的base地址] -s [已经dump出来的so] -o [修复后存放的地址]
根据java调用的方法,先查看initializeNative、initialize、intercept方法
0x73be5、0x73279、0x73465
查看每个参数,发现sheild字符串
一个个的慢慢对应,继续看下一个函数initialize,结合unidbg
继续跟进,发现进入sub_CD3C,点进去看到sub_27E48 --> sub_2D078 --> sub_2C388/sub_2CC6C
根据加密的逻辑发现这是一个魔改的aes, 传进device_id, hmac_key,然后查看整个函数返回的值继续观察
接着查看intercept,逻辑主要是用上面aes出来的参数与0x36和0x5c进行eor
然后继续跟进发现是一个魔改的HMAC-MD5,发现会根据aes出来的结果的第一个值来获取不同的表来进行加密,可以使用unidbg hook来更改值
md5-update
md5加密逻辑
然后利用unidbg调试,魔改aes把hmac_key解密出来的值拿去分别与0x36和0x5c进行异或,然后根据魔改aes把hmac_key解密出来的值第一位获取相对应的表去加密md5。
异或0x36加密后
0x5c异或加密后
继续跟踪发现拿第一次加密后的作为这次的四个常量值,并且加密参数是urlpath + urlParam + xy_common_params + xy_platform_info
循环加密后,后面不够64位的补参处理逻辑
就是把剩下不够64位的末尾添加0x80和添加加密出来的第四、五位int,然后在去进行md5加密
继续分析,全部md5后截取前16位字节,然后再函数sub_2C218生成一个异或表,这个函数出来的结果发现就是结果的一大部分
加密函数前面的参数主要逻辑在这里
到这里算法已经完全出来
该算法需要对标准算法有一定的了解,还需要一定基础
本文仅供学习参考,如有问题询问或有需要可留言,或加q 1135534792