
文章目录
- 一、login表单参数epass
-
- [1.1 逆向分析](#1.1 逆向分析)
- [1.2 Webpack逆向注意事项](#1.2 Webpack逆向注意事项)
- 二、滑块验证&文字点选验证参数w
-
- [2.1 逆向分析](#2.1 逆向分析)
知识点介绍
- 协议头参数逆向
- 表单参数逆向
- Webpack扣代码调试技巧,nodejs调试Webpack打包代码的bug
一、login表单参数epass
1.1 逆向分析
1、POST https://www.qcc.com/api/auth/pass-login;
2、下面是login表单需要逆向出来的epass参数;

3、根据url的部分后缀在资源面板下一个XHR断点,以便堆栈跟值;
4、重新发起一个login请求,让XHR断点断住请求,可以发现数据已经全部生成完毕了,下面需要继续通过堆栈来跟值;

5、 epass: o.default.encrypt(a, "qcc")来到了epass参数加密处,继续跟进去,看看里面的具体加密代码;

6、可以看到o是由[t, n(251115), n(211163)]创建出来的,然后调用了o.default.encrypt(e, t).toString()加密方法;

7、在o = [t, n(251115), n(211163)]打下断点,进入至n(251115)看看,重点是mian主文件标红的方法体(webpack加载器);

8、如何扣下webpack的代码,方法1:复制main主文件的全部代码,然后继续跟入mian主文件需要调用的所有代码文件中,复制该文件全部代码,main.f571e618.js+vendor.76803501.js,共14w行代码;

9、如何扣下webpack的代码,方法2:复制main主文件的全部代码,然后继续跟入mian主文件需要调用的任意代码文件中,在控制台打印一个关键词webpackChunkpc_web,该关键词在不同的网站可能会发生变化,一般前面都包含webpack;

10、方法1复杂点需要去调试跟入,不一定能解决问题,方法2比较稳但是代码量比较多,下面带着两个源码文件(main.f571e618.js+vendor.76803501.js)中的14w行代码去浏览器调试;
javascript
window = this; // 现在头部定义一个window
// 通过这段代码找到加载器 return r[e].call(a.exports, a, a.exports, d),
// 下边是加载器的代码,需要将该方法导出,window.xiaozhou = d;
function d(e) {
var t = l[e];
if (void 0 !== t)
return t.exports;
var a = l[e] = {
id: e,
loaded: !1,
exports: {}
};
return r[e].call(a.exports, a, a.exports, d),
a.loaded = !0,
a.exports
}
window.xiaozhou = d; // 这行代码是核心,导出
11、调试成功,创建对象,调用加密方法;

12、其实到了上面这一步还得脱离浏览器环境中调试,这里我推荐fiddler工具加入编程猫的插件,这里调试报错了,需要把self改成this;

13、代码修改好了,加载成功,调用加密方法,其实到了这一步除了代码量有点大其他的都到位了;

14、下面我说一下如何压缩代码,需要增加在加载器方法体中增加一条代码, window.xiaozhou_code += "\"" + e + "\":" + r[e] + ",";
javascript
function d(e) {
var t = l[e];
if (void 0 !== t) return t.exports;
var a = l[e] = {
id: e,
loaded: !1,
exports: {}
};
window.xiaozhou_code += "\"" + e + "\":" + r[e] + ","; // 注意这条代码,其实就是把方法体以字符串的形式累加起来;
return r[e].call(a.exports, a, a.exports, d),
a.loaded = !0,
a.exports
}
window.xiaozhou = d;
15、添加好了就在fiddler的编程猫工具中去打印(window.xiaozhou_code)输出,复制打印出来的代码;
16、压缩(累加了调用到的代码),将webpack的子包7w行代码压缩了1k行,并且同样可以运行成功,这里推荐一个工具(Notepad++)分析代码用;

1.2 Webpack逆向注意事项
二、滑块验证&文字点选验证参数w
2.1 逆向分析
1、GET https://gcaptcha4.geetest.com/verify
2、下面是验证时提交的参数,除了w参数,其他的参数都能通过请求url(https://gcaptcha4.geetest.com/load)得到;

3、由于不是Fetch/XHR请求,所以不能下XHR断点,我这边通过启动器进入代码中下断点进行堆栈跟值;

4、通过堆栈跟值,来到了参数加密处;

5、核心加密代码就是下面这几行
javascript
var s = (0, d[$_DGAHz(186)])();
var u = i[a][$_DGAHz(1243)][$_DGAIj(1288)](s);
var c = i[a][$_DGAIj(1260)][$_DGAHz(1288)](e, s);
var w = (0, d[$_DGAIj(130)])(c) + u;

6、接下来就是把当前文件的所有代码2w行扣下来,然后再浏览器里面调试运行,把需要创建的对象导出来即可;
javascript
window = this; // 现在顶部创建一个window对象
window.xiaozhou_n = r; // 在184行左右添加此代码
window.xiaozhou_s = s; // 在10932行左右添加此代码
// 最后自定义一个方法,创建导出的对象,然后调用加密方法
function get_w(){
var e = '{"passtime":2700,"userresponse":[[4598,5208],[2747,1830],[1218,5691]],"device_id":"05c041505610c5f2ed1270b81ef83af6","lot_number":"a6c174b9470943fc9b6811144487f420","pow_msg":"1|0|md5|2023-07-29T13:38:42.520461+08:00|8daf8b2d78f74aea6a77c0d10da77d41|a6c174b9470943fc9b6811144487f420||10e9da824855c9e4","pow_sign":"3a768ce0d0d0608e716f9e5280f551da","geetest":"captcha","lang":"zh","ep":"123","uzfw":"433775853","yeg6":"d6w9","em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}';
var h = window.xiaozhou_s(window.xiaozhou_n(33));
var l = window.xiaozhou_s(window.xiaozhou_n(34));
var d = window.xiaozhou_n(0);
var i = {
"1": {
"symmetrical": h['default'],
"asymmetric": new l["default"]()
},
};
var s = (0, d["guid"])();
var u = i['1']['asymmetric']["encrypt"](s);
var c = i['1']['symmetrical']["encrypt"](e, s);
var w = (0, d["arrayToHex"])(c) + u;
console.log(w);
return w;
}


7、在浏览器调试运行成功后,还得在无浏览器环境中调试成功,这里推荐fiddler插入编程猫的插件;

8、这里说一次,调试的注意事项
- 如果无环境中调试出现报错,说某个属性不存在,可以根据报错的代码位置去浏览器环境定位打断点,查看浏览器环境给的属性是什么,然后复制浏览器的值去补环境;
- 如果无环境中调试出现比较复杂的值,可以选择赋值一个{},或者把该代码删掉;
- 补环境需要耐心和时间,这个2w行的代码大概需要补10处的环境代码,有耐心就能调试成功;
javascript
window = this;
document = {'documentElement': ""}
location = {'protocol': "https:"}
navigator = {"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}
window.document = {"createElement": function(a){return "<canvas></canvas>"}}
i = s[$_IBIm(310)] || s[$_IBIm(273)]($_IBIm(310))[0]; // 大概1850行,改为 i = "";
s && $_DEGHh(724)in s[$_DEGHh(115)]($_DEGIw(443)) ? function p() { // 大概10470行,改为 s && false ? function p() {
var ue = setTimeout // 大概在9854行, 改成var ue = function(){};
