当前位置: 首页 > 编程日记 > 正文

某网站破解备忘

某网站采用了多种反破解手段,特此开贴记录分析破解过程。

工具和参考

  • awesome-java-crawler - 我收集的爬虫相关工具和资料
  • java-curl - 本人写的java HTTP库,可用来替换chrome网络后端,更方便控制底层行为,如缓存、代理、监控、修改请求和应答等
  • cdp4j - java版的Chrome Devtools Protocol实现,用于控制Chrome浏览器,没有特征哟
  • beautifier.io - js代码在线格式化
  • 类似网站的破解 - 神箭手云的大佬写的
  • 很早的一篇分析文 - 看特征是这种加密的早期版本

网站反破解手段

反动态分析(即反调试)

  • Chrome中,F12打开开发者控制台,发现立即停在断点上了
  • 断点处源码为:
(function() {var a = new Date(); debugger; return new Date() - a > 100;}())
  • 此处可能有两种作用:

    1. 使用debugger调用显式设定断点,且使用定时器高频次调用此段代码,如果破解者不厌其烦,禁用调试,那么破解者等于自缚手脚,也无法设定断点进行动态分析了
    2. 此方法返回了debugger语句的执行时间是否大于100毫秒,意味着可以根据返回值判断出是否有破解者正在试图调试当前脚本

代码动态混淆

  • 代码经过混淆,所有变量,方法都被更名为形似"_$xx",代码中所有字符串和部分常量也被替换,部分常用方法也被替换。因此基本上不可读
  • 以上述方式加密的代码共分4部分。

    • 一部份代码加密混淆后放在html文档内部,同时还在文档头部有大量高度混淆的纯数据,此部分估计也是加密的代码,类似

      <meta id="9DhefwqGPrzGxEp9hPaoag" content="LotupvYp..."/>
    • 一代码直接在页面加载js获取
    • 还有两小段代码应是页面js执行过程中动态加载
  • 以上述方式加密的4段js代码,每次刷新都会变化,不仅仅是变量名有变化,方法顺序也有变化,估计要么是服务端有一堆预先生成的js,或者是每次服务器端根据AST重新命名并乱序后生成等价的js
  • 此手段导致很难动态跟踪分析,因为在pretty print后的某行代码上设定断点后重新刷新执行,由于js变化了,之前设的断点就失败了
  • 对策,本地代理+自定义缓存,避免每次代码变动,这样既可进行动态跟踪分析

客户端生成Cookie

  • 页面加载完成后,分析cookie,发现有一个FSSBBIl1UgzbN7N80T的值和前面应答中Set-Cookie的值不一致,说明客户端js对cookie进行了修改
  • 此Cookie的值很长,估计包含浏览器特征等关键信息
  • 常规手段无法对cookie的读写设定断点,不过github上找到几个可以增强js断点能力的库/插件
  • 目前采用javascript-breakpoint-collection来在cookie修改处设定断点
  • 具体方法是用Page.addScriptToEvaluateOnNewDocument()把上述库js代码注入,这样可以确保在其它脚本加载前注入
  • 设定断点后,发现页面首次加载会设定一次cookie值,然后每隔1分钟左右还会更新该值
  • 但是因为代码高度加密,尚无法解析cookie值生成算法

反PhantomJS, Selenium

  • 通过动态分析调试,可知此种加密算法将全部字符串常量保存在全局对象中,其变量名特征为_$xx
  • 因此,可以在控制台运行一小段程序遍历window对象中所有前缀为_$的变量,从而获取到字符串映射表
  • 通过此方法导出的映射表中包含以下内容:
    "_$iQ": "_Selenium_IDE_Recorder,_selenium,callSelenium","_$cv": "__driver_evaluate,__webdriver_evaluate,__selenium_evaluate,__fxdriver_evaluate,__driver_unwrapped,__webdriver_unwrapped,__selenium_unwrapped,__fxdriver_unwrapped,__webdriver_script_func,__webdriver_script_fn","_$a6": "webdriver-evaluate","_$bs": "callPhantom,_phantom",
  • 由以上代码可知,前端代码对phantomjs, selenium等常用浏览器自动化框架的特征有判断或采集行为,并可采取针对性措施,比如应答错误数据等
  • 因此,如果使用基于浏览器的破解方案,只能采取以下述方案之一:

    • 自行修改自动化框架,修改特征
    • 修改前端js代码,改掉特征检测逻辑
    • 使用其它不基于webdriver (selenium), phantomjs的浏览器自动化框架

禁用桌面版浏览器

  • 以前用cdp4j控制chrome模拟整个流程是ok的,但是某网最近一次更新后,彻底禁用了桌面版chrome,其表现为可以打开前几个页面,但是登录和计费提交时返回201,404等非正常应答
  • 估计是在前面步骤收集浏览器特征,加密后放到cookie中,在若干关键步骤如登录和计费的服务端处理中,解析出浏览器特征,禁用掉桌面版浏览器
  • 试过覆盖User-Agent, navigator.platform='Linux armv7l'和window.width/height等,但无效,在未能分析完整特征收集代码的情况下,很难猜测其逻辑

使用安卓版浏览器的坑

  • 使用真实手机安装Chrome69版,确保adb连接后,使用这篇文档的方法,即可从桌面浏览器连接到手机Chrome并可使用inspector页面远程控制
  • 但是安卓版inspector的地址在blogspot上,在墙外,因此还需要翻墙……
  • 因为真实手机对整个程序的架构和成本有重大影响,因此尝试改用模拟器
  • 测试过逍遥和夜神,后来选用逍遥
  • 使用前面的chrome apk包可以正常安装,但打开页面空白
  • 经搜索发现需要x86版的chrome,在apkmirror下载到69版,模拟器安装后可以正常使用
  • 使用cdp4j连接,发现连接成功的几率非常低,Target.createTarget返回的targetId无法正常连接
  • 在连接成功的一次中,发现模拟鼠标滑动失效,怀疑是桌面版和安卓版的坐标计算方法不同
  • 可能需要综合分析inspector的api调用顺序后,自己编写cdp连接chrome的代码。需要借助chrome-protocol-proxy分析inspector的具体逻辑
  • 或者验证下chrome-remote-interface能否正常连接chrome,如正常则可以参考node版本编写java版本

IP限制

  • 注册用户/修改密码的SSO站点和主站地址不一样,估计是另一批人做的,这个站点对IP进行限制
  • 目前发现的规则是:

    • 所有的ISP(机房)IP 直接封掉,这一招干掉了所有用云主机和肉鸡做代理的
    • 芝麻代理等几家的收费IP也大部分不可用,估计是同行用过被加入黑名单了

鼠标动作收集

  • 使用注入js代码模拟点击按钮即可实现大部分页面的操作
  • 但是在计费对话框页面上,直接js代码导致服务器返回错误
  • 发现需要模拟真实鼠标点击,而且不能简单直接点击按钮,需要在页面的其它部分先点击一下再点击提交按钮才能生效,估计是js收集了鼠标动作,提交时将数据加密后放到"MmEwMD"参数中

目前已发现使用此手段加密的网站收集:

  • 食品药品监督管理局
  • 中国商标网
  • 裁判文书网
  • 咪咕阅读
  • 神州租车
  • 湖南移动
  • 网上房地产

相关文章:

用XML反序列化快速完成ASP.NET配置文件

一般来说&#xff0c;asp.net的配置文件用web.config就可以解决&#xff0c;但是有时候我们希望完全用自己的形式来配置某些东西&#xff0c;比如希望用下面的形式来配置一个站点的所有有message。<Messages> <Message ID"ID1">Message1</Message&…

1088 Rational Arithmetic

本题需要具备有理数处理相关知识。 本次收获(错点) &#xff08;1&#xff09;在化简求最大公约数时&#xff0c;忘记给传入的分子加绝对值 &#xff08;2&#xff09;把除法错写成乘法&#xff0c;自己设计测试用例才测出orz AC代码 #include<cstdio> #include<…

CesiumLab V1.2 新功能 倾斜数据处理

一转眼又是一周的时间&#xff0c;我们的实验室功能又强大了。 照旧我们先放毒&#xff0c;放图&#xff0c;图&#xff0c;太晚了&#xff0c;字都敲不到一起了lod以及包围盒大雁塔实例&#xff0c;按楼层单体化倾斜数据处理参数设置 简单介绍一下 CesiumLab 的 Osgb倾斜数据转…

参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

上周末去清华建筑学院开了个会&#xff0c;叫做海峡两岸城市地理信息系统论坛2010 年会&#xff0c;主题很大&#xff0c;但是内容比较集中一些&#xff0c;就是围绕着GIS与城市规划。一天下来听了20个报告&#xff0c;挺佩服主办方的时间控制&#xff0c;这么密集的报告&#…

hdu 2087 剪花布条

http://acm.hdu.edu.cn/showproblem.php?pid2087 水题&#xff0c;注意细节就可以了。 代码如下&#xff1a; #include<iostream> #include<string>using namespace std;int main() {string s1,s2;while(cin>>s1&&s1!"#"){cin>>s2;…

感知机模拟或门的实现:权重和阈值的设置

def orGate(x1, x2):w1, w2, theta 0.5, 0.5, 0.4tmp x1 * w1 x2 * w2if tmp < theta:return 0elif tmp > theta:return 1print(orGate(1, 1)) print(orGate(0, 1)) print(orGate(1, 0)) print(orGate(0, 0))

apply call bind 简介

Function.prototype.call(thisArg [, arg1, arg2, ...]) call() 简述 call() 方法 调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。当第一个参数为 null、undefined 的时候&#xff0c; 默认 this 上下文指向window。call() 简单实例 const name qia…

自定义控件的构建(5)

Share 在ASP.NET框架中支持在回传中保存值的有2种方式&#xff1a;视图状态和控件状态 视图状态 ASP.NET中几个对象属性与控件最为密切的&#xff0c;就是ViewState了。 这里对其做下说明&#xff0c;任何可序列化类的实例均可添加到视图状态中&#xff0c;但是实际上&#xff…

Javascript之旅——第一站:从变量说起

原文出处&#xff1a; 一线码农的博客 欢迎分享原创到伯乐头条 工作这几年&#xff0c;js学的不是很好&#xff0c;正好周末有些闲时间&#xff0c;索性买本《js权威指南》&#xff0c;大名鼎鼎的犀牛书&#xff0c;好好的把js深入的看一看。买过这本书的第一印象就是贼厚&am…

从浏览器发展史读懂user-agent

世界上第一个浏览器&#xff1a;WorldWideWeb(和万维网重名)&#xff0c;改名Nexus&#xff0c;只能在NeXT系统运行。 世界上第二个浏览器&#xff1a;Line Mode Browser&#xff0c;C语言编写&#xff0c;只能显示文本&#xff0c;可以移植到不同系统。 世界上第三个浏览器(…

在把 png 或者 gif“储存为 web 所用格式”时,勾选“交错”选项

选择“交错”可创建在整个图像文件的下载过程中&#xff0c;在浏览器中以低分辨率显示的图像。“交错”可以使下载时间显得较短&#xff0c;并使查看者确信下载正在进行。但是交错也会增大文件大小。转载于:https://www.cnblogs.com/dongzhiquan/archive/2010/07/28/1994585.ht…

学习GraphX

首先准备如下社交图形数据&#xff1a;打开spark-shell&#xff1b;导入相关包&#xff1a;import org.apache.spark._ import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD创建如上graph对象&#xff1a;// Create an RDD for the vertices val users: RDD[(Ve…

安装NodeJS环境报错

Failures - (exited 1) - Error while running C:\ProgramData\chocolatey\lib\visualstudio2019-workload-vctools\tools\ChocolateyInstall.ps1. 待解决

Eureka单机高可用伪集群配置

Eureka Server高可用集群理论上来讲&#xff0c;因为服务消费者本地缓存了服务提供者的地址&#xff0c;即使Eureka Server宕机&#xff0c;也不会影响服务之间的调用&#xff0c;但是一旦新服务上线&#xff0c;已经缓存在本地的服务提供者不可用了&#xff0c;服务消费者也无…

小小21点模拟

#include<iostream> #include<string> #include<cstdlib> #include<ctime> using namespace std; struct Card //一张扑克牌 { int value; //点数 string color; //花色 string face; //1-10、J、Q、K面值 }; void initCards(Card *cards) { for(int i…

BZOJ-1005 明明的烦恼

Prufer编码练习题&#xff0c;这个编码是跟树的生成计数有关系的。 推荐这篇博文&#xff1a;http://www.cnblogs.com/zhj5chengfeng/archive/2013/08/23/3278557.html 介绍地挺全面生动形象 会了Prufer之后这道题还要用上组合数学来高精度计算。 #include <cstdlib> #in…

使用npm打包后生成的package.json中重要字段含义

{"name": "demo",// 包名称,不能和npm平台上其他包重复"version": "1.0.0",// 版本号"description": "","main": "index.js",// 执行入口"scripts": {// 自定义脚本"test&quo…

Winform窗体应用程序的自动更新功能

本文将演示一种桌面程序自动更新方案&#xff0c;其步骤比较多&#xff0c;但原理非常简单&#xff0c;通用性尚可&#xff0c;对于小型应用来说&#xff0c;直接拿去就可以用了。原理服务器端的结构是这样的&#xff1a;其工作原理如下&#xff1a;Update.asmx 仅提供一个功能…

[UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode

原文:[UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode上一篇心得记录中提到了 AudioGraph, 描述了一下 什么是 AudioGraph 以及其中涉及到的各种类型的 节点&#xff08;Node&#xff09;。 这一篇就其中比较有意思的 AudioFrameInputNode 来详细展开一…

Png透明背景的电话图标。

转载于:https://www.cnblogs.com/li0566/p/4343427.html

CSS改变nth-child()和nth-last-child()的参数灵活选择元素编号

注&#xff1a;下面的所有示例 1. div可以更换成任意标签 2. k是变量&#xff0c;可以换成特定数值&#xff0c;n保持不变 选中偶数行 div: nth-child(2n)div: nth-child(even) 选中奇数行 div :nth-child(odd)div :nth-child(2n-1) 选中前k行 div :nth-child(-nk) 选…

关于Silverlight中多项目共享DLL文件的讨论

假如你的解决方案中有两个Silverlight项目&#xff0c;其中的DLL文件时两个SL项目都使用到的&#xff0c;为了能够最大程度的减小XAP包的体积&#xff0c;你选择了系统的这个选项 编译后在Web的ClientBin文件夹下会出现这样的结构 这样呢&#xff0c;两个项目共享这些DLL的压缩…

核方法---径向基函数网络

为什么80%的码农都做不了架构师&#xff1f;>>> Nadarayas-Watson模型 转载于:https://my.oschina.net/liyangke/blog/2986510

c# 获取客户端IP地址方法

客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString(); 客户端主机名: Request.ServerVariables.Get("Remote_Host").ToString(); 客户端浏览器IE&#xff1a; Request.Browser.Browser; 客户端浏览器 版本号&#xff1a; Request.Browser.M…

CSS结构选择器四种结构关系的范围

1. 空格&#xff1a; 表示<div>标签下所有的<h1>标签 div h1 2. >: 表示<div>标签下直接的<h1>标签 div>h1 3. ~:表示与<div>并列的所有<h1>标签 div~h1 4. :表示与<div>并列且紧邻的<h1>标签 divh1 注&#xff…

VMware前路难测,多个厂家群雄逐鹿

2019独角兽企业重金招聘Python工程师标准>>> 在人们高谈Salesforce、亚马逊等新兴云计算厂商取得的成就时&#xff0c;以VMware、HPE和Cisco为代表的老牌厂商也在进行着自己的转型和变化&#xff0c;而且还取得一定的进展。以VMware为例&#xff0c;虚拟机巨头公布了…

Silverlight学习笔记十七BingMap(六)之获取图片系统的图片信息ImageryService的应用...

BIngMap的ImageryService服务是一个微软发布的WCF服务&#xff0c;它用来获取图片系统的图片信息.服务地址&#xff1a;http://dev.virtualearth.net/webservices/v1/imageryservice/ImageryService.svc 本例中使用的是中文图片系统 效果如图 一、获取中文图片系统类&#xff0…

c++ stack 的使用

(1) stack::empty bool empty ( ) const; 判断是否为空。 return Value : true if the container size is 0, false otherwise; (2) stack::pop void pop ( ); 在栈的顶部移除元素。 (3) stack::push void push ( const T& x ); 在栈顶添加元素 (4) stack::size size_type …

ES和JS的区别,以及JavaScript的基本组成

JavaScript是语言&#xff0c;而ECMAScript(即ECMA-262,ECMA是欧洲计算机制造商协会)是为了规范JS而制定的标准&#xff0c;ECMAScript有不同版本&#xff0c;最近的版本是第10版&#xff0c;发布于2019.6。 完整的JavaScript的实现包含以下几个部分 核心(ECMAScript)&#x…

微软职位内部推荐-Senior Software Engineer-Eco

微软近期Open的职位:The MOD Ecosystem team is dedicated to expanding the reach and value of Office by enabling developers to create solutions built on the Office suite of applications or powered by the O365 services. &nbsp We have an exciting mix of cha…