访问这个网站的时候,cookie 里面会有一个 sign 值,这个sign 值是通过 JavaScript 代码生成的,JS 代码是用 ob 混淆的,

当打开 "开发者工具" 时,会直接进入 "无限 debugger" 模式,过无限debugger 模式这里有三种方法

  • 方法 1.  直接 "从不在此处断点"
  • 方法 2.  查看调用堆栈,把进入无限 debugger 的那个函数在console中重新定义,把函数置空
  • 方法 3.  通过中间人攻击,替换 JavaScript 代码文件成本地文件,在本地文件中把 无限debugger 功能去掉( 注释掉 )。
        这种方法可以进行本地断点调试,和实时验证逆向的代码逻辑

这里使用 方法 3,把网站返回的混淆后的JS代码拿下来,放到 demo.html 文件里面,并用 <script></script>  包括,同时,把 hook cookie 的代码和框架代码也放里面,并放在 混淆代码之前

hook cookie 的代码:

(function () {'use strict';var cookie_cache = document.cookie;Object.defineProperty(document, 'cookie', {get: function () {console.log(cookie_cache);return cookie_cache;},set: function (val) {debugger;var cookie = val.split(";")[0];var ncookie = cookie.split("=");var flag = false;var cache = cookie_cache.split(";");cache = cache.map(function (a) {if (a.split("=")[0] === ncookie[0]) {flag = true;return cookie;}return a;})cookie_cache = cache.join(";");if (!flag) {cookie_cache += cookie + ";";}},});
})();

hook 框架的代码:

  • hook 和 AOPHooker JShttps://gitee.com/HGJing/hooker-js

demo.html 文件构造好后,打开 fiddler ---> AutoResponder,添加规则,

chrome 打上 script 断点,然后访问目标网站,即可断下

可以看到访问 JS 时,已经变成我们本地的 demo.html 文件了。然后去掉 script 断点,继续运行,会进入 无限debugger 模式,可以在本地文件中找到无限 debugger 的函数,直接注释掉,或者删除即可,也可以在console直接置空,更简单的是直接 "never pause here",这里使用 "never pause here" 然后继续运行,等待一会会直接进入 hook cookie 的 set 函数中,查看调用堆栈,即可找到关键位置

关键 JS 代码:_0x521302[$_0x5780('\x30\x78\x37\x38', '\x4f\x71\x6c\x44') + '\x65\x4c'](_0x30c194, _0x521302['\x48\x43\x54' + '\x65\x4c'](_0x451a25, _0x521302['\x55\x64\x79' + '\x56\x42'](_0x1af341)))

  • $_0x5780('\x30\x78\x37\x38', '\x4f\x71\x6c\x44') + '\x65\x4c' 放到 console 里面执行得到 "HCTeL"
  • '\x48\x43\x54' + '\x65\x4c' 放到 console 里面执行得到 "HCTeL"
  • '\x55\x64\x79' + '\x56\x42' 放到 console 里面执行得到 "UdyVB"

所以关键代码可以还原为:_0x521302["HCTeL"](_0x30c194, _0x521302["HCTeL"](_0x451a25, _0x521302["UdyVB"](_0x1af341)))

继续还原 _0x1af341,在 console 中执行,可以发现 是一个函数,执行 toString() 方法,打印方法内容。

function _0x1af341(_0x250d81){return new Date()[$_0x5780('\x30\x78\x37\x65','\x64\x24\x75\x57')+$_0x5780('\x30\x78\x63\x30','\x69\x7a\x39\x37')+'\x66']();}

上面函数继续进行还原:$_0x5780('\x30\x78\x37\x65','\x64\x24\x75\x57')+$_0x5780('\x30\x78\x63\x30','\x69\x7a\x39\x37')+'\x66' 执行后得到 "valueOf",

所以上面方法可以还原为:function _0x1af341(_0x250d81){return new Date().valueOf();}

现在还原 _0x521302["UdyVB"] 方法:执行 _0x521302["UdyVB"].toString()

可以看到这个函数传递了一个参数,这个参数执行了一个函数,函数体是返回函数执行后的结果。

所以 _0x521302["HCTeL"](_0x30c194, _0x521302["HCTeL"](_0x451a25, _0x521302["UdyVB"](_0x1af341)))

可以还原为  _0x521302["HCTeL"](_0x30c194, _0x521302["HCTeL"](_0x451a25, _0x1af341()))

再进一步还原:_0x521302["HCTeL"](_0x30c194, _0x521302["HCTeL"](_0x451a25, new Date().valueOf()))  ,验证还原结果:

按照上面方法在进一步还原:_0x30c194(_0x451a25(new Date().valueOf()))

现在只需要分析 _0x30c194、_0x451a25 ,先看下 _0x451a25 函数的 toString() :function _0x451a25(_0x787271){return _0x521302[$_0x5780('\x30\x78\x31\x33\x65','\x52\x5a\x77\x72')+'\x66\x4d'](_0x521302[$_0x5780('\x30\x78\x34\x35','\x4b\x73\x48\x58')+'\x66\x4d'](_0x521302[$_0x5780('\x30\x78\x31\x33\x65','\x52\x5a\x77\x72')+'\x66\x4d'](_0x521302[$_0x5780('\x30\x78\x61\x31','\x29\x72\x71\x78')+'\x72\x6d'],_0x787271)+'\x7e',_0x521302[$_0x5780('\x30\x78\x31\x32','\x71\x75\x31\x47')+'\x41\x75'](_0x5b6292,_0x787271)),_0x521302[$_0x5780('\x30\x78\x66\x33','\x30\x33\x4e\x46')+'\x45\x71']);}

按上面步骤还原:

function _0x451a25(_0x787271) {return "sign=" + _0x787271 + "~" + _0x5b6292(_0x787271) + "; path=/";
}

所以整体逻辑可以变为

function _0x451a25(_0x787271) {return "sign=" + _0x787271 + "~" + _0x5b6292(_0x787271) + "; path=/";
}var timestamp = new Date().valueOf()
_0x30c194(_0x451a25(timestamp))//等价于
_0x30c194("sign=" + timestamp + "~" + _0x5b6292(timestamp) + "; path=/")

****************** 关键逻辑部分 ******************

这里只需要 分析 _0x5b6292(timestamp) 即可。

看下 _0x5b6292 的 toString():function _0x5b6292(_0x141932){return _0x521302[$_0x5780('\x30\x78\x62\x34','\x41\x6f\x23\x33')+'\x41\x75'](_0x2e58ec,_0x141932);}

还原后等价于:_0x2e58ec(timestamp)

再继续分析  _0x2e58ec 。看下 _0x2e58ec 的 toString():"function _0x2e58ec(_0x2dd05e,_0x2bf8cf,_0x597aa3){return _0x2bf8cf?_0x597aa3?_0x521302[$_0x5780('\x30\x78\x62\x39','\x4b\x73\x48\x58')+'\x6c\x75'](_0x5b6292,_0x2bf8cf,_0x2dd05e):_0x521302[$_0x5780('\x30\x78\x31\x31\x30','\x43\x34\x4e\x62')+'\x44\x44'](_0x1af341,_0x2bf8cf,_0x2dd05e):_0x597aa3?_0x521302[$_0x5780('\x30\x78\x63\x32','\x69\x65\x46\x51')+'\x4d\x6d'](_0x1091df,_0x2dd05e):_0x521302['\x75\x6d\x74'+'\x4e\x65'](_0x289aa2,_0x2dd05e);}"

还原后等价于:_0x289aa2(timestamp)

继续分析 _0x289aa2 。看下 _0x289aa2 的 toString():function _0x289aa2(_0x22d83d){return _0x521302[$_0x5780('\x30\x78\x33\x37','\x5d\x57\x5a\x62')+'\x4d\x6d'](_0x554ed6,_0x1091df(_0x22d83d));}

还原后等价于:_0x554ed6(_0x1091df(timestamp))

总体逻辑等价于:_0x554ed6(_0x3f26c9(_0x161382(timestamp)))

_0x161382.toString():function _0x161382(_0x3dad10){return unescape(_0x521302[$_0x5780('\x30\x78\x34\x62','\x52\x5a\x77\x72')+'\x4d\x6d'](encodeURIComponent,_0x3dad10));}

还原后等价于:function _0x161382(timestamp){return unescape(encodeURIComponent(timestamp));}

整体逻辑等价于:_0x554ed6(_0x3f26c9(unescape(encodeURIComponent(timestamp))))

var timestamp = new Date().valueOf()
var encode_timestamp = unescape(encodeURIComponent(timestamp))
_0x554ed6(_0x3f26c9(encode_timestamp))

_0x3f26c9.toString():function _0x3f26c9(_0x4b9199){return _0x2b5e04(_0x1cb205(_0x17d11d(_0x4b9199),_0x521302[$_0x5780('\x30\x78\x64\x39','\x5e\x74\x58\x6a')+'\x43\x73'](0x8,_0x4b9199[$_0x5780('\x30\x78\x65\x30','\x55\x74\x46\x4b')+$_0x5780('\x30\x78\x35\x30','\x39\x2a\x79\x29')])));}

还原后等价于:

后面就是 抠  _0x554ed6  和 _0x3f26c9 的代码,然后执行 js 即可得到。。。。。。

JS 逆向 --- 过无限debugge、hook、js混淆还原、控制流混淆相关推荐

  1. js 模拟点击_爬虫js逆向之无限debugger--抖音第三方数据分析平台的坑

    爬虫js逆向系列 我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现,这三方面解析,供大家参考爬虫认知 在程序猿所有的方向中,爬虫是离money最近的一个方向,你 ...

  2. js逆向之有道词js加密解析

    js逆向之有道词js加密解析 文章目录 js逆向之有道词js加密解析 需要用到的工具: 下面就介绍一下3种看js加密的代码方法: 第一种方法: 第二种: 第三种: 下面我们来了解我们要用什么解密md5 ...

  3. 【JS逆向】魔改Node JS补环境框架

    [JS逆向]魔改Node JS补环境框架 前言 魔改Node Js补环境框架 内置模块wanfeng 内置对象Utils node框架使用说明 js框架简介 注意事项 警告 赞助 结束语 前言 由于J ...

  4. 知乎登录js逆向及文章爬取js逆向

    知乎登录js逆向及文章爬取js逆向 **在此声明:**本文章仅仅用于学习交流,不得用于商业活动. 登录支持账号密码登录及知乎移动端软件扫码登录. 文章爬取是把原文章的原样近似爬取,包括图片,链接,及评 ...

  5. 【JS逆向】无限debugger实战之八仙过海,各显神通。

    这里来说debugger这个东西,其实debugger只是算反调试的一部分,首先我们先理解一下这个debugger这个东西 声明:本文只作学习研究,禁止用于非法用途. 1.debugger 语句用于停 ...

  6. 【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:加速乐加密 ...

  7. android图片混淆还原,图片混淆还原1.2版本

    <图片混淆还原1.2版本>是一款能高度还原图片的手机软件,不论是受损还是图片的画质太低,都是能进行一定程度的调整和恢复的哦!将最好的图片效果带给你,全新图片体验效果,感兴趣的用户快和小编一 ...

  8. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集

    点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 嘿,大家好,截止今天咸鱼零零散散分享爬虫.数据分析基础和 Web 的内容已 ...

  9. 【瑞数5】浅谈某普期刊JS逆向的环境检测点

    [瑞数5]浅谈某普期刊JS逆向的环境检测点 前言 JS加载流程 第一个JS 第二个JS 第三个JS AST简单解混淆 环境检测 前奏 异步执行JS流程 高潮 运行结果 总结 鸣谢 前言 这几天把某期刊 ...

最新文章

  1. SharePoint 2013 创建一个搜索中心和搜索设置
  2. 计算机网络.doc,计算机网络network.doc
  3. jzoj5363-[NOIP2017提高A组模拟9.14]生命之树【启发式合并,Trie】
  4. 横扫阿里、滴滴、美团后,阿里程序媛整理出这份厚厚的面经!
  5. seo模拟点击软件_网站外链在SEO优化过程中不可或缺 - 360排名点击软件
  6. 30+简约和平铺的WordPress复古主题
  7. multisim红绿灯元器件在哪里_实验二Multisim交通灯仿真.ppt
  8. 都说谷歌浏览器好用,网页翻译插件必不可少
  9. HTML布局方式Flex属性详解
  10. 时域特征提取_EEG信号特征提取算法
  11. 微信小程序集成腾讯IM,实现实时音视频通话,1V1聊天
  12. socket是一个编程接口
  13. 微信公众号菜单html5,Vue.js 实现微信公众号菜单编辑器功能(一)
  14. MIT博士研发绘画机器人Utensil,精通绘画和激光切割
  15. 第2章【综合练习题】“大润发”、“沃尔玛”、“好德”和“农工商”四个超市都卖苹果、香蕉、橘子和芒果四种水果。使用NumPy的ndarray实现以下功能。
  16. 几种代表性的相控阵系统简介
  17. windows ninja 安装
  18. Web服务器处理HTTP压缩之gzip、deflate压缩
  19. 脂代谢及高脂血症的检查题库【1】
  20. VBA-拆分多个工作簿

热门文章

  1. 你确定自己不是那只猫吗
  2. 美团点评联盟广告场景化定向排序机制
  3. 会议交流 | DataFunSummit 知识图谱在线峰会——链接知识图谱最前沿技术和最落地产业化应用的桥梁!...
  4. 【NLP-NER】命名实体识别
  5. 吴恩达【深度学习工程师】 04.卷积神经网络 第四周特殊应用(2)神经风格转换...
  6. mybatis异常invalid comparison: java.util.Date and java.lang.String
  7. 转--javascript 数组
  8. 00003-回文数的判定-leetcode-解法不唯一,1.reverse最简单,2.数学方法很有意思
  9. 数据库基础知识——DQL语言(一)
  10. 【剑指offer】面试题38:字符串的排列(Java)