有段时间要处理验证码,要训练验证码得先把验证码图片下载下来,但是下载图片有加密参数,加密接口还没有逆向,不知道得搞多久。于是就学习怎么使用Selenium, 对着文档写好了一个下载脚本,不用管任何加密参数,又快又稳,舒舒服服。

有个网站需要注册账号,逆向注册接口一直不知道错在哪里,后来用自动化DrissionPage写了个注册账号的脚本,跑的稳稳的。

之前遇到滑块,看加密参数,搞了好久搞不定,结果用自动化,搞一下轨迹就过了。

刚入行的时候,看不上自动化,因为速度慢,但在一些量小的场景下,自动化确实是又快又稳的方案。要知道技术只是手段,业务方可不会管你是怎么做爬虫的,只要你能满足他的需求就行。自动化,补环境,扣算法都只是技术手段,在满足需求的情况下,没有高低之分。

此时想起了爬虫行业金句,嘲讽金角,理解金角,成为金角,超越金角。

联系作者

从业以来第一次遇到站点无法使用快捷键打开开发者工具,猜测是监听了键盘事件,于是只好在浏览器设置里点击打开

发现打开开发者工具后,会跳转about:blank空白页面,于是把网页代码下载到本地,之后在代码里搜索about:blank, 发现如下可疑代码

把window.location.href=”about:blank”删除之后,用Charles等抓包工具里的Map Local(映射本地文件)进行文件替换。此时还是无法使用快捷键打开开发者工具,但依然通过浏览器设置打开开发者工具,好在页面不再跳转空白页。

此时console日志一直在打印,跳到日志输出的代码文件,大概看了下反调试逻辑,用了很多方案,窗口大小,时间等等。在代码文件里找到一个链接 https://theajack.github.io/disable-devtool/404.html,于是我们知道这个反调试是用的https://github.com/theajack/disable-devtool 这个库。

查看这个库的源码,我们可以知道它是通过监听keydown事件,屏蔽了打开开发者工具的快捷键。代码片段如下

1
2
3
4
5
6
7
8
9
10
11
target.addEventListener('keydown', (e) => {
e = e || target.event;
const keyCode = e.keyCode || e.which;
if (
keyCode === KEY.F12 || // 禁用f12
isOpenDevToolKey(e, keyCode) || // 禁用 ctrl + shift + i
isViewSourceCodeKey(e, keyCode) // 禁用 ctrl + u 和 ctrl + s 查看和保存源码
) {
return preventEvent(target, e);
}
}, true);

之后看了下初始化代码,找到绕过的办法。只要不让它执行initInterval,disableKeyAndMenu,initDetectors这几个函数即可,直接设置disableDevtool.isRunning = true即可。 网站代码经过混淆,但没有高度混淆,就webpack打包了下,在对应的代码里找到isRunning变量,把它设置为true即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
if (disableDevtool.isRunning) return r('already running');
initIS(); // ! 首先初始化env
initLogs(); // 然后初始化log
mergeConfig(opts);
// 被 token 绕过 或者
if (checkTk()) return r('token passed');
// 开启了保护seo 并且 是seobot
if ((config.seo && IS.seoBot)) return r('seobot');
disableDevtool.isRunning = true;
initInterval(disableDevtool);
disableKeyAndMenu(disableDevtool);
initDetectors();
return r();

最后发现disable-devtool这个库挺多star的, 作者是国内开发者,是个精力旺盛的开发,作者还给了一个测试网站

https://theajack.github.io/disable-devtool/,有兴趣的可以试试。

联系作者

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码。抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请在公众号 【静夜随想】 联系作者立即删除!

之前就知道这个 https://www.52pojie.cn/forum.php?mod=viewthread&tid=2012413,但一直没去试。正好周末闲着没事,于是研究了下这个补环境方案。

这个方案没有加 window.ActiveXObject=undefined 这个代码,也就没有走IE那一套,而是直接按照 Chrome 硬补,form 表单校验,document.all 校验这些都给补了,这就很好。而它没有用vm2 创建沙盒环境,直接在 Node 上补,这就减少了创建沙盒环境的时间,在速度上也就有了保证。

虽然这个环境没有严格的 DOM 树操作,但它的确能跑通,而能跑通对于绝大多数爬虫来说就足够了。

将它进行了改造,改成Express服务,发现还是挺通用的,测试了几个普通站点能过,但校验严格的站点还是过不去。知足了,毕竟免费的,还想怎样。

联系作者

某数反爬方案调研听闻sdenv被反爬 里,我们都提到了sdenv, 它就是一个在 jsdom 上魔改的某数补环境方案。而在听闻sdenv被反爬里,也提到过它的很多环境设置还是有问题,那么如果要魔改sdenv又要如何操作呢?有道友问了这个问题,这里记录一下。

sdenv 执行的时候有一行代码很关键,那就是 browser(window, ‘chrome’) 这行,加上这行它会去加载一个写好的 chrome 环境代码,而这些代码就在browser/chrome目录里。所以我们要定制sdenv, 也可以在这里增加代码。

举个简单例子来说,sdenv 在执行window.document.toString()时返回的结果是[object Document]而不是 [object HTMLDocument],有什么办法修改它的这个toString吗?其实只要修改browser/chrome目录里的document.js文件就好, 给它加上如下两行代码,之后window.document.toString() 就会发生变化了。

1
2
3
4
window.document.toString = function toString() {
return '[object HTMLDocument]'
}
sdenv.tools.setFuncNative(window.document.toString)

联系作者

在 JavaScript 逆向时,有时候反爬代码会对console进行更改,导致使用 console.log 输出时没有结果,如下面的例子

1
2
3
console.log = function log(t) {
}
console.log('ssss')

这时我们可以使用 Object.freeze 方法把 console 冻结了,不让它更改,这样就会有输出了,例子如下

1
2
3
4
Object.freeze(console)
console.log = function log(t) {
}
console.log('ssss')

在MDN文档里可以看到,Object.freeze() 静态方法可以使一个对象被冻结。冻结对象可以防止扩展,并使现有的属性不可写入和不可配置。被冻结的对象不能再被更改:不能添加新的属性,不能移除现有的属性,不能更改它们的可枚举性、可配置性、可写性或值,对象的原型也不能被重新指定。freeze() 返回与传入的对象相同的对象。

当然反爬也可以使用 Object.isFrozen() 方法查看 console 是否被冻结, 发现被冻结了,就知道大概率是爬虫了,因为正常用户谁会好端端的冻结 console 呢?

参考资料:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

联系作者

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码。抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请在公众号 【静夜随想】 联系作者立即删除!

目标站点: aHR0cHM6Ly9kcHB0LmJlaWppbmcuY2hpbmF0YXguZ292LmNuOjg0NDMvZGlnaXRhbC10YXgtYWNjb3VudA==, 目标参数为请求头中的 lzkqow23819 参数和 请求url 中 6eMrZlPH 参数。

很早之前就听过盾山加密,说是要逆向出算法很有挑战,补环境则相对简单些,于是一直没有尝试。今年抽空试了下补环境,以备不时之需。

之前因为在补环境框架跑的太慢了,于是好久没搞补环境框架了,现在都直接用Node 补了。补的过程中就会发现这个补环境确实相对容易,没有各种花里胡哨的检测,就缺啥补啥完事。唯一需要注意的一点是 typeof 检测,typeof 没法用代理捕获到,得看代码分析了才知道。这个反爬缺啥补啥后就能直接跑起来,没有一点坏心思。

我对反爬的一些理解有提到过,补环境是可以无视混淆的,也不管算法。算法加密再厉害,混淆的再花里胡哨,反爬代码对环境的检测强度不够,一样是无效的。

联系作者

道友遇到一个无壳APP,有个加密token不知道怎么生成的,jadx反编译之后也搜索不到参数,于是请教我怎么搞。猜测有可能是在JavaScript里,因为之前遇到过一个Weex开发的APP,也是怎么搜索都找不到加密参数,最后在JavaScript里找到了。

那次Weex开发的APP,找了老半天都不知道咋回事,后面是通过hook string还是hook url的办法,发现它会去下载一个JavaScript脚本,也就是 app-service.js,在这个脚本里才找到了加密参数。

于是道友就去找JavaScript代码,在反编译的apk里的assets目录里,找到了一个 uniapp 开发的app-service.js,在代码里找到了相关接口,但还是找不到相关的加密参数。于是道友又困惑了,只好来请教我。

此时我才知道这是使用 uniapp 开发的APP,于是去应用宝里下载了一个apk, 安装后发现它提示APP需要更新,点击更新后,APP又去下载了一些东西。拿着apk 里的 app-service.js 看了之后,接口确实都有,怎么会没有参数呢?想到刚才 APP 提示更新,莫非是会更新了uniapp? 于是去找APP临时目录,在/data/data目录下找到 APP对应的目录,在里面找到了一个app-service.js, 和apk里的app-service.js 大小不一样,搜索加密参数,果然在这里。剩下的就交给道友去解决了。

联系作者

任何动态的事物都是基于静态产生的,所以只要找到静态点,那么动态就会坍缩为静态。

刚入行的时候,从https://www.52pojie.cn/thread-1208999-1-1.html 里知道了这句,顿时惊为天人,感悟良多。

滑块只能seleinum过,大环境就这样

这句是来自金角大王的,老实说滑块用自动化过是真舒服,但前提是得解决自动化检测,当遇到难的反爬时,不仔细分析代码都不知道咋检测的。

嘲讽金角,理解金角,成为金角,超越金角

金角就是上面的金角大王,也泛指自动化。刚入行时看不上自动化,现在越来越觉得自动化舒服。之前遇到阿里v2滑块时,搞代码得好久,自动化解决下轨迹就完事了。

不是学了点ast基础你就能搞出某验,某数。。能搞出来的不用ast也能搞出来,甚至不用花时间去写复杂的还原控制流等

AST是真舒服,刚入行的时候都是对着混淆代码调试的,人都调试麻了。后来从蔡老板那里学了AST还原混淆之后,调试起来舒服的很,极大提高生产力。所以这句话就挺莫名其妙。

因为你的不礼貌,我说说我的想法。你我只是开发领域不一样,但你尽然不能理解作为程序员时间成本概念我到感到很惊讶我很清楚我的需求是什么才来联系你,我有自己非常擅长的领域,所以我没那么多时间去自学-门很成熟的技术,我要的是最快时间能解决我的需求,达到我的目的。手上有一堆项目技术问题需要处理,联系你只是一个偶然,你自己看低你的客户价值,那是你自己问题。如果你的爬虫技术满足我们项目的需求,我更愿意你卖接口服务的方式深度合作。既然你关上了让我了解你的门,那没必要聊下去。我想说你299的价格,我一个月薪水可以买断你好多年提供的教程,不可能花精力去深度学习你的经验。这个思想我在开始跟你聊就委婉表达出来,只是你没看懂。你的无知应该是最可笑的。

这句话估计在爬虫圈流传最广。

联系作者

最近听道友说一个颇具难度的某数样本又更新了,补环境跑着跑着通过率会变得很低,不知道错在哪里。于是只好尝试算法方案,尝试之后发现生成核心45位数组的算法有一点变化,之前的方法不能用了,而因为之前没有认真跟过这部分代码,一时半会估计是搞不定了,于是只好先请大佬出山。

跑起来之后,还是得自己研究下这部分逻辑,发现关键点还是一个8位数组,也就是时光在瑞数vmp算法还原流程分析里生成wIlwQR28aVgbT参数的大概步骤里步骤4中说到的8位数组,从打印的日志可以看到这个数组会从 [0, 1, 2, 3, 4, 5, 6, 7] 经过一系列运算生成如 [6, 155, 3, 0, 5, 2, 7, 4] 这样的数组。生成的逻辑在vmp运算里,因为不会还不会反编译vmp,调试了老半天都看不出来生成逻辑,头皮发麻。

后续有时间了打算尝试用补环境方案生成核心45位数组后给算法方案使用,希望能成。也可以排查下补环境为啥会从通过率100%变成20%,解决了这个问题就更舒服了。

不得不感叹,在没有进行vmp反编译的情况下,分析日志还原vmp算法的大佬都太有毅力了。

联系作者

听圈子里的人说,现在都人均rs了,rs不再像20年那会那样,像一座大山。但我看了一些补环境方案,发现很多补环境方案连ActiveXObject对象还没搞明白,只是走了神奇的window.ActiveXObject=undefined 这个bug, 这种方案只能说能过,所以对人均rs我有些怀疑。

问了公司的配置开发,他们能解决4代和5代,不能解决vmp版本。公司的配置开发能力已相当不错, 会解决常用加密如AES,DES等,一些入门加密如 jsl, hexin-v也能做,有一些能力强的还学了下AST,但遇到vmp版本时就没法拿捏。

有一些人用了开源的sdenv, 不不的cynode, 挽风的node-sandbox,就觉得rs简单,但这只是因为工具的能力,并不代表自己会,得知其然,知其所以然才行。

就拿sdenv来说,如果你只会用sdenv, 万一遇到 aHR0cDovL2Nob25ncWluZy5jaGluYXRheC5nb3YuY24veHhna3h0L3BhZ2VzL3F5d2gvemR3ZmFqY3guaHRtbCAK,aHR0cDovL3d3dy5jemNlLmNvbS5jbi9jbi9qeXNqL3lkanloei9INzcwMzE1aW5kZXhfMS5odG0K 等站点怎么办?更不用说aHR0cHM6Ly96eGdrLmNvdXJ0Lmdvdi5jbi94Z2wvCg==,aHR0cHM6Ly93d3cuY2Vid20uY29tL3dlYWx0aC9qZ2xjMzkvaW5kZXguaHRtbCA=等站点了。

联系作者