某某新闻逆向分析
北海 发表于 广东 技术文章 959浏览 · 2024-12-09 02:38

本文仅做技术分析交流

正文

刷新一下页面抓取请求新闻的包


发现sn和st这两个参数会改变,且不能随意修改


一旦乱改后就失效了

下面来分析一下这两个参数的生成

直接将apk拖到jadx,发现加壳了,这个一眼钉帧是腾讯加固了

用apk messenger 查看一下发现没错

先脱壳,使用blackdex
https://github.com/CodingGay/BlackDex/releases
修改一下存储路径


点击一下要脱壳的包就好l

完成后就可以看到存储目录出现了脱出的dex


使用adb pull出来,全部拖到jadx中

尝试搜索关键字"sn=",逐个查看发现大概率与想要分析的sn,st有关的位置

hook确认一下
hook代码如下

function hook_a() {
    Java.perform(function () {
        var bmzClass = Java.use('bmz$a');
        bmzClass.a.overload('boolean').implementation = function (z) {
            var result = this.a(z);
            console.log("result=================>", result);
            return result;
        };
    });
}
setImmediate(hook_a);

对比发现就是这个地方生成sn,st了

下面来分析st,sn的生成

可以看到st=后面连接了str, 而str就是通过时间戳和随机数求和生成的。

接着看看sn,可以看到给sn添加值的时候调用了a方法,传入了str和一个布尔类型,点击跳转到a函数查看函数定义。this.f2266a是参数gv后的也就是版本号7.38.0

hook一下这个a函数,打印一下z,this.e,this.j,this.c和this.l这几个变量属性。
代码如下:

function hook_a2() {
    Java.perform(function () {
        var BmzClass = Java.use('bmz$a'); // 确保这里使用了正确的类名和包名
        BmzClass.a.overload('java.lang.String', 'boolean').implementation = function (str, z) {
            // 打印字段值
            console.log("z====> " + z);
            console.log("this.e====> " + this.e);
            console.log("this.j====> " + this.j);
            console.log("this.c====> " + this.c);
            console.log("this.l====> " + this.l);
            var result = this.a(str, z);
            return result;
        };
    });
}

发现传入的布尔类型z是false,所以str3是"",this.e为"ifengnews" ,this.j为2964, this.c为"v0012czN2YDMwM2Y4QGM2ITN40AZgfr3r340gf" this.l为"", 猜测这些在同一台设备上大概率是不变的

查看后面使用的readMD5Key,发现它是native层的函数

把ifeng_secure库搞出来

ida反编译然后搜索readMD5key


由于readMD5key是jni函数,可以把参数类型改为JNIEnv,方便观察。可以看出这个函数是把"acF%#{_b1mQt@..ifvy"作为java字符串返回。这个猜测应该是

最后我们跳转到ces.b,这个函数就是标准的md5


这样,st和sn的生成过程就已经弄清楚了

最后来总结一下:
st是通过时间戳和随机数进行拼接生成的
sn是先将this.f2266a this.e, this.l, this.j, this.c, sn, str3 和MD5key进行拼接,然后求md5值而成的

1 条评论
某人
表情
可输入 255
目录