某网站高度加密混淆的javascript的分析

news/2024/4/27 6:15:19/文章来源:https://blog.csdn.net/weixin_33709590/article/details/88705632

对某网站加密混淆后的javascript代码也算分析了一段时间了,虽然还没搞出来,但多少有些心得,这里记录一下。

工具和资料

  • 前一篇文章 - 记录了之前尝试的一些初步研究成果
  • awesome-java-crawler - 我收集的爬虫相关工具和资料
  • java-curl - java HTTP库,可用来替换chrome网络后端,更方便控制底层行为,如缓存、代理、监控、修改请求和应答等
  • cdp4j - java版的Chrome Devtools Protocol实现,用于控制Chrome浏览器。最大的特点就是没有“特点”,你懂的……
  • beautifier.io - js代码在线格式化
  • estree - ECMAScript抽象语法树(AST)业界标准
  • ECMAScript262语言规范 - 帮助理解estree
  • acornjs - ECMAScript编译器前端,将js源码解析成estree格式的AST
  • astring - ECMAScript代码生成器,将AST重新还原成js源码
  • nashorn - java8以上自带的javascript解释器,性能接近原生node
  • java中调用npm模块 - 我的工作语言是java和kotlin,使用此方案调用js原生库
  • 商标局网站分析 - 类似的加密,神箭手云的大佬写的
  • 裁判文书网分析 - 另一篇类似网站分析
  • 很早的一篇分析文 - 看特征是这种加密的早期版本

分析过程

获取javascript代码

  • 加密的核心代码只有一小部分是直接写在网页的<script>里面的,大部分代码是eval出来的,还有部分是jsonp方式异步加载的
  • 可以用cdp4j监听Debugger.ScriptParsed事件,并在监听器中调用Debugger.getScriptSource来获取js代码文本
  • 这样是可以获取到所有前端javascript源码的,即使源码在网络应答中是加密的,但用eval执行前也会还原为合法的js源码
  • 为了方便分析,将代码保存为文件。该网站js会用定时器不断重复eval一段代码,因此可以用ScriptParsed.hash作为文件名,避免重复保存文件
  • 这样搞出来的,用一样的混淆方式加密的js代码共有4段,其中两段特别长是核心代码,还有两段应该是编解码算法,一共加起来约5000行

获取常量映射

  • 拿到js之后,格式化一下,发现还是一团乱麻,所有的变量,函数都是"_$xx",可读性等于0
  • 在Chrome控制台里试了一下,发现全局变量和函数都保存在window中了

    • 一部分无参的函数调用,其实返回的就是常量字符串
    • 还有一些_$xx.call的,看了一下,其实就是系统方法,比如String.fromCharCode,Array.prototype.slice等
  • 因此可以编写一段控制台脚本,遍历window对象中所有形似_$xx的成员,判断其类型和函数执行结果。这样即可将常量字符串映射、系统方法映射等搞出来

可读性还原

  • 拿到映射关系之后是不是简单用正则表达式替换回去就万事大吉了呢?哪有那么简单!函数的局部变量、局部函数有很大可能性和全局变量重名,如果用正则无脑替换回去绝对会被坑死!!要是代码少倒也罢了,这里可有5000行代码,差之毫厘谬以千里!
  • 另外,不同函数的局部变量也存在大量重名,静态分析时干扰严重。因此,应该将局部变量也替换成唯一且更有意义的名字,比如<函数名>_<变量索引>
  • 因此,正确的方法是基于编译原理进行语法级别的替换。看到这里是不是要弃疗了?老子爬点数据还要写编译器?!
  • 还好,js上已经有很成熟的业界标准和若干老练的第三方库了,至少不用从龙书搞起……
  • 我这里选择了acornjs和astring,前者用于将js源码解析成抽象语法树AST,后者将AST还原成js源码。当然,有了AST就可以上下其手了……
  • 为了在java代码中运行acornjs和astring,请参见参考中《java中调用npm模块》一文。注意astring还依赖endswith和repeat两个polyfill,均可以npm下载到
  • 简单描述一下AST变换算法。用acorn.parse()搞到AST之后,递归扫描每个节点:

    • 进入每个FunctionDeclaration/FunctionExpression节点前,创建一个新的作用域对象放到栈顶,里面放该域内所有局部变量(含函数参数)和新名称的映射表;退出时将栈顶弹出
    • 遇到Identifier节点,首先在作用域栈中自顶向下依次寻找当前变量名,找到了,则是本方法局部变量或闭包外局部变量,用新名字替换之;否则,则是全局变量,去映射表中查找替换之
    • 注意,遇到CallExpression须特殊处理,前面的AST变换只涉及修改标识符名,而为了将_$xx()变换为"xxx",则涉及到结构变换,要把CallExpression节点修改为Literal节点并添加value属性
  • 全部处理完成后,就可以用astring.generate()产生还原后的代码了

代码分析

上面步骤完成后,这代码至少勉强能看了,别放松,后面还有无数的坑……
还原前的代码只能是让人一脸懵逼,还原后的代码则足以让人咬牙切齿啊,多大仇啊,满满登登5000行全是正面硬怼的……
我现在也就还徘徊在这一步,这里先记录一部分已经发现的反破解手法吧。

不断主动中断干扰调试,并检测是否有动态分析行为

    var eI_v1 = window["eval"]("(function() {var a = new Date(); debugger; return new Date() - a > 100;}())");_$n1 = _$n1 || eI_v1;//这个在上篇文章分析了,在这找到调用来源了。注意,在可读性还原之前这货长这样:var _$pW = _$u9[_$mz()](_$oi());_$n1 = _$n1 || _$pW;

js代码动态混淆

  • 上一篇文章已经说过了,每次刷新js代码都会完全变化,包括全局/局部变量名、函数排列顺序等
  • 设断点会被干扰,且代码无法重复执行对于调试意味着什么?

检查关键函数是否被注入替换

    function __RW_checkNative(rh_p0, rh_p1) { // 函数名我手动改的try {var rh_v2 = Function["prototype"]["toString"]["apply"](rh_p0);var rh_v3 = new RegExp("{\\s*\\[native code\\]\\s*}");if (typeof rh_p0 !== "function" || !rh_v3["test"](rh_v2) || rh_p1 != undefined && rh_p0 !== rh_p1) __GL_undefined_$sy = true;} catch (_$r0) {}}
  • 会用这个函数检测eval, Function, setTimeout, setInterval几个系统函数是不是被注入了
  • 知道这块逻辑,就可以用一些手段骗过去,不知道的话……

检测当前窗口是否隐藏状态

document["addEventListener"]("visibilitychange", _$r0);
  • 会监控当前窗口是否在最上方,如果多开浏览器并行爬取……

检测Selenium, WebDriver, PhantomJS等

      var rm_v5 = "_Selenium_IDE_Recorder,_selenium,callSelenium", rm_v6 = "__driver_evaluate,__webdriver_evaluate,__selenium_evaluate,__fxdriver_evaluate,__driver_unwrapped,__webdriver_unwrapped,__selenium_unwrapped,__fxdriver_unwrapped,__webdriver_script_func,__webdriver_script_fn", rm_v7 = ["selenium", "webdriver", "driver"];if (_$un(window, "callPhantom,_phantom")) { ... }
  • 看到这里想必就知道会发生些什么了……

Hook住AJAX

  var ec_v4 = window["XMLHttpRequest"];if (ec_v4) {var ec_v5 = ec_v4["prototype"];if (ec_v5) {__GL_f_open = ec_v5["open"];__GL_f_send = ec_v5["send"];ec_v5["open"] = function () {_$t5();arguments[1] = _$pK(arguments[1]);return __GL_f_open["apply"](this, arguments);};} else { ... }}
  • 具体还没深入研究,目前所知是会在所有ajax请求后添加一个加密参数,参数值中可能包括鼠标轨迹等信息

检查navigator是否是伪造的

  var hi_v14 = window["navigator"];for (hi_v11 in hi_v14) {try {hi_v13 = hi_v14["hasOwnProperty"](hi_v11);} catch (_$r0) {hi_v13 = false;}}
  • 如果你注入的navigator对象是用{...}创建的水货版本,那就露馅了……

检查浏览器特征

  • 这块代码很长很复杂,还没分析完,现在能看出来的包括:
    navigator.languages - 在headless chrome中是没有这个字段的
    navigator.plugins - 无头和有头的chrome返回的插件列表不一样

WebGL能力检查

  • 有一大段代码是在canvas上用webgl绘图,没搞过webgl,现在还不明白,但肯定也是检查浏览器特征手段之一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_832240.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11个最值得Java开发者收藏的网站

概述&#xff1a;Java是一种面向对象的编程语言&#xff0c;由Sun Microsystems公司在1995年的时候正式发布。直到今天&#xff0c;Java都一直是最受欢迎的编程语言之一。如今&#xff0c;Java应用于各种各样的技术领域&#xff0c;例如网站开发、Android开发、游戏开发、大数据…

30分钟让网站支持HTTPS

转载自码农网这里我会指导大家如何轻松搞定在你的网站上使用HTTPS。我不是安全专家也不是搞服务器的&#xff0c;所以这对我而言也是一种有趣的经历&#xff0c;而记录这个过程可以让其他任何人也能很快地做到这些。包括一些暂时的停顿时间&#xff0c;我总共只花了20-30分钟。…

「镁客早报」特斯拉标准版Model3正式上市,售价3.5万美元;百度被爆搜索小学和幼儿园会导向色情网站...

Facebook、谷歌在英国或将面临数十亿美元罚款&#xff1b;自动驾驶创业公司DriveAI寻求“卖身”&#xff0c;曾估值2亿美元。 1、特斯拉标准版Model3正式上市&#xff0c;售价3.5万美元 今日&#xff0c;特斯拉宣布标准版Model3正式上市&#xff0c;售价为3.5万美元。目前&am…

跨屏网站建设要如何规划,注意5点

2019独角兽企业重金招聘Python工程师标准>>> 跨屏网站建设该怎么规划&#xff1f;在建设跨屏网站的时候要如何做才可以让用户拥有更高的体验度&#xff1f;确实&#xff0c;想要设计出一个优质的跨屏网站的话需要注意的细节是非常多的&#xff0c;我们首先要做的是对…

2021 chrome 更新跨域规则,将对网站造成影响

chrome 更新跨域规则&#xff0c;将对网站造成影响 在 chrome v94 之后&#xff0c;之前没有问题的网站接口请求现在出现了错误&#xff1a; Access to Css stylesheet at ‘http:xx’ from origin ‘http://xx‘ has been blocked by CORS policy: The request client is not…

聊聊制作网站那些事

点击链接&#xff1a;我的第一个响应式网站 直接开门见山也不啰嗦了。 有很多小伙伴都问我响应式网站怎么做&#xff1f;但是做响应式网站又并非易事。 自己做响应式网站分为两种&#xff1a; 一、自己动手一个一个代码打出来&#xff0c;这种情况下你的网站实现响应式的几…

由于您访问的url有可能对网站造成安全威胁_网站索引量下降怎么办?

导致百度索引量下降的常见原因--一、网站方原因1、内容数据所在的网址url未规范统一【自己站点url规范统一】多域名都可以200状态正常访问网页内容&#xff1b;一域名下出现多种url形式可以访问相同内容&#xff0c;如大小写url、url规则变更等。解决&#xff1a;选择主域名(或…

python能开发网站吗_python可以开发网站吗

python可以开发网站&#xff0c;python在web开发方面强大的开发框架是django。做网站开发之前&#xff0c;同样要掌握一些python的基础语法。 1、python基础&#xff0c;因为用python开发的&#xff0c;所以python指定要会&#xff0c;最起码你也得会条件判断&#xff0c;循环&…

配置ssl证书_给自己的网站主页配置ssl证书

使用https?可以防止数据在传输过程中产生一些不必要的泄露&#xff0c;未?的页面在经过ssl证书的签发后会变成https开头&#xff0c;下面记录一下配置https加密的整个过程购买域名首先第一步我们为了防止自己的公网ip暴露出去&#xff0c;需要给自己的网站设定一个全球唯一的…

php网页框架模板,用PHP制作静态网站的模板框架(四)

用PHP制作静态网站的模板框架(四)更新时间&#xff1a;2006年10月09日 00:00:00 作者&#xff1a;静态网站的模板框架首先&#xff0c;我们象前面一样为所有的页面公用元素以及页面整体布局编写模板文件&#xff1b;然后从所有的页面删除公共部分&#xff0c;只留下页面内容&…

泰山200机架服务器包含哪些型号_网站站内优化步骤都有哪些呢

想要自己的网站展现在大众面前&#xff0c;对网站的优化是必不可少的&#xff0c;那么&#xff0c;在对网站优化的时候除了对网站的内容作出专业性强的展示&#xff0c;也要对网站的优化路线进行一个全面的规划&#xff0c;今天就来说一下网站的站内优化主要需要进行哪些操作呢…

phoenix 根据条件更新_企业网站seo优化,百度算法经常更新要怎么解决?

很多进行seo优化的朋友都在为百度快照更新带来的残酷脱毛而苦恼。解决百度算法更新的顾问&#xff1a;百度算法更新是我们每个优化人员最头疼的事情&#xff0c;更新后无数网站k、强权、排名登陆&#xff0c;所以很多优化的人跟随百度算法&#xff0c;在这里&#xff0c;我来说…

asp抓取网页某个标签内的_站内SEO最容易忽略的一些优化细节

网站需要做SEO优化&#xff0c;是每个站长都知道的事情&#xff0c;很多站长觉得自己网站的SEO优化管理工作环境就是发发文章&#xff0c;做做外链&#xff0c;再详细点就是在进行前期建站的时候&#xff0c;做些网站主要代码简化&#xff0c;robots的设置问题以及相关链接、导…

网博士cases_list_to_html.asp,校园网站的设计与实现

马场中学校园网站的设计与实现德育工作&#xff1a;是学校德育工作的窗口&#xff0c;也是对学生进行德育宣传的主要手段&#xff0c;同时还是教师为人师表的窗口之一。安全工作&#xff1a;以学校政策法规室和保卫科为主要服务对象&#xff0c;主要是对学生进行各种相关的人生…

如何复用linux内存管理算法,分配页 - Linux内存管理伙伴算法_Linux编程_Linux公社-Linux系统门户网站...

伙伴系统中用于分配页的函数如下&#xff1a;alloc_pages(mask,order)分配2^order页并返回一个struct page的实例&#xff0c;表示分配的内存块的起始页。alloc_page(mask)是前者在order0情况下的简化形式&#xff0c;只分配一页。get_zeroed_page(mask)分配一页并返回一个page…

学术源代码网站

今天发行一个学术源代码的网站 可代码下载学习网站 比起这些国内要币的 好太多了 https://yarpiz.com/

vue给元素设置css_使用CSS变换为您的网站元素设置动画

我们都被移动的物体和不寻常的方向所吸引。动画效果可用于改善用户界面或吸引用户注意项目的重要部分。在这篇文章中&#xff0c;我将向您展示如何应用不同的转换来改善您网站的可用性和设计。CSS转换您可以使用CSS属性以多种不同方式对网站元素进行转换&#xff0c;从而为网站…

奇奇seo优化软件_湖南seo网站优化软件

湖南seoxaa0c1网站优化软件&#xff0c;这个互联网时代&#xff0c;谁也不愿意在网络上缺席&#xff0c;企业商家更不愿意放弃网络这个巨大的宣传渠道&#xff0c;他们纷纷在网络上建立自己的企业网站&#xff0c;并且对网站进行多种优化&#xff0c;获取更多的流量&#xff0c…

个人博客网站的设计与实现_51个漂亮的个人博客和自媒体网站

程序猿老橙&#xff1a;如何免费做个人博客网站-全过程最新版本​zhuanlan.zhihu.com具体操作过程看上面&#xff01;不管是设计师或是个人、明星、自媒体&#xff0c;都可以有自己的个人网站或博客&#xff0c;在做这网站之前当然是不少得设计一个漂亮的界面&#xff0c;这样能…

JAVA对接百度API提交普通收录/SEO

JAVA对接百度API提交普通收录/SEO 说明&#xff1a; 为了增加内容的曝光量&#xff0c;除了主动让百度爬虫爬取之外&#xff0c;还有普通收录的API提交&#xff0c;程序主动向百度搜索推送资源&#xff0c;缩短爬虫发现网站链接的时间。 官网地址&#xff1a;http://data.zz.…