文章总结: 本文详细介绍了funcaptcha反混淆技术,重点讲解如何绕过格式化检测和字面量混淆。针对格式化检测,提供了手动修改和HooktoString函数两种解决方案;针对字面量混淆,提出了常量折叠、变量名替换和解密函数调用的处理方法。文章通过实际代码示例展示了反混淆前后的对比,为安全研究人员提供了实用的逆向工程技术参考。
综合评分: 91
文章分类: 逆向分析,漏洞分析,代码审计,WEB安全,安全工具
funcaptcha反混淆
原创
逆向狗都不学
逆向狗都不学
2025年8月15日 07:57
广东
声明
本文仅供学习交流使用, 如侵立删!
目标网址
aHR0cHM6Ly93d3cuYXJrb3NlbGFicy5jb20vYXJrb3NlLW1hdGNoa2V5Lw==
加密JS
aHR0cHM6Ly9jbGllbnQtYXBpLmFya29zZWxhYnMuY29tL2ZjL2Fzc2V0cy9lYy1nYW1lLWNvcmUvZ2FtZS1jb3JlLzEuMjkuNi9zdGFuZGFyZC9saWIuY2h1bmsuY2NmNzU4MmE4YTQ1NTJhNzRkZWIuanM=
aHR0cHM6Ly9jbGllbnQtYXBpLmFya29zZWxhYnMuY29tL3YyLzNFRTc5RjhELTEzQTYtNDc0Qi05Mjc4LTQ0OEVBMTlGNzlCMy9hcGkuanM=
针对这两个加密JS进行反混淆
不同网站搭载的funcaptcha
这两个加密JS文件名也不同
但是代码整体逻辑相同
可直接替换
格式化检测
在funcaptcha中
使用了代码格式化检测
如果对加密JS代码进行了格式化处理
当加密JS代码运行时
浏览器就会卡死
所以在对加密JS进行反混淆之前
首先要绕过加密JS中的格式化检测
保证后续调试与反混淆能正常运行
检测代码:
精简代码:
function gc_3R() {
var R1 = gc_3O;
if (e) {
var o = e[R1(gc_3fr.R)](f, arguments);
return e = null, o;
}
}
gc_3R["toString"]()["search"]("(((.+)+)+)+$")['toString']()["constructor"](gc_3R)["search"]("(((.+)+)+)+$")
这段代码执行后
浏览器就会卡死
格式化检测原理:
正则匹配公式”(((.+)+)+)+$”是一个多重嵌套贪婪匹配结构
代码进行格式化后
函数字符串包含换行符
当使用这个正则匹配公式进行匹配时
正则引擎会因无法匹配整个字符串
而陷入指数级回溯
还通过链式操作连续进行两次正则匹配
进一步扩大正则引擎的回溯路径
从而阻塞主线程的运行
导致页面无响应、卡死
解决方案1
手动修改检测代码绕过
获取浏览器中
未格式化代码情况下
格式化检测代码运行结果0
在对加密JS进行替换时
将检测代码直接修改成其运行结果即可
解决方案2
使用Hook对toString函数进行重写
Hook toString函数调用
对toString调用结果字符串进行替换处理
将toString调用结果字符串中的换行符替换为空
这样检测代码
就不会因为无法匹配函数的toString字符串
而陷入指数级回溯
导致页面无响应、卡死
Hook代码:
let new_func = Function.prototype.toString
Function.prototype.toString = function (){
let result = new_func.apply(this,arguments).replace(/\n/g, "")
return result;
}
之所以使用两种解决方案
是因为这两个加密JS都使用了原理一致的格式化检测
但是在lib.chunk.js中
只使用了一行格式化检测代码
且这个格式化检测代码还在解密相关函数中
在后续的字面量反混淆中
需要运行解密相关函数
如果不格式化会导致反混淆程序运行死循环
所以采用方案1
而在api.js中
使用了多个格式化检测代码
一个个修改太麻烦了
且这些格式化检测代码不在解密相关函数中
因此采用方案2
字面量混淆
在这两个加密JS中
都使用了字面量混淆
对方括号表示法中的字符串加密后替换
并添加上解密函数
在程序运行时解密
针对这种字面量混淆
首先找到其解密相关函数
在lib.chunk.js中
可以很清楚的发现解密函数
并且还是解密函数赋值变量调用解密的
针对这种情况的字面量混淆
先进行常量折叠
把对象里已知的数值提取出来并内联到调用处
也就是解密函数中
未修改前
修改后
再将解密函数赋值的所有变量名包括其引用
全都修改为解密函数名
未修改前
修改后
最后找到解密相关函数
使用eval将其运行
对所有解密函数的代码进行调用
获取其结果进行替换
便完成了字面量反混淆
反混淆结果展示
api.js反混淆前
api.js反混淆后
星球
相关代码已放置星球
欢迎加入知识星球
学习更多的逆向技巧与思路
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:逆向狗都不学 逆向狗都不学《funcaptcha反混淆》