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 相关文章推荐
匹配任意字符的正则表达式写法
Apr 29 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
jquery获取复选框被选中的值
Mar 22 Javascript
js判断复选框是否选中及选中个数的实现代码
May 30 Javascript
AngularJS页面传参的5种方式
Apr 01 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
vue实现商品加减计算总价的实例代码
Aug 12 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
Aug 20 Javascript
Vue作用域插槽slot-scope实例代码
Sep 05 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
Feb 16 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
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
PHP session 会话处理函数
2016/06/06 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
js实现返回顶部效果
2017/03/10 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
python调用自定义函数的实例操作
2019/06/26 Python
Django 用户认证组件使用详解
2019/07/23 Python
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
人事部主管岗位职责
2013/12/26 职场文书
职业生涯规划书的格式
2013/12/29 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
年度考核评语
2014/01/19 职场文书
质量安全标语
2014/06/07 职场文书
党员剖析材料范文
2014/09/30 职场文书
委托书格式范文
2015/01/28 职场文书
营业员岗位职责范本
2015/04/14 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
html5表单的required属性使用
2021/07/07 HTML / CSS
Java使用JMeter进行高并发测试
2021/11/23 Java/Android