126回答

7收藏

某数4代逻辑分析 上

信息分享 信息分享 25075 人阅读 | 126 人回复 | 2020-11-30










声明:本文内容仅供学习交流,严禁用于商业用途,否则由此产生的一切后果均与作者无关,请于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后面的参数是如何被添加的及生成逻辑介绍

下篇文章再写。哈哈哈,就是这么突然,大家别忘了去公众号关注、点赞一波哦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
回复

使用道具 举报

回答|共 126 个

我想两颗西柚

发表于 2020-11-30 15:52:22 | 显示全部楼层

nnnnnnnnnnnnb
回复

使用道具 举报

lol_olo

发表于 2020-11-30 15:53:45 | 显示全部楼层

还是不清楚大佬们是如何一步步用ast的
回复

使用道具 举报

Nanda

发表于 2020-11-30 15:55:31 | 显示全部楼层

那就关注一下我的公众号哦,接下来我就要从最最基础开始,写几篇ast的文章了,一直写到出一个反ob混淆的成品。
回复

使用道具 举报

arbrad

发表于 2020-11-30 15:59:48 | 显示全部楼层

66666
回复

使用道具 举报

arbrad

发表于 2020-11-30 16:02:25 | 显示全部楼层

大佬公众号是啥?
回复

使用道具 举报

arbrad

发表于 2020-11-30 16:04:04 | 显示全部楼层

找到了 在第一张图片里 。。。。
回复

使用道具 举报

qq791150537

发表于 2020-11-30 16:06:08 | 显示全部楼层

666666666
回复

使用道具 举报

战神洞洞妖

发表于 2020-11-30 16:06:35 | 显示全部楼层

66
回复

使用道具 举报

zcy

发表于 2020-11-30 16:06:39 | 显示全部楼层

6
回复

使用道具 举报