js逆向6-jshook,js扣代码

###

我发现一个事情,不管什么语言,代码的调用链,还有代码的作用域都是非常重要的内容,都需要好好的理解才行,包括js,还是python,

###

为什么要hook?

很简单,如果你遇到了cookie加密,那你就要找到cookie加密函数入口,那你就要hook,

####

 

###

####

 hook就是重写的一个概念,

###

hook,有手动hook,自动hook,

hook,有函数hook,属性hook,

###

hook步骤,

1,寻找hook点,也就是你要知道你hook的目标是什么?

2,编写hook逻辑,

一般在js逆向里面,hook,就是为了打印一些信息,或者是做一个debugger,

3,调试,

 

###

函数hook公式

####

步骤

1,赋值,可以使用func_bak  = func,先把老的函数接收一下,

2,重写,然后再添加我们的逻辑,把原来的老的逻辑还是放进去,这样不影响老的逻辑

3,修改原型链,伪装一下,否则可能会被检测到被hook了,

有些时候,通过打印一个函数的toString,可能判断出来和原来的不一致,我们hook了之后会被识别出来,那么就修改他的原型链,然后伪装一下,让他识别不出来是被hook了,

 

 

###

对象中属性的hook公式

举例:比如你要hook,document.cookie

 ###

document.cookie_bak = document.cookie;

Object.defineProperty(document,"cookie",{
    get:function () {
        debugger;
        return document.cookie_bak
    }

})

###

我们hook这个document.cookie,

先赋值,

再重写属性,

然后加入我们的代码,然后回车,看到返回document的时候就证明,我们hook成功了,

然后我们再去执行document.cookie就可以进入debug,我们就可以看到他是在哪里打印cookie的, 

然后我们可以找堆栈,看哪里调用的这个函数,就找到了函数入口,

 

 

 

#####

hook实战

 

 

通过第二题和第九题来演示,

 

第一步,登陆网站,然后打开F12,打开script断点,

 

 

###

第二步,打开断点,刷新页面,会直接进入这一题的js代码里,这个时候因为打开了js断点,所以执行第一行js的时候就会断住,

 

 

第三步:注入hook代码,在console控制台输入代码,

 ###

Object.defineProperty(document,"cookie",{
    get:function () {
        debugger;
        return;
    },
    set:function () {
        debugger;
        return;
    }
})

###

这是一个最简单的hook,document.cookie 

我们不想保留这个document.cookie 的内容,我只想要知道函数入口,我们想要在设置cookie的一瞬间,然后把他断住,我们知道是哪里设置的就可以了,

这个思路很重要,

所以我们不需要把老的属性接收了,也就是不需要这一句,document.cookie_bak = document.cookie;

 

第四步:然后取消这个script断点,开始继续往下走, 

 

 

 

第五步,我们看到就断住了,我们不断的下一步,一直到我们set这个地方,我们可以往上找堆栈,就可以找到设置cookie的地方, 

如果有无限debugger就过掉

 

 设置cookie的地方就断住了,

 

 往上找堆栈,这就是设置cookie加密的地方,

 

 

 

优化一下

 ###

Object.defineProperty(document,"cookie",{
    get:function () {
        debugger;
        return;
        
    },
    set:function (val) {
        debugger;
        return;

    }

})

这样可以看到传进来的val,

 

 

###

JS课程常见问题1 :

关于 比赛平台第二题/练习平台第二题/练习平台第三题 等一系列cookie加密无法hook 到 cookie 或者无法找到混淆代码或者没有无限debugger了的原因及解决方案的统一答疑:

标准处理方案:

1. 请大佬先排除一切干扰因素【建议开启 chrome浏览器的无痕模式,关闭所有的浏览器插件以排除干扰,避免一些不必要的麻烦】

2. 清除检测点。即:清除 cookie中检测的位置,比如 练习平台中第二题的 sign,比赛平台中第二题的 m 【这里注意不要清除名为 sessionid 的cookie,否则登录状态会掉!】

3. 打上script断点,然后刷新页面,这个时候页面应该就会断住了,之后如果是低版本的chrome浏览器,就可能会已经看到混淆的js了,这个时候注入hook脚本就能hook到cookie了

4. 如果这个时候,没有看到混淆的js,就是证明chrome版本较高或者有一些其他因素,导致在页面刷新过程中还存在其他js组件,导致页面停留在上一页,此时注入的hook脚本还在上一页中,所以注入的hook脚本是会失效的。那么这个时候需要用F8,跳到下一个断点,跳几下,直到看到混淆的js之后,再注入hook脚本即可。

 

 ####

 

hook本身是一个非常高深的技术,

案例;

python-,第二题,第九题,

###

 

###

 

###

 

 

 

 对局部变量进行hook,

 

hook的代码是很灵活的,

但是要依赖对js代码的理解,对调用链的理解,你理解了,才可以写出hook,

而且要对hook的原理也要非常知道才行,

 

####

验证码的原理

比如,返回一个图片,让你点击图片的字体的验证码

原理

1,首先服务器返回一个图片

2,服务器怎么知道是返回给我们的是哪一个图片呢,需要在浏览器记录一个cookie,刷新验证码图片的时候,会把原来的cookie删除,新增一个,

3,然后用户点击了图片中的字体,会发给服务器两个东西,一个是cookie,一个是字体在图片的坐标,然后服务器就会判断这个图片的坐标是否正确,然后返回结果,会把之前的cookie删除

####

上面只是最简单的例子

还有可能是什么,不是使用cookie,是使用的js,

而且还可能对传值进行了加密传输,

但是万变不离其宗,本质就是先下发验证码,和客户端建立联系,然后上传验证码的结果校验,然后返回结果,

####

但是知道了验证码的逻辑之后,怎么破解呢?

还是需要使用机器学习的方式建立模型,来破解这个验证码的问题,

####

 

 

 

 

 

 

###

match第二题

这道题是一道假动态的cookie。每次运行时,会加载不同的cookie生成方式,但是最后生成的算法一样的,所以我们只需要扣出一套代码来即可通用

第一步,通过hook找函数入口,先用hook cookie的代码找到生成cookie的代码,

 

第二步,还是扣代码,缺什么补什么,

这个时候你可能运行的时候,发现运行的时候卡死了,这样你就进行不下去了,怎么办?

说明你进入了一个死循环了,会导致你的内存飙升,导致内存爆炸,你的浏览器就崩溃了,要找到是哪里导致的,

一般是两个原因,一个是浏览器指纹,一个是格式化校验,

怎么判断是否是浏览器指纹?

现在我们复制这些代码放到浏览器下面的控制台输出。来观察是否是浏览器检测

如果正常没有卡死,说明是浏览器检测,如果还是卡死了,说明是格式化检测

我们发现回车之后再次进行回车,已经没有反应,说明肯定是格式化检测了,

 

怎么判断是格式化校验呢?

笨方法就是一步一步的debug,看哪里的问题,

搞js逆向是一个非常需要耐心的活,很墨迹,

这个硬扣代码就是比较繁琐,而且还考验你对js的理解,

 

这个第二题,有更好的方法,不需要硬扣,硬扣这应该是一个高级别的题目,扣代码很困难,

 

###

中等难度的js混淆,ob混淆,只要是有耐心,扣代码就能抠出来,

怎么提升js逆向的技术?听课只能给你提供一个思路,要想提高js逆向的能力,只能是实践,这是一个完全绝对的经验性的东西,

不要上来就扣,你要知道这个是一个动态js,先搞清楚原理,

 

####

 

####

 

####

  

 

 

####

posted @ 2021-08-01 17:46  技术改变命运Andy  阅读(2007)  评论(1编辑  收藏  举报