天天看点

逻辑分析_某数4代逻辑分析

逻辑分析_某数4代逻辑分析

声明:本文内容仅供学习交流,严禁用于商业用途,否则由此产生的一切后果均与作者无关,请于24小时内删除。

1,前提:

    1.1 本期内容分为文章和视频两部分,视频是对文章内容的重现及扩充(打字也太多了,还是让我在视频里多说点吧),视频今天或明天会发布到公众号里,所以欢迎大家关注一波我的公众号哦。

    1.2 本文及视频,都会基于反混淆的代码,这样有助于大家对整体流程认识的更直观,一张截图就能截取很多逻辑,如果用原js文件,一张截图只能截取if else混淆中的一个语句,太不友好。

    1.3 如何使用我分享到github上的反混淆文件辅助调试下文及视频也会讲的,当然你用原js文件调试也是可以的,变量名不一样,但js语句的执行顺序都是一样的。

2,分析某数4代请求

    2.1 先响应状态码202返回一个页面,只有js逻辑,并有***S的set-cookie

    2.2 上一步返回的页面生成cookie ***T

    2.3 携带***S和***T的两个cookie可访问到响应状态码200的真正页面

    2.4 我们主要关注cookie ***T怎么生成的

3,首页js逻辑 -- 详讲

    3.1 首页控制流程由下图中_$iV的数组控制(每次访问变量名称都会变化,但整体逻辑不变,本文中我提到的变量名都只限我的截图中,下文不再提这一点)

逻辑分析_某数4代逻辑分析

    3.2 方法定义略过,到了第一部分,定义了一些变量,然后主流程进入下一层混淆,如图

逻辑分析_某数4代逻辑分析

    3.3 第二层混淆中的逻辑就是往一个对象里绑定了些参数,这个对象的参数会在eval中用到。具体怎么用的下文或视频里讲。主要逻辑如下面三图:

        3.3.1 第二层混淆主流程:

逻辑分析_某数4代逻辑分析

        3.3.2 每两个字母为一组,切分为数组保存到对象的_$ds上,

逻辑分析_某数4代逻辑分析
逻辑分析_某数4代逻辑分析

            3.3.3 定义一些属性

逻辑分析_某数4代逻辑分析

    3.4 主流程进入第三层混淆,

    这一块的主要逻辑就是用c.FxJzG50F.dfe1675.js 这个文件里的那一长串字符生成出eval用到的字符串,下图中还可以看到其中有点时间校验以及var _$nc = _$ML(71); 检验eval有没有被hook,就这些东西。

逻辑分析_某数4代逻辑分析
逻辑分析_某数4代逻辑分析

    3.5 接下来主流程进入第四层混淆

    就是直接拿着3.4中生成的字符串用eval运行,中间他还对ie引擎做了下适配,execScript那个。

逻辑分析_某数4代逻辑分析

    3.6 至此,首页逻辑完成。我们这次讲到eval里生成完第二次cookie,所以先不需要关注后面的逻辑。

4,如何使用我分享到github上的反混淆文件辅助调试

    4.1 github地址:

https://github.com/chencchen/webcrawler
           

    4.2 借助于fiddler的AutoResponder功能,拦截到指定请求后直接返回本地文件

AutoResponder使用介绍:https://blog.csdn.net/yu1014745867/article/details/72843259
           

    4.3 call的地方,随便发一个请求,用AutoResponder将eval解混淆的代码获取到,再eval执行获取到的反混淆代码,使用的代码及修改示例图如下:

var result = null;var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {    if (xhr.readyState == 4 && xhr.status == 200) {        result = xhr.responseText;    }}xhr.open('GET', 'http://www.fangdi.com.cn/eval_decrypt', false);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send();result = result.replace('debugger;', '/*debugger;*/');
           
逻辑分析_某数4代逻辑分析
逻辑分析_某数4代逻辑分析

5,第一次生成cookie的逻辑 -- 详讲

    5.1 这次我们就不一步一步走了哈,因为生成cookie前的步骤有些多 [捂脸],我们直接定位到生成cookie的地方就好了,然后再往回扣代码,缺啥补啥。

    5.2 定位cookie生成的地方,方法很多,我这里提出没有反混淆文件情况下的两个方案

        5.2.1 二分法打断点,然后document.cookie查看目标参数有没有生成,这样很快就能锁定位置

        5.2.2 hook cookie的赋值,也可以直接断到cookie赋值的地方。我用的第一种,所以第二种我也没有,就不上demo了,也欢迎有的老哥给我发一份,十分感谢,哈哈。

    5.3  然后我们就定位到了如图位置,搜"(5);"可以快速定位,var _$lK = _$ZL(5);生成第一次cookie(无效),_$J_(768, 1);生成第二次cookie(我们本文的目标)

逻辑分析_某数4代逻辑分析

    5.4 第一次生成cookie细节

        5.4.1 进入_$ZL方法,可以看到继续向下调用

逻辑分析_某数4代逻辑分析

        5.4.2:进入_$d6方法,本处需要前面代码去找,参数_$1T实际就是首页中meta,然后被图中逻辑分割为字符串数组, 外部就可以通过_$d6方法获取这个数组的元素了。中间用到了两个外部定义的变量:_$x0._$q3和_$XP(_$lK);中的_$x0._$65,在3.3.3处定义的。这两个变量名称是变化的,但是在外部的出现索引是不变的。看3.3.3的图,一个在第一个,一个在第三个,所以取这两个值可以在这个规律上取。

逻辑分析_某数4代逻辑分析

        5.4.3 接下来我们回到上一层,再进入_$dW方法看看,这个方法中_$fG(2, _$d$(9))暂时没用,后文有用但可以写死,所以直接忽略。

逻辑分析_某数4代逻辑分析

        5.4.4 然后我们看_$p3(_$1T)方法,

逻辑分析_某数4代逻辑分析

_$p3里我们要关注一下_$HH这个方法,里面有6个数组是eval开始时定义的,就是_$jQ,_$1w那几个,我们需要提前生成一下。

逻辑分析_某数4代逻辑分析

_$p3里其他的js语句就是就是一系列的数组运算,不涉及外部变量,直接copy出来就好。

        5.4.5 然后回上一层,再看最后一个函数_$1j以及该函数最后面的_$MS,还是不涉及外部变量的一系列数组运算,继续直接复制出来。

逻辑分析_某数4代逻辑分析
逻辑分析_某数4代逻辑分析

        5.4.6 至此,第一次生成cookie的逻辑就完成了

6,第二次生成cookie的逻辑 -- 分享一下各个方法都干了啥

    6.1 总生成逻辑

逻辑分析_某数4代逻辑分析

    6.2 各步注释

function _Rshu_5_747(_Rshu_2614, _Rshu_2615, _Rshu_2616, _Rshu_2617) {    var _Rshu_2650 = _Rshu_557(_Rshu_561());    // 读取ts对象中的值某些值    var _Rshu_2651 = _Rshu_5_709(709, _Rshu_2650);  // 假cookie转数组 有时会返回空(可能时间过长)       // 到此处_Rshu_2651应与浏览器生成一致,下面的会有时间戳或random,能变化    var _Rshu_2652 = _Rshu_2651[1];    _Rshu_2663 = _Rshu_2652 === '';    if (!_Rshu_2663) {    } else {        return;    }    var _Rshu_2653 = _Rshu_217(); // 时间戳与后台传来的时间计算    _Rshu_2663 = _Rshu_2653 <= _Rshu_508;    if (!_Rshu_2663) {    } else {        _Rshu_2653 = _Rshu_508 + 1;    }    _Rshu_508 = _Rshu_2653;    var _Rshu_2654 = _Rshu_559([_Rshu_2653 / 0x100000000 & 0xffffffff, _Rshu_2653 & 0xffffffff,        Math.floor(_$f1 / 1000), Math.floor(_$Nu / 1000)]); // 数组运算    var _Rshu_2655 = _Rshu_5_268(268, _Rshu_2615); //检测参数及浏览器特征    _Rshu_2651 = _Rshu_2654.concat(_Rshu_510, _Rshu_2655);  // 拼接    var _Rshu_2656 = _Rshu_540(_Rshu_2652.concat(_Rshu_2651)); // 数组运算    for (_Rshu_2660 = 0; _Rshu_2660 < _Rshu_506 + 1; _Rshu_2660++) {        _Rshu_2652[_Rshu_2660] ^= _Rshu_2656;    }    var _Rshu_2644 = _Rshu_5_685(685, _Rshu_2650);  // 数组运算    var _Rshu_2647 = _Rshu_618(_Rshu_2651, _Rshu_2644); // 数组运算    return _Rshu_509 + _Rshu_474(_Rshu_2652.concat(_Rshu_2656, _Rshu_2647)); // 生成cookie}
           

    6.3 第二次cookie生成比第一次复杂了些,靠文章来讲述工作量有点大,所以文章先写到这,我在视频里再通过调试和大家说说吧。

7,xhr后面的参数是如何被添加的及生成逻辑介绍,下篇文章再写。

如果本文对你有帮助,欢迎请作者喝杯咖啡哦。

逻辑分析_某数4代逻辑分析

继续阅读