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 相关文章推荐
Ext.MessageBox工具类简介
Dec 10 Javascript
javascript showModalDialog 内跳转页面的问题
Nov 25 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
jQuery树形控件zTree使用小结
Aug 02 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
在vue中使用setInterval的方法示例
Apr 16 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 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/09/23 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Python制作数据导入导出工具
2015/07/31 Python
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
不可错过的十本Python好书
2017/07/06 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
flask中过滤器的使用详解
2018/08/01 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
python 制作简单的音乐播放器
2020/11/25 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
我爱我家教学反思
2014/05/01 职场文书
幼儿园运动会口号
2014/06/07 职场文书
公共场所禁烟标语
2014/06/25 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
总经理岗位职责范本
2015/04/01 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
python 管理系统实现mysql交互的示例代码
2021/12/06 Python