项目地址:aHR0cHM6Ly93d3cuemhpaHUuY29tL3NpZ25pbj9uZXh0PSUyRg==
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
前言
我发的第一篇文章[2020-7-29]新版某乎Js逆向分析 中讲到了sign_in的加密
其中我面对检测我是直接改写代码来拿到正确的结果的 虽然能达到想要的效果 但是 我不满意 在昨天群里聊天的时候 聊到Navigator的检测 我顿时想到了顶象的检测 茅塞顿开 就一步一步调试 最终 找到了坑人的点
分析
在解密点下输出桩 得到以下结果
JSmain1:335 解密: __g JSmain1:335 解密: _encrypt JSmain1:335 解密: window JSmain1:335 解密: undefined JSmain1:335 解密: window JSmain1:335 解密: navigator JSmain1:335 解密: Object JSmain1:335 解密: name JSmain1:335 解密: nodejs JSmain1:335 解密: userAgent JSmain1:335 解密: headless JSmain1:335 解密: userAgent JSmain1:335 解密: toLowerCase JSmain1:335 解密: indexOf JSmain1:335 解密: callPhantom JSmain1:335 解密: _phantom JSmain1:335 解密: __phantomas JSmain1:335 解密: buffer JSmain1:335 解密: Buffer JSmain1:335 解密: emit JSmain1:335 解密: spawn JSmain1:335 解密: webdriver JSmain1:335 解密: domAutomation JSmain1:335 解密: domAutomationController JSmain1:335 解密: getOwnPropertyDescriptor JSmain1:335 解密: userAgent JSmain1:335 解密: getOwnPropertyDescriptor JSmain1:335 解密: webdriver JSmain1:335 解密: getOwnPropertyDescriptor JSmain1:335 解密: [native code] JSmain1:335 解密: getOwnPropertyDescriptor JSmain1:335 解密: Function JSmain1:335 解密: prototype JSmain1:335 解密: toString JSmain1:335 解密: call JSmain1:335 解密: indexOf JSmain1:335 解密: JSmain1:335 解密: length JSmain1:335 解密: RuPtXwxpThIZ0qyz_9fYLCOV8B1mMGKs7UnFHgN3iDaWAJE-Qrk2ecSo6bjd4vl5 JSmain1:335 解密: length JSmain1:335 解密: charCodeAt JSmain1:335 解密: charAt
可以看到 检测是一些东西的 然后我们的常规做法就是补齐了对吧
window={}; window.name=""; window.navigator={ userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400" }
当我们补完这个环境 然后运行结果的时候就会发现 我怎么都拿不到正确的结果 那么 恭喜你 踩坑了 接着 细听我慢慢道来
首先 我找到一处解密赋值的位置插装 然后运行对比
浏览器
node
通过对比可知
在这个 userAgent 后面 俩个环境运行出的结果不一致
那我们就找到判断下断点看看
if(k(e.b[this.h])=="userAgent"){ debugger; }
俩边都是下 debugger 运行操作
接着就是俩边F11的对比了
到了 e.r[this.s][r](o[0], o[1]) 的位置 发现运行结果不一样了
浏览器
node
这就很奇怪了 为啥 俩边都是拿 userAgent 一个有值 一个就没有呢?
这就是知乎的坑了
首先我们要了解一下 Object.getOwnPropertyDescriptor
这个还看不懂?
这个是浏览器的navigator
这个是我们自己构造的navigator
navigator={ userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400" };
看起来一样吗?其实并不然
差别明显就出来了上面的是浏览器的 下面是我们自己构造的
它就是通过 getOwnPropertyDescriptor 来判断你是不是构造的
那我们要怎么构造呢?其实也是很简单的
根据我们测试这个方法可行 那应用不也就简简单单嘛
var Navigator = function() {}; Navigator.prototype = { userAgent: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0", }; window.navigator = new Navigator;
运行结果
浏览器
node
完美~补个头就能拿到正确结果啦
[完]