JS逆向

23882 发布于 5 小时前 4 次阅读


控制台操作

断点方法

1.直接左边断点

2.从调用堆栈找,注意调用堆栈从小往上看

image-20260201145401175

3.xhr/提取断点锁定关键词

image-20260201145415654

4.在button选择属性修改后断点(不推荐)

image-20260201145524096

反调试

检测调试方法:

-无限Debugger技术 -键盘监听(F12) -检测浏览器的高度插值 -检测开发者人员工具变量是否为true -利用console.log调用次数 -利用代码运行的时间差 -利用toString -检测非浏览器

绕过技巧:

1、禁用所有断点 2、禁用局部断点 3、设置条件断点 4、替换文件执行(修改文件重定向)

如图操作,启用本地替换后,选择需要替换的文件替换内容

image-20260201205800436

image-20260201205844756

5、通过Burp修改匹配(流量到burp修改返回) 6、油管猴插件配合HOOK(插件对浏览器执行JS删除)

HOOK钩子

JS Hook(钩子)是一种通过拦截和修改JavaScript函数或对象行为的技术, 主要用于: *动态分析网页行为 *修改页面功能 *调试和逆向工程 *自动化测试 *安全研究

HOOK开发前置:

@name 定义脚本的名称 @namespace 用于区分不同脚本的作用域 @version 定义脚本的版本号 @description 描述脚本的功能或用途 @author 定义脚本的作者 @match 定义脚本的运行匹配规则 @icon 定义脚本的图标 @grant 定义脚本所需的特殊权限

Sign签名

Sign(签名)机制广泛应用于API请求、数据传输、身份验证等场景,用于确保数据的完整性和来源可信性。它对渗透测试(Penetration Testing)带来了显著的影响,既有安全增强作用,也增加了测试的挑战,测试人员需要结合逆向分析、动态Hook、服务器逻辑测试等方法,才能有效发现潜在的绕过漏洞。

混淆

常见混淆

eval: 特征:出现关键字eval 还原:控制台输出(去除eval()后)给函数名,新建JS文件优化

JJEncode,AAEncode,JSFuck: 特征:包含很多$ 特征:包含很多颜文字 特征:包含很多[ ]、()、+、! 还原:控制台输出(一般去除()调用后)点击查看或直接运行

Obfuscator: 特征:包含很多——0x字母无意义的字符串,阅读难度增加 还原:控制台输出美化代码断点调试输出分析,利用AST技术解密还原

AST

AST就是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码的一种结构,这种数据结构其实可以类比成一个大的JSON对象。

介绍

第一词法分析 一段代码首先会被分解成段段有意义的词法单元, 比如const name="qc”这段代码,它可被折分成四部分: 1、const 2、name 3、= 4、qc 每个部分都具备一定的含义。

第二语法分析 接着编译器会尝试对一个个法单元进行语法分析,将其转换为能代表程序语法结构的数据结构。 比如 1、const就被分析为VariableDeclaration类型,代表变量声明的具体定义; 2、name就被分析为ldentifier类型,代表一个标识符 3、qc就被分析为Literal类型,代表文本内容;

第三指令生成 最后将AST转为可执行指令并执行

Literal:简单理解就是字面量,比如3、“abc”、null这些都是基本的字面量。在代码中又细分为数字字面量,字符字面量等; Declarations:声明,通常声明方法或者变量。 Expressions:表达式,通常有两个作用:一个是放在赋值语句的右边进行赋值,另外还可以作为方法的参数。 Statemonts:语句。 Identifier:标识符,指代变量名,比如上述例子中的name就是ldentifier。 Classes:类,代表一个类的定义。 Functions:方法声明。 Modules:模块,可以理解为一个Node.js模块。 Program:程序,整个代码可以称为Program。

微信小程序

-HOOK项目: https://github.com/eeeeeeeeee-code/e0e1-wx https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python

微信特定版本和小程序版本 https://github.com/tom-snow/wechat-windows-versions https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python

JsRpc

远程调用(rpc)浏览器方法,免去抠代码补环境

参考:

https://forum.butian.net/share/2889

https://forum.butian.net/share/3728

JSRpc进阶

当我们遇到一些前端加密的时候,通常我们会去逆向JS,找到加密函数,然后使用burp插件或者python实现加密,这样我们还需要扣一些细节去补环境,下面介绍利用JSRPC的方法(只需要找到加密函数)实现加密JSRPC就是远程调用协议,简单来说就是我们可以本地编写代码去调用浏览器的JS加密函数,我们就不需要去考虑函数的具体逻辑了。 1、植入JSEnv并启动ws服务端 执行:resouces/JsEnv_Dev.js 执行:window_amd64.exe

2、本地替换加密函数JS文件 添加连接JSRPC和注册接口并调用加密 //连接JSRPC var demo = new Hlclient(“ws://127.0.0.1:12080/ws?group=xiaodi&name=xiaodisec”); //注册接口并调用加密 demo.regAction(“pass”,function(resolve,param){ resolve(encrypt.encrypt(param)); })

3、访问注册接口测试加密 http://127.0.0.1:12080/go?group=xiaodi&name=xiaodisec&action=pass¶m=123456

JSRpc+autoDecoder

1、正常完成上述JSRpc操作 2、autoDecoder配置接口 3、编写项目模版py监听接受 4、请求接口路由测试加解密 注意:data指向和jsrpc一致,debug模式确定开启

此作者没有提供个人介绍。
最后更新于 2026-03-11