JS逆向
JS 逆向
特别注意事项
:JS逆向
这种事情,本身很吃运气的!!!- 参考网址
- https://blog.csdn.net/uuzeray/article/details/136118382
-
Hook
概念: 替换原函数的过程称为Hook
- 操作方法: 使用
Object.defineProperty()
来进行Hook
function a() { console.log("I'm a."); } a = function b() { // 对a函数进行重写 console.log("I'm b."); }; a() // I'm b. - 此时,若想执行a函数的逻辑,可以使用中间变量来进行 function a() { console.log("I'm a."); } var c = a; a = function b() { console.log("I'm b."); }; a() // I'm b. c() // I'm a. - 小结: 这种原函数直接覆盖的方法通常只用来进行临时调试,实用性不大,但是它能够帮助我们理解 Hook 的过程,在实际 JS 逆向过程中,我们会用到更加高级一点的方法,比如 Object.defineProperty() - 意义: 例如当想分析某个cookie是如何生成时,如果想通过直接从代码里搜索该cookie的名称来找到生成逻辑,可能会需要审核非常多的代码。这个时候,如果能够用hook document.cookie的set方法,那么就可以通过打印当时的调用方法堆栈或者直接下断点来定位到该cookie的生成代码位置
Object.defineProperty()
实例演示
- 通常情况,定义一个对象是这样 var people = {} people.name = 'Jim Green' people['age'] = 18 console.log(people) // { name: 'Jim Green', age: 18 } - 使用`Object.defineProperty来定义,可以这么做 var people = {} Object.defineProperty(people, 'name',{ value:'Jim Green', writable:true, enumerable:true, // 展示people对象,不再是{} }) console.log(people) // { name: 'Jim Green' } console.log(people.name) // Jim Green people.name = 'Kate Green' console.log(people.name) // Kate Green - 我们一般hook使用的是get和set方法: var people = { name:'Jim Green' } var count = 18 Object.defineProperty(people,'age',{ get:function(){ console.log('通过get方法获取值') return count }, set:function(val){ console.log('通过set方法获取值') count = val+1 } }) console.log(people.age) // 通过get方法获取值 18 people.age = 20 // 通过set方法获取值 console.log(people.age) // 通过get方法获取值 21 - 意义: 通过这样的方法,我们就可以在设置某个值的时候,添加一些代码,比如 debugger; 让其断下,然后利用调用栈进行调试,找到参数加密、或者参数生成的地方,需要注意的是,网站加载时首先要运行我们的Hook代码,再运行网站自己的代码,才能够成功断下,这个过程我们可以称之为Hook代码的注入。
- 以
爱奇艺
为例,结合油猴Chrome插件
,实战演示
- 来到某奇艺首页,可以看到cookie里面有个__dfp值,我们想通过Hook的方式,让在生成__dfp的地方断下,就可以编写如下函数: (function () { 'use strict'; var cookieTemp = ''; Object.defineProperty(document, 'cookie', { set: function (val) { if (val.indexOf('__dfp') != -1) { debugger; } console.log('Hook捕获到cookie设置->', val); cookieTemp = val; return val; }, get: function () { return cookieTemp; }, }); })(); - 注意事项: if (val.indexOf('__dfp') != -1) {debugger;} 的意思是检索 __dfp 在字符串中首次出现的位置,等于 -1 表示这个字符串值没有出现,反之则出现。如果出现了,那么就 debugger 断下,这里要注意的是不能写成 if (val == '__dfp') {debugger},因为 val 传过来的值类似于 __dfp=xxxxxxxxxx,这样写是无法断下的. 清除 cookie,开启 TamperMonkey 插件,再次来到某奇艺首页,可以成功被断下,也可以跟进调用栈来进一步分析 __dfp 值的来源
- 操作方法: 使用
-
压缩和混淆
- 压缩,实例如下
- 压缩前 function echo(stringA, stringB){ const name = "Germey"; alert("hello " + name); } - 压缩后 function echo(d,c){const e="Germey";alert("hello "+e)};
- 混淆示例
- 安装混淆库: npm i -D javascript-obfuscator - 在"main.js"中编辑如下内容 const code = ` let x = '1' + 1 console.log('x', x) ` const options = { compact: false, } const obfuscator = require('javascript-obfuscator') function obfuscate(code, options) { return obfuscator.obfuscate(code, options).getObfuscatedCode() } console.log(obfuscate(code, options)) - 输出结果: 一堆的混淆代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异