吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11262|回复: 23
收起左侧

[Web逆向] 【使用Hook技术让JS逆向少掉几根头发】 猿人学爬虫攻防赛 第五题详解

  [复制链接]
天空宫阙 发表于 2020-12-16 12:13
本帖最后由 天空宫阙 于 2020-12-16 13:24 编辑

猿人学第5题
题目地址http://match.yuanrenxue.com/match/5

1.定位加密位置
找到有数据返回的请求发现有两个参数m和f并且cookie中有两个值 m 和 RM4hZBv0dDon443M


01.png   

经过测试cookie中的m和RM4hZBv0dDon443M是**必要的**并且**名称不会发生变化**  

此时可以通过搜索 RM4hZBv0dDon443M m m= m: 寻找入口,但是这题是搜不到的。

通过hook cookie中 RM4hZBv0dDon443M 的赋值寻找入口

随便找一个大部分js执行前下一个断点(此时cookie为空)  


02.png

注入下面代码

[JavaScript] 纯文本查看 复制代码
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
    get: function() {
        console.log('Getting cookie');
        return cookie_cache;
    },
    set: function(val) {
        console.log('Setting cookie', val);
        // hook指定cookie键
        if(val.search('RM4hZBv0dDon443M') !=-1 ){
            debugger
        }
        var cookie = val.split(";")[0];
        var ncookie = cookie.split("=");
        var flag = false;
        var cache = cookie_cache.split("; ");
        cache = cache.map(function(a){
            if (a.split("=")[0] === ncookie[0]){
                flag = true;
                return cookie;
            }
            return a;
        })
        cookie_cache = cache.join("; ");
        if (!flag){
            cookie_cache += cookie + "; ";
        }
        this._value = val;
        return cookie_cache;
    },
});



03.png

按F8进行调试在操作cookie并且其中有RM4hZBv0dDon443M时会进入断点,第三次进入断点时RM4hZBv0dDon443M有值


04.png

此时根据调用栈往下找成功找到RM4hZBv0dDon443M赋值的地方


05.png

其中`_$8K`是window `_$ss`是window的一个属性,此时可以搜索`_$ss`没有结果,可以挨个分析`_$8K`但有66处结果比较多,此时再次使用hook技术hook window 的`_$ss`属性

hook的注入点,在RM4hZBv0dDon443M生成的vm文件前面随便下一个断点,或者使用之前那个hook注入点也行,注入一下代码。
[JavaScript] 纯文本查看 复制代码
Object.defineProperty(window, "_$ss", {
    set: function (e) {
        console.log('set _$ss', e)
        debugger
        return e;
    }
})

2.核心加密逻辑分析
成功hook到`_$ss`赋值的地方,同样的根据调用栈往下追可以看到`_$ss`赋值的地方  


07.png

同时此时也是核心加密的位置  


08.png

把鼠标放到对应位置可以看到这些字符串具体的值
还原后的代码

[JavaScript] 纯文本查看 复制代码
_$Ww = _$Tk["enc"]["Utf8"]["parse"](window['_$pr']["toString"]()), 
_$Wu = _$Tk["AES"]["encrypt"](_$Ww, window["_$qF"], {
    'mode': _$Tk["mode"]["ECB"],
    'padding': _$Tk["pad"]["Pkcs7"]
}), 
window['_$ss'] = _$Wu["toString"]();



发现是AES加密ECB/Pkcs7,  
**加密的内容**是_$pr这个数组toString的结果   
**秘钥**是_$qF  
_$pr _$qF 都可以直接搜到

**密钥**_$qF 是请求中的参数m这个时间戳经过base64编码再取前十六位


09.png

**加密的内容**是_$pr这个数组push了5次  
push的内容是时间戳进过函数b处理后的结果  


10.png

所有逻辑就很清楚了 但是**还有一个巨坑**函数b的受到全局变量 `_$Jy` `_$tT` `_$6_`  的影响
hook一下函数b看看哈希前后的值。


13.png

并对比请求时的参数m和f,发现**m的哈希在加密的内容中**,f并没有出现在加密的内容中,**其他时间戳并没有发送给服务器**,因此猜测只要加密的内容中只要最后一位是m的b处理结果即可,f只要给个当前时间即可,函数b也只需要扣最后一次哈希m的即可。(之后测试猜测是准确的,当然也可以完全模拟,若要完全模拟b函数需要传入_$Jy _$tT _$6_作为参数)。

确定哈希m时函数b执行时 _$Jy _$tT _$6_的值,同样适用hook

[JavaScript] 纯文本查看 复制代码
(function hook_g() {
    var new_g = g;
    g = function (e) {
        var ret = new_g(e);
        // debugger
        console.log('_$Jy',_$Jy,'_$tT',_$tT,'_$6_',_$6_)
        console.log("加密前:", e, "加密后:", ret);
        return ret;
    }
})();



14.png

3.最终代码

https://github.com/skygongque/match-yuanrenxue/tree/master/match05


4.成功留念

success05.png

5.参考
思路有参考B站的视频 BV1yz4y1o7Ex,是个大佬,讲解逻辑非常清晰

免费评分

参与人数 16威望 +1 吾爱币 +34 热心值 +16 收起 理由
puchao + 1 + 1 谢谢@Thanks!
skyward + 1 + 1 用心讨论,共获提升!
Frame + 1 + 1 我很赞同!
Spectre + 1 + 1 谢谢@Thanks!
开心的一逼 + 1 + 1 热心回复!
冰岛的雨季 + 1 + 1 热心回复!
huguo002 + 1 + 1 这么屌,都开始研究秃头了啊!!!
槽点 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
jason903 + 1 + 1 谢谢@Thanks!
13169456869 + 1 + 1 热心回复!
逍遥一仙 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
漁滒 + 1 我很赞同!
苏紫方璇 + 1 + 20 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lookerJ + 1 + 1 热心回复!
woyucheng + 1 + 1 热心回复!
细水流长 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

林中月 发表于 2021-2-26 15:27
学习了学习了,感谢
 楼主| 天空宫阙 发表于 2021-3-31 22:32
dych1688 发表于 2021-3-31 12:56
随便找一个大部分js执行前下一个断点(此时cookie为空)  

看后面的图就是随意找的一个断点,清楚cookie后刷新,断下来后打印一下cookie为空此时就可以注入hook cookie生成的代码

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
dych1688 + 1 + 1 谢谢@Thanks!

查看全部评分

wysyz 发表于 2020-12-16 12:27
304775988 发表于 2020-12-16 13:20
楼主强大,功力太深,望尘莫及呀
 楼主| 天空宫阙 发表于 2020-12-16 13:29
304775988 发表于 2020-12-16 13:20
楼主强大,功力太深,望尘莫及呀

还在学习中,其实如果使用AST(抽象语法树)解混淆,那些搜不到的参数就可以搜到了;使用hook算是另一种方案。
 楼主| 天空宫阙 发表于 2020-12-16 14:53
Summer大大 发表于 2020-12-16 14:25
一般加密都是在请求体,cookie里面放加密好像很少见,也有的是放请求头里面的

放cookie里也是比较常见的反爬方式,有些网站甚至是结合起来用的请求的参数和cookie里都有加密的字段。
 楼主| 天空宫阙 发表于 2020-12-18 09:39
就算被置顶也没人看太真实了吧
xixicoco 发表于 2020-12-18 12:23
好东西,我仔细看了,谢谢楼主
dwh007 发表于 2020-12-21 21:18
天空宫阙 发表于 2020-12-18 09:39
就算被置顶也没人看太真实了吧

大大,有无更全面的JS解密教程或资料?谢谢
hellostranger 发表于 2021-3-3 17:51
学到了,以前我也想过这样劫持变量,但是没有想到怎么注入,原来可以打断点再操作
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表