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 相关文章推荐
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
javascript里模拟sleep(两种实现方式)
Jan 25 Javascript
Javascript实现重力弹跳拖拽运动效果示例
Jun 28 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
纯js模仿windows系统日历
Feb 04 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
Jun 08 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
vue2.0全局组件之pdf详解
Jun 26 Javascript
深入理解React中何时使用箭头函数
Aug 23 Javascript
微信小程序实现列表的横向滑动方式
Jul 15 Javascript
JavaScript常用8种数组去重代码实例
Sep 09 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
php array的学习笔记
2012/05/16 PHP
php导出excel格式数据问题
2014/03/11 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
网页javascript精华代码集
2007/01/24 Javascript
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
js仿京东放大镜效果
2020/08/09 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
教你使用python画一朵花送女朋友
2018/03/29 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
django页面跳转问题及注意事项
2019/07/18 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
澳大利亚网上书店:QBD
2021/01/09 全球购物
毕业生写求职信的要点
2014/03/04 职场文书
婚前协议书怎么写
2014/04/15 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
统计工作个人总结
2015/03/03 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL