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 相关文章推荐
初学prototype,发个JS接受URL参数的代码
Sep 25 Javascript
json的前台操作和后台操作实现代码
Jan 20 Javascript
JavaScript中window、doucment、body的解释
Aug 14 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
Oct 25 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 Javascript
深入理解ES7的async/await的用法
Sep 09 Javascript
Koa 中的错误处理解析
Apr 09 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
Aug 29 Javascript
Ajax请求超时与网络异常处理图文详解
May 23 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解析url的三个示例
2014/01/20 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php二维码生成以及下载实现
2017/09/28 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
Javascript Math对象
2009/08/13 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
Python多线程编程简单介绍
2015/04/13 Python
理解Python中函数的参数
2015/04/27 Python
Python简单实现enum功能的方法
2016/04/25 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
生产部管理制度
2014/01/31 职场文书
小学毕业感言300字
2014/02/19 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
2014教师研修学习体会
2014/07/08 职场文书
中学教师个人总结
2015/02/10 职场文书
七一晚会主持词
2015/06/29 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS