解密 JS 参数:逆向工程的实用技巧

作者:星安果

来源:AirPython

大部分网站都会对关键参数进行加密,JS 逆向时,我们首要任务是定位参数具体的加密逻辑

常见方式包含:关键字搜索、堆栈调试、XHR 及事件监听、AST 内存漫游、JS Hook 注入等

本篇文章以 JS Hook 注入定位 Cookie 中某个加密参数为例进行讲解

Cookie 监听

编写一个 Chrome 插件( V3版本)监听浏览器 Cookie 值的变动,当 Cookie 的 Name 匹配时执行 debugger 命令主动触发调试

具体实现如下:

1-1编写 manifest.json 配置文件

在配置文件中,指定 background.js、contentscript

并通过 permissions、hostpermissions 进行权限设置

{“manifestversion”:3,…”background”:{“serviceworker”:”background.js”},”contentscripts”:[{“matches”:[“”],”js”:[“js/cookie.js”],”runat”:”documentstart”}],”permissions”:[“cookies”,”tabs”,”scripting”],”hostpermissions”:[“https://host/*”],…}

1-2监听 Cookie

在 background.js 文件中添加一个事件监听,在它的回调函数中再添加一个对 Cookie 的监听事件

当监听到的 Cookie 满足条件时,发送消息给 Content Script 去执行具体的动作

需要指出的是,changeInfo.cause 表示 Cookie 变化的原因,值 explicit 表示 Cookie 变化是由于用户主动操作导致的

#监听的cookienameconst targetCookieName =”cookiename”;chrome.runtime.onMessage.addListener((request, sender, sendResponse)=>{if (request.action ===”startDebugging”){ chrome.cookies.onChanged.addListener((changeInfo)=>{//console.log(“监控到cookie变化”)//console.log(changeInfo.cookie.name)//console.log(changeInfo.cause)if (changeInfo.cookie.name === targetCookieName && changeInfo.cause ===”explicit”){ console.log(“监控到cookie变化-explicit,名称:”,changeInfo.cookie.name) chrome.tabs.sendMessage(sender.tab.id,{ action:”debugger”});} });}});

1-3触发调试

在 Content Script 中,主动触发一次发起调试的消息给 Background

然后,设置一个监听事件,特定条件下主动进入调试模式

// cookie.jschrome.runtime.sendMessage({ action:”startDebugging”});chrome.runtime.onMessage.addListener((request)=>{if (request.action ===”debugger”){debugger;}});

将编写好的 Chrome 插件安装到浏览器上,打开目标网站及浏览器开发者工具

只要指定的 Cookie 变动,就会自动触发调试操作

Cookie Hook

通过上面的方式仅仅只能发现 Cookie 变动了,但是没法定位到参数设置的具体位置,因此我们需要借助 Hook 进行改造

具体实现如下:

2-1配置文件中指定 Hook 文件

在 manifest.json 文件中,使用 webaccessibleresources 关键字指定 Hook 脚本及匹配 URL

// manifest.json{“manifestversion”:3,…”contentscripts”:[ {“matches”:[“”],”js”:[“js/cookie.js”],”runat”:”documentend”} ],”permissions”:[“cookies”,”tabs”,”scripting”],”hostpermissions”:[“*://*/*”],”webaccessibleresources”:[ {“resources”:[“js/cookiehook.js”],”matches”:[“https://host/*”] }]}

2-2 Content Script 注入 JS

在 Content Script 中注入 JS Hook 代码

// cookie.jsfunctionimportjs(jspath){let tmp = document.createElement(script); tmp.src = chrome.runtime.getURL(jspath); tmp.setAttribute(type,text/javaScript);document.head.appendChild(tmp);}(function (){let url = window.location.href; importjs(js/cookiehook.js)})()

2-3 JS Hook 具体逻辑

在 cookiehook.js 文件中,使用 document.lookupSetter 对 Cookie 设置注入脚本,手动触发调试

// cookiehook.js//待匹配的Cookie-Keyconst targetCookieName =”cookiename”;//Hook Cookie Set//注意:这种方法可能与某些网站的JavaScript代码不兼容,因为它依赖于废弃的defineSetter方法functionhookCookieSetter(){const originalCookieSetter = document.lookupSetter(“cookie”);document.defineSetter(“cookie”, function (value){const cookieName = value.split(“=”)[].trim();if (cookieName === targetCookieName){debugger;}//调用 originalCookieSetter.call(document, value);});}hookCookieSetter();

当然,我们也可以利用下面的方式进行注入

// cookiehook.js//待匹配的Cookie-Keyconst targetCookieName =”cookiename”;//cookie 钩子:用于定位 cookie 中关键参数生成位置var code = function(){var org = document.cookie.lookupSetter(cookie);document.defineSetter(“cookie”,function(cookie){if(cookie.indexOf(targetCookieName)>-1){debugger;} org = cookie;});document.defineGetter(“cookie”,function(){return org;});}var script = document.createElement(script);script.textContent =(+ code +)();(document.headdocument.documentElement).appendChild(script);script.parentNode.removeChild(script);

2-4使用

在 Chrome 浏览器中安装扩展后,打开浏览器开发者工具和目前网站,一旦目标 Cookie 被设定一个值后,会自动进入断点模式

在调试模式下,我们就可以在 Source 面板利用 Call Stack 调用栈一步步查询到加密参数生成的具体逻辑

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧