1 插桩: 保存代码-->修改保存代码(找到关键信息,输出)-->替换代码
- x.push
- var n = String.fromCharCode(65);
- var n = "HELLO WORLD".charAt(2) // 返回的是L
- var n = "HELLO WORLD";.charCodeAt(0); // 返回的是72
- window.atob 插桩关键字
-
var bbb = JSON.stringify(aaa, function(key, value){ // 方便查看 if (value == window){ return undefined; } return value; })
2 vmp: 基于栈的vmp,可以使用跳战,跳过部分监测 下面我们是需要找到的
- 栈-->[2, 1]
- OP-->指向下一行指令或者指向下个一个字节 ++操作往下移
- 方法参数栈 len v=argument; v.push()
- eval 字符串转成运行的js代码 var aa = eval("function a(){};return a") aa.apply(this, [.....]) aa.call(this, aaa, aaa, aaa) 使用apply和call 可以向函数穿不定个数的参数
3 在原型链顶端修改的函数,你在底端是无法hook的,需要在他原型链上进行hook操作,查找只能一步步我看.看这个函数怎么来的,怎么添加上去的
Element.prototype.insertBefore = function insertBefore(a, b) { // 在原型链上hook debugger; }
4 promise取值
一旦Promise对象产生结果,可以通过then方法获得这个最终结果。可以通过.then()以及.catch()来操作Promise对象,then()中我们可以接收Promise对象返回的结果作为参数,获取成功和失败的结果,也可以通过catch()把Promise对象返回的失败结果捕捉到。
示例:
let promise = new Promise(( resolve, reject ) => { // 进行一些异步操作 if (/* 异步操作成功 */) { resolve(value); } else { reject(value); }
5 特殊值含义
.abrupt 异步平坦流 mark wrap可以看成循环 .then 是异步 evle 执行字符串格式的代码 postMessage // 多线程关键字 worker, Blob //多线程 WebAssembly.instantiateStreaming WebAssembly.instantiate //Assm 初始化的 document: Event: JSON: navigator: location: window: Audio: // 视频 canvas: //画图
6 发xhr请求 替换 修改vm里面的代码
var result = null; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { result = xhr.responseText; } } xhr.open('GET', 'https://hd.ghzyj.sh.gov.cn/4QbVtADbnLVIc/vm.js', false); // 使用浏览器替换成自己需要的代码 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(); result = result.replace('debugger;', '/*debugger;*/'); ret = _$Kq.call(_$MB, result); // 替换result要执行的代码
7.复制对象出来
首先在控制台输出一下对象($_ts) ----> 然后在控制台输入copy($_) 就可以在外面粘贴了
8.AST还原顺序
还原顺序-->数组乱序处理-->字符串解密处理-->去掉字符串和函数花指令-->流程平坦化还原
9.websocket
let Socket = new WebSocket(url, [protocol]); // 不管怎么混淆new WebSocket 一定是用的 可以用这个点位WebSocket位置 Socket.readyState; Socket.onopen; // 链接建立是触发 Socket.onmessage; // 客户端接收服务端数据时触发 Socket.send(); // 使用连接发送数据 1.搜索下断 搜到很多一个个下端 2.找到Socket对象 hook send方法 直接快速 假设 p是Socket对象 let p = new WebSocket() p.send_ = p.send p.send = function(arr){ debugger; // 这样下次调用send方法就会在这里断住 return p.send_(arr) }
10.由于es6之前和es6之后版本的区别,然后我配置了package.json里的"type": "module",导致不能window=globalThis,以及只能import导包,,,正确使用应该是globalThis.window = globalThis,或者去掉package.json里的"type": "module"