特别声明!本章只单纯为了学习!
前言
今天通过知乎的一个参数,来学习逆向的新思路,希望大家能有所掌握。
一.抓包分析
我们进入之后搜索,发现这个数据包比较大,肯定就是这个了包了
然后我们就进去观看请求头
我这里就直接说明了,我们今天要逆向的就是这个值X-Zse-96,这个值其实压根不检测,但是我想通过这个值来教会大家逆向新思路。
二.入口定位
我们直接搜索,发现有两个X-Zse-96
在两个的位置上都打上断点
发现成功断住,发现 x-zse-96=t2 + "_" + tO 而t2是固定值,所以我们要找到tO,这里我就不给出截图了,大家一看就知道
观察这个可以发现 实际上就是要找tT的生成,,其中tT的参数都是不变的大家可以测试下,现在进入ed函数。
发现这个signature不就是我们要的值吗,我们在控制台打印一下。
确定就是了。
三.代码分析
我么上面已经能够确认入口了,那我们就要开始分析了。
我们打印参数
可以发现 tp是传进来的参数,而 ty()(tp)一直不变而且很像是一个摘要算法,tJ(ti).encrypt(ty()(tp))又一直改变。我们就思考为什么呢?
首先来验证y()(是不是摘要算法
发现的的确确就是md5,那为什么tJ(ti).encrypt(ty()(tp))会一直变呢,我们猜想一下,可能是时间戳,可能是随机数,还有可能是rsa算法,如果是rsa那就麻烦了,如果是前两个我们给他hook掉,不就好了吗,那我们来验证一下,这里给出hook代码。
//hook掉时间戳
Date.prototype.getTime=function name(params) {
//正常是要在这执行以下的
return 1700000000000;
}
//hook掉随机数
Math.random=function name(params) {
//正常是要在这执行以下的
return 0;
}
我么来验证一下
hook时间戳
发现还是变的
hook随机数
发现值不变了,那我们是不是只需要扣完的代码再对random进行hook,对11111111进行加密,看看值匹不匹配就知道对不对啦!
四.抠代码
我们从加密点进去
发现是一个webpack,那我们就往前面找
这个函数存在于这个里面,所以我们先把这个扣取,再扣取加载器,然后执行这个模块,导出函数就大工搞成了。
我们全局搜索1514,然后打一个断定,发现这个tr就是调度器,我们进去
把这里全扣就好了,于是我们把两处代码进去扣去,先补上常见的环境,再对random进行hook
我们运行,发现报错,我们就把self都换成是window
至此,代码扣好,准备补环境
五.补环境
先补上我们常见的,然后再放入proxy代理,这里我给出proxy代理和常见的补环境代码
function setProxy(proxyObjs) {
for (let i = 0; i < proxyObjs.length; i++) {
const handler = `{
get: function(target, property, receiver) {
if (property != "Math" && property != "isNaN") {
if (target[property] && typeof target[property] != 'string' && Object.keys(target[property]).length > 3) {
} else if(property=='webpackChunkheifetz'){
}else {
console.log("方法:", "get ", "对象:", "${proxyObjs[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", target[property], ", 属性值类型:", typeof target[property]);}}
return target[property];
},
// set: function(target, property, value, receiver) {
// console.log("方法:", "set ", "对象:", "${proxyObjs[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", value, ", 属性值类型:", typeof target[property]);
// return Reflect.set(...arguments);
// }
}`;
eval(`try {
${proxyObjs[i]};
${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler});
} catch (e) {
${proxyObjs[i]} = {};
${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler});
}`);
}
}
logger = function () {
console.log('\x1B[31m%s\x1B[0m', arguments)
}
window = global;
delete global;
delete Buffer;
document={}
navigator={}
screen={}
localStorage={}
location={}
history={}
setProxy(['window', 'navigator', 'screen', 'document', 'localStorage', 'location','history',])
发现值还是不对,代理一看就知道,缺少ua,那我们补上
补上这些, 接着运行
看到这个,我们一看就知道是toString的检测,下面是浏览器的返回值
那我们补上就好了,接下来几个都是一样的,这里我们只挑重点讲
发现这是要补document.createElement方法,那我们就先这样
document.createElement=function (arr){
logger(arr)
}
发现打印的是canvas,那我么就这样补
canvas={}
document.createElement=function (arr){
logger(arr)
if(arr='canvas'){
return canvas
}
}
同时把canvas添加到proxy的数字里监听起来
发现又对canvas进行操作,也是按照那个方法,补就行了。这里我就不多说1,主要是教重点。
把这些方法补的都差不多的时候,发现
这里都是undefined,大家也可以去补补,发现确实都是undefined,那怎么办呢,这个时候就很有可能是,try的问题咯,那我们一搜,发现那么多try,我们就想到,webpack把所有模块都导入了,很有可能用不上几个
我们就在调度器这里加上
发现只加载了两个模块,我们干掉其他的和里面的try,发现就一个,删除之后
运行报这个错,我们直接补个空方法就好了
此致,环境补充完成。
总结
通过知乎这个,虽然这个没有逆向,大家肯定也能想到,都有随机值了,怎么可能逆向呢?但是我们能学到补环境的很多知识!
补充
如有需要学习资料和交流加我绿泡泡
这里插入一条广告(希望理解一下,养家糊口)!!!
有需要逆向需求或者是项目,课设等等,都能找我接单,麻烦大家了
公众号(后续会更新相关文章)
期待你的关注!