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 回调函数中变量作用域的讨论
Sep 11 Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
Apr 11 Javascript
Jquery组件easyUi实现表单验证示例
Aug 23 Javascript
判断颜色是否合法的正则表达式(详解)
May 03 Javascript
Webpack实现按需打包Lodash的几种方法详解
May 08 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
Node.js学习教程之Module模块
Sep 03 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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php 生成短网址原理及代码
2014/01/23 PHP
php获取apk包信息的方法
2014/08/15 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
php实现URL加密解密的方法
2016/11/17 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
mongodb和php的用法详解
2019/03/25 PHP
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
Python实现元素等待代码实例
2019/11/11 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
python实现udp传输图片功能
2020/03/20 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
工会主席岗位责任制
2014/02/11 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
酒店温馨提示语
2015/07/14 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS