0x00 前言
我已经快两个月没更JS逆向系列相关的文章了,有点怀念去年通宵写逆向文的日子了。写这篇文章是因为我早就想研究一下某些代码是如何进行检测代码是否被格式化过,例如rs,所以我向我真的不是蜘蛛
公众号号主Dexter要了一份某网站rs检测格式化的代码,并且我也写出了绕过该rs检测格式化的hook脚本,具体看下文。
在此也感谢Dexter师傅提供的测试样本,欢迎大家关注我真的不是蜘蛛
公众号。
注:本文提到的绕过脚本为初版脚本,绕过方案只针对本文提出的格式化检测方式,不代表本脚本能绕过所有的格式化检测的代码。
0x01 正文
其实我在正式研究格式化检测之前也能猜到它们大概是怎么进行检测的,我现在给大家展示一段未格式化的代码:
function_$dZ(){return'x74x6fx53x74x72x69x6ex67';}
我用toString给大家打印一下这个函数:
现在我格式化一下代码给大家看一下效果:
我拿上面这两个输出的内容给大家对比一下:
我觉得还是很直观的,首先我们能看到格式化后toString的内容有换行,也就是n,第二个就是有多余的空格,也可能有t,最明显的就是n和空格,所以代码就可以通过函数toString后的内容去检测代码是否被格式化过,这是我认为最简单的检测方式,所以我写了以下脚本来绕过这种检测方式:
通过这段代码可以有效绕过这种检测方式,核心部分就是下面这段代码:
if (typeof toString_result == "string") { toString_result = toString_result.replace(/s/g, '');if (toString_result.slice(0, 8) === 'function') { toString_result = toString_result.slice(0, 8) + ' ' + toString_result.slice(8); } }
我使用replace(/s/g, '')
直接替换掉所有的空白字符(包括 n、r、t、空格等),当时写到这儿时我就已经认为可以成功的绕过检测了,但是我发现代码还是会报错,于是我调试对比了一下未格式化时hook和未hook的效果:
唯一的不同就是hook后function后面没有空格,因为我在代码中删除了所有的空格,所以我需要再给这里加上,于是就有了下面这段代码:
if (toString_result.slice(0, 8) === 'function') { toString_result = toString_result.slice(0, 8) + ' ' + toString_result.slice(8);}
此时我再重新运行脚本,打印出了cookie,成功绕过格式化检测。
脚本我依然上传到了Hook_JS库里,脚本地址:https://github.com/0xsdeo/Hook_JS/blob/main/%E5%AE%9E%E7%94%A8%E5%B0%8F%E8%84%9A%E6%9C%AC/%E8%BF%87%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%A3%80%E6%B5%8B.js
使用的话直接将脚本放到目标脚本的最上面即可,不过我还需要再重申一遍:本文提到的绕过脚本为初版脚本,绕过方案只针对本文提出的检测格式化方式,不代表本脚本能绕过所有的格式化检测的代码。
我后来有问过deepseek有没有其他的检测格式化方式,它也给了我一些比较恶心的检测方式,例如:
但是我没有细究这些内容,等以后遇到了再去做专门的绕过,所以读者朋友们如果有遇到过不去检测的代码可以直接联系我,我这边再研究一下该如何过。
原文始发于微信公众号(Spade sec):JS逆向系列18-格式化检测与绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论