资讯专栏INFORMATION COLUMN

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

godiscoder / 2286人阅读

摘要:前言对某网站加密混淆后的代码也算分析了一段时间了,虽然还没搞出来,但多少有些心得,这里记录一下。因此,应该将局部变量也替换成唯一且更有意义的名字,比如函数名变量索引因此,正确的方法是基于编译原理进行语法级别的替换。

前言

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

工具和资料

QQ群 - 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代码

加密的核心代码只有一小部分是直接写在网页的
处理前:一团乱麻,完全不知所云

处理后:虽然还很费劲,起码看得出来这是在挂各种事件监听器。另外,看看人家监听多少种事件啊……

代码分析

上面步骤完成后,这代码至少勉强能看了,别放松,后面还有无数的坑……
还原前的代码只能是让人一脸懵逼,还原后的代码则足以让人咬牙切齿啊,多大仇啊,满满登登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请求后添加一个加密参数MmEwMD,参数值中可能包括鼠标轨迹等信息

检查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,现在还不明白,但肯定也是检查浏览器特征手段之一

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42882.html

相关文章

  • 网站高度加密混淆javascript分析

    摘要:前言对某网站加密混淆后的代码也算分析了一段时间了,虽然还没搞出来,但多少有些心得,这里记录一下。因此,应该将局部变量也替换成唯一且更有意义的名字,比如函数名变量索引因此,正确的方法是基于编译原理进行语法级别的替换。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 对某网站加密混淆后的javascript...

    newsning 评论0 收藏0
  • 加密流程与原理简析

    摘要:前言啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。注意某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了这么长时间,基本上已经把某数的套路...

    dkzwm 评论0 收藏0
  • 加密流程与原理简析

    摘要:前言啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。注意某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了这么长时间,基本上已经把某数的套路...

    msup 评论0 收藏0
  • 在线视频常见加密方式及安全性透析

    摘要:协议由来已久,是公司推出的视频播放协议,稳定性和安全性较更好,应用广泛。但是加密算法过于简单,通过解密,即可实现本地观看。可以看到视频采用了的加密算法。目前尚无解密方案出现,安全级别极高。 信息化时代,多媒体的应用日渐成为人们生活中不可或缺的部分,无论是获取最新资讯还是教育学习,视频都是直观高效的媒介之一。 基于互联网的快速传播,众多培训机构也逐渐将线下原创版权课程迁移到在线平台中,一...

    kohoh_ 评论0 收藏0

发表评论

0条评论

godiscoder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<