JS中注入eval, Function等系统函数截获动态代码


Posted in Javascript onApril 03, 2019

现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行。

动态执行js代码无非两种方法,即eval和Function。那么,不管网站加密代码写的多牛,我们只要将这两个方法hook住,即可获取到解密后的可执行js代码。

注意,有些网站会检测eval和Function这两个方法是否原生,因此需要一些小花招来忽悠过去。

挂钩代码

首先是eval的挂钩代码:

(function() {
  if (window.__cr_eval) return
  window.__cr_eval = window.eval
  var myeval = function (src) {
    console.log("================ eval begin: length=" + src.length + ",caller=" + (myeval.caller && myeval.caller.name) + " ===============")
    console.log(src);
    console.log("================ eval end ================")
    return window.__cr_eval(src)
  }
  var _myeval = myeval.bind(null)
  _myeval.toString = window.__cr_eval.toString
  Object.defineProperty(window, 'eval', { value: _myeval })
  console.log(">>>>>>>>>>>>>> eval injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();

这段代码执行后,之后所有的eval操作都会在控制台打印输出将要执行的js源码。

同理可以写出Function的挂钩代码:

(function() {
  if (window.__cr_fun) return
  window.__cr_fun = window.Function
  var myfun = function () {
    var args = Array.prototype.slice.call(arguments, 0, -1).join(","), src = arguments[arguments.length - 1]
    console.log("================ Function begin: args=" + args + ", length=" + src.length + ",caller=" + (myfun.caller && myfun.caller.name) + " ===============")
    console.log(src);
    console.log("================ Function end ================")
    return window.__cr_fun.apply(this, arguments)
  }
  myfun.toString = function() { return window.__cr_fun + "" }
  Object.defineProperty(window, 'Function', { value: myfun })
  console.log(">>>>>>>>>>>>>> Function injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();

注意和eval不同,Function是个变长参数的构造方法,需要处理this

另外,有些网站还会用类似的机制加密页面内容,然后通过document.write输出动态解密的内容,因此同样可以挂钩document.write,挂钩方法类似eval,这里就不重复了。

注入方式

另外,还有个问题需要关注,就是挂钩代码的注入方法。

最简单的就是F12调出控制台,直接执行上面的代码,但这样只能hook住之后的调用,如果希望从页面刚加载时就注入,那么可以用以下几种方式:

  • 油猴注入,油猴可以监听文档加载的几种不同状态,并在特定时刻执行js代码。我没有太多研究,具体请参见油猴手册
  • 代理注入,修改应答数据,在<head>标签内的第一个位置插入<script>节点,确保在其它js加载执行前注入;Fiddler, anyproxy等都可以编写外部规则,具体请参见代理工具的手册
  • 使用chrome-devtools-protocol, 通过Page.addScriptToEvaluateOnNewDocument注入外部js代码

Fiddler代理规则

不少人没用过代理规则,这里写一下Fiddler的规则编写方法:

Fiddler菜单里Rules > Customize Rules 打开脚本编辑器

在脚本编辑器里找OnBeforeResponse方法,方法内添加下面代码:

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
  oSession.utilDecodeResponse(); // Remove any compression or chunking
  var b = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
  var r = /<head[^>]*>/i;
  var js = "..."; // 要注入的js源码
  b = b.replace(r, "$0<script>" + js + "</script>");
  oSession.utilSetResponseBody(b); // Set the response body back
}

这样就会在所有html文档头部自动添加js代码了

总结

以上所述是小编给大家介绍的JS中注入eval, Function等系统函数截获动态代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 Javascript
javascript合并表格单元格实例代码
Jan 03 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
Jan 08 Javascript
AngularJS constant和value区别详解
Feb 28 Javascript
微信小程序 template模板详解及实例代码
Mar 09 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
Mar 23 Javascript
canvas绘制折线路径动画实现
May 12 Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 #Javascript
elementUI多选框反选的实现代码
Apr 03 #Javascript
vue生命周期的探索
Apr 03 #Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 #Javascript
详释JavaScript执行环境与执行栈
Apr 02 #Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 #Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 #Javascript
You might like
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
chrome调试javascript详解
2015/10/21 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
售前工程师职业生涯规划
2014/03/02 职场文书
文化宣传方案
2014/03/13 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
思想品德评语大全
2014/12/31 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL