【VX小程序逆向】房*下小程序pseusign参数分析

这篇具有很好参考价值的文章主要介绍了【VX小程序逆向】房*下小程序pseusign参数分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【VX小程序逆向】房*下小程序pseusign参数分析

请求包分析

使用 Charles 软件进行抓包,详细过程就不细说了,直接贴上抓包结果

headers = {  
    'Host': 'miniapp.fang.com',  
    'pseusign': 'p10120230411162220f9a1195df01c47a6065f53b22d1c4100',  
    'openid': 'oxBn60ADRc6eURhDDkYReN4MjFik',  
    'content-type': 'application/json',  
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.33(0x18002129) NetType/WIFI Language/zh_CN',  
    'Referer': 'https://servicewechat.com/wxffbb41ec9b99a969/758/page-frame.html',  
}  
  
params = {  
    'appname': 'fangx',  
    'v': '1.3.4',  
    'miniplat': 'weixin',  
    'scene': '1027',  
}  
  
response = requests.get('https://miniapp.fang.com/pingyin/cityList', params=params, headers=headers, verify=False)  

经过来回删除恢复参数的方式,得出 pseusign 参数尤为重要,直接分析小程序代码。

获取小程序代码

由于开源仓库已经被作者删除,新版本已经商业化,这里就不再叙述。

运行小程序

使用微信小程序开发工具导入解包后的代码,直接编译运行,会得到以下错误信息

[插件 wx1db9e5ab1149ea03] provider:wx1db9e5ab1149ea03, version:2.1.1, INVALID_LOGIN,access_token expired
插件文档: https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx1db9e5ab1149ea03&token=&lang=zh_CN(env: macOS,mp,1.06.2303060; lib: 2.30.3)

可以大概看懂是插件过期的意思,那么就找到 app.jsonplugins 删除就好了,就想下面这样

::: code-group

"plugins": {
	"echarts": {
	"version": "2.1.1",
	"provider": "wx1db9e5ab1149ea03",
	"subpackage": ""
	}
},
"plugins": {
},

:::

继续编译允许,继续报错,内容如下

WAServiceMainContext.js?t=wechat&s=1681204008944&v=2.30.3:1 TypeError: _typeof3 is not a function

解决办法,找到 @babel/runtime/helpers/typeof.js,把下面内容替换到文件中

function _typeof2(o) {

"@babel/helpers - typeof";

return (_typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {

return typeof o;

} : function(o) {

return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;

})(o);

}

function _typeof(o) {

return "function" == typeof Symbol && "symbol" === _typeof2(Symbol.iterator) ? module.exports = _typeof = function(o) {

return _typeof2(o);

} : module.exports = _typeof = function(o) {

return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : _typeof2(o);

}, _typeof(o);

}

module.exports = _typeof;

继续编译运行,通过了。

分析代码

直接全局搜索 pseusign 找到下面代码处

v.pseusign = h(e.url, i), o || (o = l("openid") || ""), v.openid = o, wx.request({

url: e.url,

data: "POST" === e.method ? e.data : i,

header: v,

method: e.method || "GET",

dataType: e.dataType || "json",

responseType: e.responseType || "text",

可以看到 pseusign 是由 h 函数生成,跟进 h 来看下

function h(e, n) {

var o = "",

a = getApp();

if (a) {

var i = a.vars.headerSgin;

try {

if (!n) return "";

var c = {};

if ("string" == typeof n) n.split("&").forEach((function (e) {

var t = e.split("=");

2 === t.length && (c[t[0]] = t[1])

}));

else c = n;

if (e.includes("?")) e.substr(e.indexOf("?") + 1).split("&").forEach((function (e) {

var t = e.split("=");

2 === t.length && (c[t[0]] = t[1])

}));

var u = i.encodeNumber,

s = i.password,

g = function (e, t) {

var n = new Date(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate(), e.getUTCHours(), e.getUTCMinutes(), e.getUTCSeconds()),

r = new Date(n.setHours(e.getUTCHours() + 8)),

o = {

"M+": r.getMonth() + 1,

"d+": r.getDate(),

"h+": r.getHours(),

"m+": r.getMinutes(),

"s+": r.getSeconds(),

"q+": Math.floor((r.getMonth() + 3) / 3),

S: r.getMilliseconds()

};

for (var a in /(y+)/.test(t) && (t = t.replace(RegExp.$1, String(r.getFullYear()).substr(4 - RegExp.$1.length))), o) new RegExp("(" + a + ")").test(t) && (t = t.replace(RegExp.$1, 1 === RegExp.$1.length ? o[a] : ("00" + o[a]).substr(String(o[a]).length)));

return t

}(new Date, "yyyyMMddhhmmss"),

l = "p".concat(u).concat(g),

f = t(t({}, c), {}, {

micalltime: g,

miversion: i.miversgin,

misource: u

}),

h = Object.keys(f);

h.sort((function (e, t) {

return e.toLowerCase().localeCompare(t.toLowerCase())

}));

var d = "";

h.forEach((function (e) {

d += "&".concat(e, "=").concat(f[e])

})), d = d.substr(1);

var p = r.hex_md5("".concat(d).concat(s));

o = "".concat(l).concat(p)

} catch (e) {

o = ""

}

}

return o

}

打上 debugger 进行调试

var i = a.vars.headerSgin;

a.vars 则声明在 app.js 是一个常量对象,那么 headerSginheaderSgin: {encodeNumber: "101",password: "4f0c6725d917f8fe4e2791921187fd7d",miversgin: "p"}

c = n;

n 为函数的第 2 个参数,是一个对象,多调试几次就知道是接口的请求参数

if (e.includes("?")) e.substr(e.indexOf("?") + 1).split("&").forEach((function (e) {
        var t = e.split("=");
        2 === t.length && (c[t[0]] = t[1])
      }));

e 为函数的第 1 个参数,是一个 URL 地址

var u = i.encodeNumber,

u = 101

s = i.password,

s = 4f0c6725d917f8fe4e2791921187fd7d

g = function (e, t) {
          var n = new Date(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate(), e.getUTCHours(), e.getUTCMinutes(), e.getUTCSeconds()),
            r = new Date(n.setHours(e.getUTCHours() + 8)),
            o = {
              "M+": r.getMonth() + 1,
              "d+": r.getDate(),
              "h+": r.getHours(),
              "m+": r.getMinutes(),
              "s+": r.getSeconds(),
              "q+": Math.floor((r.getMonth() + 3) / 3),
              S: r.getMilliseconds()
            };
          for (var a in /(y+)/.test(t) && (t = t.replace(RegExp.$1, String(r.getFullYear()).substr(4 - RegExp.$1.length))), o) new RegExp("(" + a + ")").test(t) && (t = t.replace(RegExp.$1, 1 === RegExp.$1.length ? o[a] : ("00" + o[a]).substr(String(o[a]).length)));
          return t
        }(new Date, "yyyyMMddhhmmss"),

这块代码就是取当前时间然后转化格式,g = 20230411175542

l = "p".concat(u).concat(g),

l = “p” + 101 + 20230411175542 = “p10120230411175542”

f = t(t({}, c), {}, {
  micalltime: g,
  miversion: i.miversgin,
  misource: u
}),

f 就是把上文中的 g、i.miversgin、u 合并为一个对象

h = Object.keys(f);

hf 对象的所有 key 的数组

h.sort((function (e, t) {
return e.toLowerCase().localeCompare(t.toLowerCase())
}));

h 数组中的元素全部转小写

var d = "";
h.forEach((function (e) {
d += "&".concat(e, "=").concat(f[e])
})), d = d.substr(1);

声明一个空字符串 d ,然后把 h 中的元素全部使用 & 拼接起来

 var p = r.hex_md5("".concat(d).concat(s));
o = "".concat(l).concat(p)

d 和之前的 s 拼接起来使用 md5 加密之后,在和 l 拼接,结果就出来了

o = “p10120230411175542fab22e3db8c2d5a523289a398d920647”

部分最终代码

function getSign(e, n) {
    var i = {
        encodeNumber: "101",
        password: "4f0c6725d917f8fe4e2791921187fd7d",
        miversgin: "p"
    };
    s = i.password;
    var c = {};
    if ("string" == typeof n) {
        n.split("&").forEach((function (e) {
            var t = e.split("=");
            2 === t.length && (c[t[0]] = t[1])
        }));
    } else {
        c = n;
        if (e.includes("?")) e.substr(e.indexOf("?") + 1).split("&").forEach((function (e) {
            var t = e.split("=");
            2 === t.length && (c[t[0]] = t[1])
        }));
    }
    var u = i.encodeNumber;
    g = function (e, t) {
        var n = new Date(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate(), e.getUTCHours(), e.getUTCMinutes(), e.getUTCSeconds()),
            r = new Date(n.setHours(e.getUTCHours() + 8)),
            o = {
                "M+": r.getMonth() + 1,
                "d+": r.getDate(),
                "h+": r.getHours(),
                "m+": r.getMinutes(),
                "s+": r.getSeconds(),
                "q+": Math.floor((r.getMonth() + 3) / 3),
                S: r.getMilliseconds()
            };
        for (var a in /(y+)/.test(t) && (t = t.replace(RegExp.$1, String(r.getFullYear()).substr(4 - RegExp.$1.length))), o) new RegExp("(" + a + ")").test(t) && (t = t.replace(RegExp.$1, 1 === RegExp.$1.length ? o[a] : ("00" + o[a]).substr(String(o[a]).length)));
        return t
    }(new Date(), "yyyyMMddhhmmss");
    l = "p".concat(u).concat(g);
    f = _objectSpread2(_objectSpread2({}, c), {}, {
        micalltime: g,
        miversion: i.miversgin,
        misource: u
    });
    h = Object.keys(f);
    h.sort((function (e, t) {
        return e.toLowerCase().localeCompare(t.toLowerCase())
    }));
    var d = "";
    h.forEach((function (e) {
        d += "&".concat(e, "=").concat(f[e])
    })), d = d.substr(1);
    var p = hs.hex_md5("".concat(d).concat(s));
    o = "".concat(l).concat(p)
    return o;
}

// let url = 'https://miniapp.fang.com/pingyin/cityList';
// let params = {
//     'appname': 'fangx',
//     'v': '1.3.4',
//     'miniplat': 'weixin',
//     'scene': '1027',
// }
// console.log(getSign(url, params));

完整代码

关注公众号【趣码周】回复 ftx 即可获得。

关注我们

微信公众号:【趣码周文章来源地址https://www.toymoban.com/news/detail-443212.html

到了这里,关于【VX小程序逆向】房*下小程序pseusign参数分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【验证码逆向专栏】数美验证码全家桶逆向分析以及 AST 获取动态参数

    本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲

    2024年02月03日
    浏览(41)
  • 网易易盾——推理拼图验证码参数逆向分析和调用

    本篇文章主要是对验证的提交参数进行逆向分析,成功演示结果在最底部 目标网址 抓包 提交分析 拖动提交参数 以下几个参数是会变动的,所以我们主要是对这几个参数进行分析 我们先直接拖动验证一下,看下请求发送,会发送一个check请求,再查看一下请求堆栈调用,所

    2024年02月13日
    浏览(56)
  • 最新PDD批发Anti-Content参数逆向分析与算法还原

    【🏠作者主页】: 吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关

    2024年04月16日
    浏览(46)
  • 【Python爬虫案例】抖音下载视频+X-Bogus参数JS逆向分析

    选择自己感兴趣的抖音博主,本次以“经典老歌【车载U盘】”为例 每次请求的页面会有很多接口,需要对接口进行筛选: 第一步筛选XHR筛选 第二步筛选URL中带有post 通过筛选play_add值找到视频的地址 通过对比两次请求发现只有X-Bogus数值会有变化,max_cursor是用翻页,后文再

    2024年03月15日
    浏览(124)
  • 最新PDD商家端Anti-Content参数逆向分析与纯算法还原

    【🏠作者主页】: 吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关

    2024年04月09日
    浏览(39)
  • 【逆向】03-20扩大节 c++代码完成 ;类当作函数参数却调用了析构函数疑难分析

    若要看PE结构操作最新代码,点击主页查看!!   和上一节的代码相比,本文章主要修复了上一篇文章代码中PE类中的Analyze函数,这样不管是Before_Stretch_Data还是Stretch_Data,Shrink_Data,在这个函数中都可以分析出PE结构 另外新添加了函数Expand_Section函数,可以自动扩大最后一个

    2024年02月07日
    浏览(36)
  • 简单分享下小程序商城开发要多少钱

    小程序商城的开发费用因多种因素而异,包括以下几点: 一、功能需求:商城的功能要求不同,开发所需的工作量也会有所不同。例如,基本的商品展示和购买功能相对较简单,而复杂的订单管理、支付、物流等功能可能需要更多的开发工作。 二、设计与界面:商城的设计

    2024年02月12日
    浏览(45)
  • 小程序逆向分析 (一)

    李老板:奋飞呀,最近耍小程序的比较多,而且貌似js好耍一点?要不咱们也试试? 奋飞: 你是老板,你说了算喽。 第一次搞小程序,得找个软柿子捏,就找个以前分析过的某段子App的小程序吧。 反编译 静态分析 动态调试 春天在哪里? app下载回来就是apk包,那么小程序在

    2024年02月06日
    浏览(93)
  • 微信小程序逆向分析

    WeChatAppEx.exe 版本:2.0.6609.4 以融智云考学生端为例。 网上已经有关于微信小程序解密的非常优秀的文章,本着学习的目的便不参考相关内容。 笔者水平实在有限,如发现纰漏,还请读者不吝赐教。 如涉及侵权,请联系作者处理。 工具:火绒剑 首先看看打开一个小程序微信

    2024年01月16日
    浏览(37)
  • 微信小程序前端加解密逆向分析

    某小程序渗透测试项目,测试时发现请求包内容进行了加密 小程序文件目录: 使用网易Mumu模拟器,开启root权限,安装手机微信并访问指定小程序,然后打开RE文件管理器,在 data/data/com.tencent.mm/MicroMsg 会生成一个md5加密命名的文件夹,在该文件夹下的 appbrand/pkg 目录下找到

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包