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

 

访问这个网站的时候,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 即可得到。。。。。。

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人时代的资本主义:21世纪的工作,收入和财富

来源&#xff1a;资本实验室摘要&#xff1a;关于人工智能、机器人、自动化的未来&#xff0c;每天都有无数的讨论。乐观、向往、欢迎&#xff1b;悲观、担心、抗拒……每个人都有自己的态度和心理。聚焦前沿科技创新与传统产业升级关于人工智能、机器人、自动化的未来&#xf…

android

启动activity: Intent intentnew Intent(this, SignInActivity.class); startActivity(intent); 创建一个发邮件的activity Intent intentnew Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL,recipientArray); startActivity(intent); Figure 1. The activi…

JavaScript 逆向 ( 一 ) --- JavaScript 语法基础

js 逆向&#xff1a;https://www.cnblogs.com/wuxianyu/category/1940304.html js逆向2&#xff1a;https://www.cnblogs.com/wuxianyu/category/1941486.html JS 中的类型转换&#xff1a;https://segmentfault.com/a/1190000013679224 1、JavaScript 基础 菜鸟教程 JavaScrip…

解释深度学习的新角度,来自光学的启发

来源&#xff1a;网络大数据摘要&#xff1a;谷歌技术人员、MIT博士Ali Rahimi受光学的启发&#xff0c;从功能模块化和层级的角度讨论了一种解释深度学习的新思路。深度学习已经成熟到可以教给高中生了么?我思考的这个问题&#xff0c;源于不久前我收到的⼀封来自某大公司产品…

jQuery 结构分析

jquery核心 转自http://www.iteye.com/topic/783260 (function( window, undefined ) { // 构造jQuery对象 var jQuery function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); } // 工具函数 Utilities // 异步队列 Deferred // 浏览…

北京航空航天大学王田苗教授:当前智能机器人发展若干挑战性问题

来源&#xff1a;雷锋网摘要&#xff1a;2018 全球人工智能与机器人峰会&#xff08;CCF-GAIR&#xff09;在深圳召开&#xff0c;峰会由中国计算机学会&#xff08;CCF&#xff09;主办&#xff0c;雷锋网、香港中文大学&#xff08;深圳&#xff09;承办&#xff0c;得到了宝…

JavaScript 中的 require / exports、import / export、浅谈JavaScript、ES5、ES6

Node.js 的基础教学 之 exports 和 module.exports&#xff1a;https://zhuanlan.zhihu.com/p/82057593 浅谈 JavaScript、ES5、ES6&#xff1a;https://www.cnblogs.com/lovesong/p/4908871.html 1、为什么有模块概念 理想情况下&#xff0c;开发者只需要实现核心的业务逻辑&…

深度 | 智慧城市背景下的“多规合一”标准探究

来源&#xff1a;《技术与应用》 作者&#xff1a;杜青峰 万碧玉 王益 吴丽丽 王树东 姜栋 摘要&#xff1a;在参与智慧城市标准综合评价系统研发过程中&#xff0c;研究我国目前城市规划标准的现状&#xff0c;总结了我国现有城市规划标准中存在的自成标准、内容冲突、缺乏衔接…

Windows Terminal完整指南

原文&#xff1a;Windows Terminal: The Complete Guide&#xff1a;https://www.sitepoint.com/windows-terminal/ From&#xff1a;https://zhuanlan.zhihu.com/p/272082726 github&#xff1a;https://github.com/microsoft/terminal Windows Terminal&#xff0c;它是 WS…

谁将引领5G标准?

来源&#xff1a;中国知识产权杂志作者&#xff1a;王活涛 郑友德 沈剑锋 袁真富中国企业的5G技术创新之所以能不断取得突破性的成果&#xff0c;在全球通信标准上占有一定的“话语权”&#xff0c;在很大程度上得益于中国企业对技术创新的大力投入和发明专利积累。截止2018年6…

Python 操作 Kafka --- kafka-python

kafka-python&#xff1a;https://github.com/dpkp/kafka-python kafka-python 文档&#xff1a;https://kafka-python.readthedocs.io/en/master/apidoc/modules.html kafka 官方文档&#xff1a;http://kafka.apache.org/documentation.html Python 操作 Kafka 的通俗总结&a…

k8s 基本使用

Kubernetes 编排系统&#xff1a;https://www.cnblogs.com/gaoyuechen/p/8685771.html k8s 集群中的 yaml 文件详解&#xff1a;https://blog.csdn.net/qq_28361541/article/details/106089574 什么是 k8s&#xff0c;k8s 有什么功能 ? &#xff1a;https://www.jianshu.com…

全球芯片行业现状分析:大家都在依赖美国 未来如何破局?

来源&#xff1a;网易智能翻译&#xff1a;乐邦香港媒体《南华早报》近日发文称&#xff0c;中国依赖于美国的核心技术已有一定的时日&#xff0c;但全世界都是如此&#xff0c;美国在半导体制造领域无可撼动的领先优势&#xff0c;是50多年的研发成果。随着中兴事件进入下一个…

AI企业下一个使命:让生物特征数据使用走向阳光透明

来源&#xff1a;亿欧网摘要&#xff1a;时隔一年&#xff0c;生物特征识别技术不断被完善&#xff0c;公众的生物特征数据仍然每天被传感器收集汇总&#xff0c;但是对于生物特征数据的收集、储存、使用和流通仍然是半遮半掩的灰色区域&#xff0c;各方好像都等着导火索的出现…

命令行 浏览器

使用命令行浏览器在 Linux 终端上网浏览 我猜你阅读这篇文章可能是用 Firefox 或基于 Chrome 的浏览器&#xff08;如 Brave&#xff09;&#xff0c;或者&#xff0c;也可能是 Chrome 浏览器或 Chromium。 换句话说&#xff0c;你正在利用基于 GUI 的方式浏览网页。然而&…

重磅来袭,机器人四大家族财务报表大揭秘

来源&#xff1a;华尔街见闻摘要&#xff1a;四大家族实力强劲&#xff0c;在机器人技术与市场占有率上遥遥领先。在2015年之前&#xff0c;四大家族在全球的市占率在50%以上&#xff0c;而随着全球许多细分领域机器人厂商的崛起以及《中国制造2025》推动下国内厂商的发展&…

Python 定时任务框架 apscheduler

github 地址&#xff1a;https://github.com/agronholm/apscheduler apscheduler 基本概念介绍 说到定时任务&#xff0c;会想起 linux 自带的 crontab &#xff0c;windows 自带的任务计划&#xff0c;都可以实现守时任务。操作系统基本都会提供定时任务的实现&#xff0c;但是…

一文看懂人工智能产业链,未来10年2000亿美元市场

来源&#xff1a;传感器技术摘要&#xff1a;据腾讯研究院统计&#xff0c;截至2017年6月&#xff0c;全球人工智能初创企业共计2617家。美国占据1078家居首&#xff0c;中国以592家企业排名第二&#xff0c;其后分别是英国&#xff0c;以色列&#xff0c;加拿大等国家。根据艾…

如何跟机器人“抢”工作?专家:新的分工将形成

来源&#xff1a;经济日报摘要&#xff1a;随着人工智能技术的深度发展和机器人的广泛应用&#xff0c;人们会从许多传统生产活动中解放出来&#xff0c;有了更多闲暇时间&#xff0c;更强大的支持手段&#xff0c;让生活更有趣和丰富多彩。创新、创意会成为生活和工作中的必需…

互联网让我们变笨了吗:过去10年关于大脑的11个有趣发现

来源&#xff1a;资本实验室摘要&#xff1a;人类大脑&#xff0c;长期以来被认为科学和宇宙中最复杂的事物之一。鉴于其复杂性&#xff0c;受制于技术限制&#xff0c;过去科学家很难解开其内部运作的秘密&#xff0c;但目前的研究成果表明我们离秘密又近了一些。聚焦前沿科技…