当前位置: 首页 > news >正文

实用指南:微信公众号网页调试, 某讯参数,drviceToken V2

实用指南:微信公众号网页调试, 某讯参数,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));
}
结论

  上成果

http://www.hskmm.com/?act=detail&tid=20272

相关文章:

  • 2025 年芝麻灰厂家 TOP 企业品牌推荐排行榜,芝麻灰路沿石,花岗岩石材,火烧板,地铺石,板材,挡车球,桥栏杆,楼梯踏步,门牌石,水篦子公司推荐
  • 2025.9.28
  • 深入解析:宝塔面板搭建RustDesk教程:告别命令行,一键拥有私有远程桌面
  • Windows 安装达梦数据库
  • 有旋Treap
  • xxO
  • 情绪识别论文阅读——Eyemotion - 详解
  • 2025年山东设备回收公司TOP交易服务推荐排行榜,济宁,梁山设备回收,二手,饮料,食品,制药,实验室,生产线,化工厂,废旧,大型,专业设备回收公司推荐
  • 做了个TIFF图片格式转换工具,感觉怎么样?
  • C#后遗症,掉了个坑,特此记录
  • 曾记否 -- Words to be remembered 2025.9.28
  • 日常掉坑记录: 关于位操作
  • WPF XAML资源文件中的换行、回车、空格及Tab的转义
  • longchain4j 学习系列(2)-调用远程deepseek
  • 收汇核销简介
  • macOS 彻底卸载和重装 Node.js 指南
  • 题解:CF2023F Hills and Pits
  • 2025最新国内过滤器品牌 TOP10 权威测评推荐厂家与选购指南
  • Python 将 HTML 转换为纯文本 TXT (HTML 文本提取) - 实践
  • 0135_MVC 设计模式:让代码架构更清晰
  • 30天Python编程挑战 - 从零基础到全栈开发
  • 软件工程第一次作业——物品复活系统
  • StatusStrip 状态栏控件的使用
  • 2025过滤器厂家最新推荐TOP5排行榜:覆盖环保过滤器、精密过滤器、高效过滤器,帮企业找到适配优质厂商
  • 9.28
  • ubi文件系统的 制作 + 挂载
  • 一款开源免费、组件丰富的 WPF UI 控件库,提供了 100 多款常用控件!
  • 元推理用无限嵌套,取代目前弱ai的暴力无限试错
  • 解题报告-序列(alis.*)
  • Cloudbox工具箱!一款拥有100款工具的超级工具箱!Cloudbox工具箱教程(附下载)