app逆向| xhs加密shield

目录

  • [java分析]
  • [编写unidbg]
  • [so分析]
    • [so去字符串混淆和修复]
    • [静态分析和unidbg辅助分析]
  • [算法还原]

⛳️ java分析

首先找到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;

⛳️ 编写unidbg

通过分析是先后调用initializeNative、initialize、intercept函数,然后使用懒神的脚本,发现initializeNative、initialize、intercept在libxyass.so中,偏移地址为0x73be5、0x73279、0x73465

然后使用龙哥的unidbg脚本运行起来

app逆向| xhs加密shield_第1张图片

⛳️ so分析

unidbg调通后打开so,跳到所需的地址中,发现未知的乱码
app逆向| xhs加密shield_第2张图片
按ctrl+s
app逆向| xhs加密shield_第3张图片
app逆向| xhs加密shield_第4张图片

其实有经验的人会知道seg000、datadiv_decode是字符串混淆

so去字符串混淆和修复

然后继续使用懒神的脚本,把so dump出来,然后修复

修复so命令 SoFixer64/SoFixer32 -m [so的base地址] -s [已经dump出来的so] -o [修复后存放的地址]
dunp出来的so

静态分析和unidbg辅助分析

根据java调用的方法,先查看initializeNative、initialize、intercept方法
0x73be5、0x73279、0x73465

app逆向| xhs加密shield_第5张图片
查看每个参数,发现sheild字符串
app逆向| xhs加密shield_第6张图片
app逆向| xhs加密shield_第7张图片
一个个的慢慢对应,继续看下一个函数initialize,结合unidbg
app逆向| xhs加密shield_第8张图片
继续跟进,发现进入sub_CD3C,点进去看到sub_27E48 --> sub_2D078 --> sub_2C388/sub_2CC6C
app逆向| xhs加密shield_第9张图片
app逆向| xhs加密shield_第10张图片
根据加密的逻辑发现这是一个魔改的aes, 传进device_id, hmac_key,然后查看整个函数返回的值继续观察

app逆向| xhs加密shield_第11张图片

接着查看intercept,逻辑主要是用上面aes出来的参数与0x36和0x5c进行eor
app逆向| xhs加密shield_第12张图片
然后继续跟进发现是一个魔改的HMAC-MD5,发现会根据aes出来的结果的第一个值来获取不同的表来进行加密,可以使用unidbg hook来更改值
app逆向| xhs加密shield_第13张图片

md5-update
app逆向| xhs加密shield_第14张图片
md5加密逻辑
app逆向| xhs加密shield_第15张图片
然后利用unidbg调试,魔改aes把hmac_key解密出来的值拿去分别与0x36和0x5c进行异或,然后根据魔改aes把hmac_key解密出来的值第一位获取相对应的表去加密md5。
app逆向| xhs加密shield_第16张图片
app逆向| xhs加密shield_第17张图片
异或0x36加密后
在这里插入图片描述
0x5c异或加密后
在这里插入图片描述
继续跟踪发现拿第一次加密后的作为这次的四个常量值,并且加密参数是urlpath + urlParam + xy_common_params + xy_platform_info
app逆向| xhs加密shield_第18张图片
循环加密后,后面不够64位的补参处理逻辑
app逆向| xhs加密shield_第19张图片
就是把剩下不够64位的末尾添加0x80和添加加密出来的第四、五位int,然后在去进行md5加密
app逆向| xhs加密shield_第20张图片

继续分析,全部md5后截取前16位字节,然后再函数sub_2C218生成一个异或表,这个函数出来的结果发现就是结果的一大部分
app逆向| xhs加密shield_第21张图片
app逆向| xhs加密shield_第22张图片
加密函数前面的参数主要逻辑在这里
app逆向| xhs加密shield_第23张图片
到这里算法已经完全出来

⛳️ 算法还原

根据上面的步骤一步步的还原
app逆向| xhs加密shield_第24张图片
在这里插入图片描述

⛳️ 总结

该算法需要对标准算法有一定的了解,还需要一定基础
本文仅供学习参考,如有问题询问或有需要可留言,或加q 1135534792

你可能感兴趣的:(java,爬虫,python)