js逆向hook总结
document.cookie
常见做法
copy
var oldCookie = document.cookie; Object.defineProperty(document, "cookie", { get(){ return oldCookie; }, set(val){
console.log("setting cookie", val); oldCookie += ";" +val; } })
这样做法有两个问题,其一是cookie并没有被设置上,只是js 获取与设置cookie的时候可以hook到。
其二是需要自己处理设置cookie的情况,比如更新,删除cookie。
较好的hook做法
copy
// 代码来源 https://stackoverflow.com/questions/32410331/proxying-of-document-cookie var cookieDesc = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') || Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie'); if (cookieDesc && cookieDesc.configurable) { Object.defineProperty(document, 'cookie', { get: function () { return cookieDesc.get.call(document); }, set: function (val) { console.log(val); cookieDesc.set.call(document, val); } }); }
hook函数
copy
var oldEval = eval; eval = function(){ console.log("exec", arguments[0]); return oldEval.apply(this, arguments); }
hook方法
copy
var obj = { a: { } }; var old = obj.a; Object.defineProperty(obj, "a", { get(){ return old; }, set(val){
console.log("obj.a set to be", val); old = val; return old } })
obj.a = 111;
new Proxy加with
copy
const handlers = { get(target, p, rev) { const result = Reflect.get(target, p); console.log(`reading ${target.constructor.name}.${p}, value=${result}`) return result; }, set(tagret, p, value, rev) { const result = Reflect.set(tagret, p, value); console.log(`setting ${target}.${p} = ${value}`); return result; } }; (function setHook() { const withObject = { window: {} }; const mappedObject = { location, navigator, document }; Object.keys(mappedObject).forEach((key) => { var proxiedMethod = new Proxy(mappedObject[key], handlers); withObject[key] = proxiedMethod; }); withObject.window = withObject; window.withObject = withObject; })(); with (withObject) { console.log(window.a); console.log(navigator.userAgent); console.log(location.href); }
hook xhr请求
ast注入hook函数
利用ast给所有的赋值语句加上一层包装
copy
var obj = { a: {} }; console.log(obj.a); // 读取 obj.a = 11; // 设置 // 包装成这样 console.log(wrapper(obj.a, obj, "a", {type: "property access"})); wrapper(obj.a, obj, "a", {type: "property assignment", value: 11});
做法借鉴了 js内存漫游那位大佬。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器