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 相关文章推荐
filemanage功能中用到的lib.js
Apr 08 Javascript
JS画线(实例代码)
Nov 20 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
Vue列表页渲染优化详解
Jul 24 Javascript
JScript实现表格的简单操作
Aug 15 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
Nov 26 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
小程序实现日历左右滑动效果
Oct 21 Javascript
JavaScript 中判断变量是否为数字的示例代码
Oct 22 Javascript
详解Vue的异步更新实现原理
Dec 22 Vue.js
性能优化篇之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
实现树状结构的两种方法
2006/10/09 PHP
基于文本的搜索
2006/10/09 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
使用Apache的rewrite
2021/03/09 Servers
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
财务人员个人求职信范文
2013/12/04 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python