声明:
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
先逆向登录手机号和密码,网址:登录
1. 点击到网页主页
- 先随便输入电话号码和密码
- 打开开发者工具,点击网络清空,然后点击登录发起网络请求 (出现一个请求包,我们发现不是我们所需要的)
- 我们进行验证滑块,就又出来请求,发现v2是我们登录所需要的
- 我们复制它的url,获取代码,并且发起请求 (发现我们的请求是对的)
2. js逆向登录
- 我们想要大量的进行登录,我们就需要进行破解登录(请求加密),我们就可以找它的加密入口
- 我是先通过,搜索关键字,encrypt( 进行搜索,然后使用请求堆栈找到加密入口
- 我们可以看到a.getEncryptPwd(n)就是加密结果,控制台输出如下:
- 所以说明我们主要的加密还是要靠a来加密,最后调用a里面的方法就可以对我们的电话号码进行加密,这时候我们找a(本文件往前面查找)
- 一直往上面找,我们就找到了a,看到这个格式我们就立马想到了webpack,我们打上断点,刷新页面,找webpack调度器(webpack只能刷新整个页面调试断点)
- 我们点到r里面去进行复制粘贴到pycharm中,并且创建以下文件
3. 调试代码、补环境
3.1 所需文件
- env.js用来装补充环境的代码
- loders.js用来装webpack的代码
- main.js用来装我们调试的主要代码
- mod.js放我们webpack中缺失的代码,可以又好几个
3.2 进行代码调试、补环境
3.2.1 先进入loaders.js文件中,我们进行webpack的准备操作(非常重要)
1.开头进行补环境 window = global (先运行,看哪些环境需要进行补) 2.在加载函数中,注释初始化,一般在加载器函数中(最后一行)的进行注释 例如: // o(o.s = 0) 3.全局要调用加载器函数(看加载器函数中调用的是哪个对象就调用哪个全局变量) 例如: o.e/o.c/o.r(这时候我们就可以这样调用window.zhang = o) 4.打上执行模块日志,也在加载器函数中 (console.log("t:::",t))
- 先补环境window = global
- 打上日志操作
- 补充全局变量
- 这个webpack中没有初始化,我们就需要注释初始化
3.2.2 再到main.js'中进行调试
- 模仿浏览器上的操作a=r(20),这里的r就是window.loader(我们手动定义的webpack全局变量)
1. 出现了错误,错误显示20不存在,我们就需要到浏览器中找到20所在的带吗复制过来,在进行调试
2. 我们就解决了这个错误,在进行运行我们就又发现了一个错误我们t.exports = __award_library__:没有定义,再到浏览器就行搜索,找到在进行复制
- 这里我们就有一个小问题,我么先定义,在调用,所以我们就应该把__award_library__这个放到mod1文件中,把之前的mod1改成mod2,先调用再执行(注意要把var去掉改成全局的)
3. 结局按完上个问题,就出现了下面这个问题
- 说明缺少document这个环境,我们需要补环境 (我们为了防止看不清楚该补什么,我们可以借助proxy代理进行监听),需要监听哪个,我们就在最下面的列表里放进去哪一个
// proxy代理监控器
function setProxyArr(proxyObjArr) {
for (let i = 0; i < proxyObjArr.length; i++) {
const handler = `{
get: function(target, property, receiver) {
console.log("方法:", "get ", "对象:", "${proxyObjArr[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", target[property], ", 属性值类型:", typeof target[property]);
return target[property];
},
set: function(target, property, value, receiver) {
console.log("方法:", "set ", "对象:", "${proxyObjArr[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", value, ", 属性值类型:", typeof target[property]);
return Reflect.set(...arguments);
}
}`;
eval(`try {
${proxyObjArr[i]};
${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});
} catch (e) {
${proxyObjArr[i]} = {};
${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});
}`);
}
}
setProxyArr(["window")
- 补环境方法如下:
- 先对document进行补环境,其次创建createElement方法,再createElement里面还使用了canvas,我们就可以打印并且并返回canvas,并且再全局也补上canvas方法
- 如果不认识canvas是个什么,我们可以借助工具查看它 MDN Web Docs
4. 我们继续往下调试,我们就又有新的错误(需要补环境navigator)
- useragent我们可以在浏览器终端输出一下,最后我们补充成功,结果如下:
5.我们就再运行程序,发现新的错误(location没有定义),如下:
- 解决方式:我们先定义location对象,继续在浏览器终端环境获取location对象
6. 调试以上代码,发现新的错误,还是document .createElement 但是是div的问题
- 解决方案如下:
7. 我们继续调试,看下面会有什么错误,发现是div没有style属性
- 解决方案:
8. 我们继续调试,看下面会有什么错误,发现是div没有setAttribute方法
- 解决方案:
9. 继续调试代码,看下面会发生什么错误,发现是document没有addEventListener方法
- 解决方案(补上缺失的方法):
10. 我们继续调试,看下面会有什么错误:
- 我们没有见过这个错误,也不知道这个clientWidth元素是什么,我们就可以是以哦那个我们的工具 MDN Web Docs,我们就会发现这是一个有关于前端的盒模型,我们不能观察到日志来判断这是个什么错误,我们就需要在浏览器搜索源码
- 我们可以往前面看一下e.documentElement,这个是我们调用document.documentElement没有这个方法导致的,所以我们就需要补上这个环境
- 解决方案,:补上这个方法我们就解决了这个问题
11. 我们继续调试,看下面会有什么错误,这里报了个font-size的错误,这个r还是我们刚才的错误documentElement,我们需要在它里面创建对象:
- 解决方案:
12. 我们继续调试,看下面会有什么错误:
- 解决方案:
13.我们继续调试,看下面会有什么错误
- 解决方案;
14.我们继续调试,看下面会有什么错误 :
- 解决方案
4.总结
- 最终我们完成了js逆向破解,我们发现程序不走了,说明我们逆向成功了
- 最终我们获取到了加密值
- 我们在仿照刚开始的加密进行模拟加密