实用指南:微信公众号网页调试, 某讯参数,drviceToken V2
引言
- 该文章只适用于学术研究,不得用于商业用途,如有侵权,联系主包下架!!!
- 主包断更了几天,还望大家体谅,没发文章就是在研究新东西。今天主包给大家带来微信公众号网页的调试,网站aHR0cHM6Ly9zcHJpbmcubGlxdW5jaGluYS5jb20=
核心技术与原理
1 利用charles抓包分析
2 利用微信开发者工具调试
3 跟栈分析
4 成果展示
实现方法
1第一咱们分析出发条件,当我们点击提交的时候,会发送一个请求,里面包含了drivceToken
2抓包分析,利用charler进行抓包,,可以清楚的看到,在头部的参数有一个device-token,接口是save
所选的答案,了解玩大家需要的就开始调试跟栈就是请求参数
3 跟栈调试,上一步主包,抓包测试,并把响应的js保存下来,我们全局搜索answer/save,发现在paper.js里面
通过接下来搜索C(e,t)这个方法在哪里触发了,我们能够看到,这里触发了函数,并提交。再次之前先调用了ue()这个方法,
继续搜索ue()技巧,这里可能看到,ue()是调用deviceToken传入一个回调函数和布尔值
把ue口下来,调用测试,发现需要先初始化sdk,主包再次搜索init
全局搜索init,发现在创建的时候进行了初始化,这里调用了TDID的初始化
4 挂代理,调试
咱们首先在微信开发者工具中调试一下正确的输出,发现返回一个promise。
接下来就是打上断点分析,发现调用了y1,继续跟栈
发现了加密方法,一个是SHA256,一个是AES256。
挂上代理调试,补一个nav,canvs,window,常见的dom元素,location,session等
fs = require('fs');
path = require('path');
dtavm = {}
dtavm.log = function(...args) {
const message = args.join(' ');
const timestamp = new Date().toISOString();
const logEntry = `[${timestamp}] ${message}\n`;
try {
fs.appendFileSync(path.join(__dirname, 'log.txt'), logEntry);
} catch (err) {
console.error('写入日志文件失败:', err);
}
}
// dtavm=console.log
function proxy(obj, objname, type) {
function getMethodHandler(WatchName, target_obj) {
let methodhandler = {
apply(target, thisArg, argArray) {
if (this.target_obj) {
thisArg = this.target_obj
}
let result = Reflect.apply(target, thisArg, argArray)
if (target.name !== "toString") {
if (target.name === "addEventListener") {
dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray[0]}], 结果 => [${result}].`)
} else if (WatchName === "window.console") {
} else {
dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${result}].`)
}
} else {
dtavm.log(`调用者 => [${WatchName}] 函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${result}].`)
}
return result
},
construct(target, argArray, newTarget) {
var result = Reflect.construct(target, argArray, newTarget)
dtavm.log(`调用者 => [${WatchName}] 构造函数名 => [${target.name}], 传参 => [${argArray}], 结果 => [${(result)}].`)
return result;
}
}
methodhandler.target_obj = target_obj
return methodhandler
}
function getObjhandler(WatchName) {
let handler = {
get(target, propKey, receiver) {
let result = target[propKey]
if (result instanceof Object) {
if (typeof result === "function") {
dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey}] , 是个函数`)
return new Proxy(result, getMethodHandler(WatchName, target))
} else {
dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey}], 结果 => [${(result)}]`);
if (`${propKey}` === 'top') {
return window
}
if (`${propKey}` === 'self') {
return self
}
}
return new Proxy(result, getObjhandler(`${WatchName}.${propKey}`))
}
if (typeof (propKey) !== "symbol") {
dtavm.log(`调用者 => [${WatchName}] 获取属性名 => [${propKey?.description ?? propKey}], 结果 => [${result}]`);
}
return result;
},
set(target, propKey, value, receiver) {
if (value instanceof Object) {
dtavm.log(`调用者 => [${WatchName}] 设置属性名 => [${propKey}], 值为 => [${(value)}]`);
} else {
dtavm.log(`调用者 => [${WatchName}] 设置属性名 => [${propKey}], 值为 => [${value}]`);
}
return Reflect.set(target, propKey, value, receiver);
},
has(target, propKey) {
var result = Reflect.has(target, propKey);
dtavm.log(`针对in操作符的代理has=> [${WatchName}] 有无属性名 => [${propKey}], 结果 => [${result}]`)
return result;
},
deleteProperty(target, propKey) {
var result = Reflect.deleteProperty(target, propKey);
dtavm.log(`拦截属性delete => [${WatchName}] 删除属性名 => [${propKey}], 结果 => [${result}]`)
return result;
},
defineProperty(target, propKey, attributes) {
var result = Reflect.defineProperty(target, propKey, attributes);
dtavm.log(`拦截对象define操作 => [${WatchName}] 待检索属性名 => [${propKey.toString()}] 属性描述 => [${(attributes)}], 结果 => [${result}]`)
// debugger
return result
},
getPrototypeOf(target) {
var result = Reflect.getPrototypeOf(target)
dtavm.log(`被代理的目标对象 => [${WatchName}] 代理结果 => [${(result)}]`)
return result;
},
setPrototypeOf(target, proto) {
dtavm.log(`被拦截的目标对象 => [${WatchName}] 对象新原型==> [${(proto)}]`)
return Reflect.setPrototypeOf(target, proto);
},
preventcExtensions(target) {
dtavm.log(`方法用于设置preventcExtensions => [${WatchName}] 防止扩展`)
return Reflect.preventcExtensions(target);
},
isExtensible(target) {
var result = Reflect.isExtensible(target)
dtavm.log(`拦截对对象的isExtensible() => [${WatchName}] isExtensible, 返回值==> [${result}]`)
return result;
},
}
return handler;
}
if (type === "method") {
return new Proxy(obj, getMethodHandler(objname, obj));
}
return new Proxy(obj, getObjhandler(objname));
}
结论
上成果