某数4代逻辑分析 上 Web逆向 原创

Nanda 1月前 1895



声明:本文内容仅供学习交流,严禁用于商业用途,否则由此产生的一切后果均与作者无关,请于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的数组控制(每次访问变量名称都会变化,但整体逻辑不变,本文中我提到的变量名都只限我的截图中,下文不再提这一点)



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



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


        3.3.1 第二层混淆主流程:


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


            3.3.3 定义一些属性


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

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



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

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



    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/7284325


    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;*/');


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(我们本文的目标)


    5.4 第一次生成cookie细节


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


    5.4 第一次生成cookie细节


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



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



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


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

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


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

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


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


    6.1 总生成逻辑


    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后面的参数是如何被添加的及生成逻辑介绍

最新回复 (70)
  • wlwlove520 1小时前
    0 71
    66666
  • Dapan 4天前
    0 70
    666666
  • 0 69
    666
  • 0 68
    111
  • ssf 5天前
    0 67
    66666
  • wlbksy 6天前
    0 66
    tttt
  • 0 65
    6666
  • 0 64
    看一下
  • wangyp 11天前
    0 63
    6666
  • 1405023509 12天前
    0 62
    学习一下
  • jruihe 18天前
    0 61
    666
  • xiii_up 18天前
    0 60
    666
  • Vico 20天前
    0 59
    6666
  • 0 58
    666
  • henry 25天前
    0 57
    我来看看
  • cocal 26天前
    0 56
    大佬666
  • 0 55
    nb
  • ch 28天前
    0 54
    666
  • 0 53
    kk
  • guojing 29天前
    0 52
    666666
  • 熊god 1月前
    0 51
    nb
  • nice 1月前
    0 50
    666666
  • fishbone 1月前
    0 49
    6
  • karec 1月前
    0 48
    66
  • winya2f 1月前
    0 47
    6666
  • 化肥 1月前
    0 46
    6666666
  • yzr 1月前
    0 45
    66666
  • 0 44
    666
  • cc 1月前
    0 43
    666
  • 0 42
    66
  • 0 41
    666
  • ayixi 1月前
    0 40
    666
  • hewcb 1月前
    0 39
    66666666666666666666666666666
  • MuggleK 1月前
    0 38
    666666666666666666666666
  • haonit 1月前
    0 37
  • Tiddy 1月前
    0 36
    666666666
  • haifeng 1月前
    0 35
    6666
  • fly_sky 1月前
    0 34
    666
  • 123 1月前
    0 33
    好文.
  • 0 32
    666
  • 1月前
    0 31
    大佬666
  • 0 30
    66666666666666666
  • franky 1月前
    0 29
    666666
  • 0 28
    666666666666
  • 0 27
    666
  • rezalt 1月前
    0 26
    大佬牛逼
  • 0 25
    66666
  • 0 24
    6666666666
  • vlinz 1月前
    0 23
    666
  • harvey 1月前
    0 22
    6666
  • 0 21
    666
  • zjy6622 1月前
    0 20
    666666
  • yuhaner 1月前
    0 19
    666
  • 0 18
    6666
  • 0 17
    nb
  • doyus 1月前
    0 16
    666
  • 0 15
    666666666666
  • mark_001 1月前
    0 14
    11
  • wlh 1月前
    0 13
    1
  • charli 1月前
    0 12
    nb
  • dawn 1月前
    0 11
    m
  • zcy 1月前
    0 10
    6
  • 0 9
    66
  • 0 8
    666666666
  • arbrad 1月前
    0 7
    arbrad 大佬公众号是啥?
    找到了 在第一张图片里 。。。。
  • arbrad 1月前
    0 6
    Nanda 那就关注一下我的公众号哦,接下来我就要从最最基础开始,写几篇ast的文章了,一直写到出一个反ob混淆的成品。
    大佬公众号是啥?
  • arbrad 1月前
    0 5
    66666
  • Nanda 1月前
    0 4
    lol_olo 还是不清楚大佬们是如何一步步用ast的
    那就关注一下我的公众号哦,接下来我就要从最最基础开始,写几篇ast的文章了,一直写到出一个反ob混淆的成品。
  • lol_olo 1月前
    0 3
    还是不清楚大佬们是如何一步步用ast的
  • 0 2
    nnnnnnnnnnnnb
返回