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 addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
浏览器兼容的JS写法总结
Apr 27 Javascript
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
Echarts基本用法_动力节点Java学院整理
Aug 11 Javascript
js精确的加减乘除实例
Nov 14 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
解决vue数组中对象属性变化页面不渲染问题
Aug 09 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
浅谈Webpack多页应用HMR卡住问题
Apr 24 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
JavaScript的Set数据结构详解
Feb 18 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生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
javascript引导程序
2008/10/26 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
深入研究React中setState源码
2017/11/17 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
python 域名分析工具实现代码
2009/07/15 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python pip如何手动安装二进制包
2020/09/30 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
食品安全演讲稿
2014/09/01 职场文书
委托公证书格式
2015/01/26 职场文书
归元寺导游词
2015/02/06 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
详解Python自动化之文件自动化处理
2021/06/21 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS