某团某点评mtgsig1.2 && H5guard加密算法剖析

仅供研究学习使用。
今天带来的是某点评headers中mtgsig参数的逆向。
目标站:某点评网m端 --> 传送门
上个月的时候写了一篇商家后台1.1算法的 某团mtgsig1.1 && H5guard加密算法剖析感兴趣可以回顾一下 )其中1.1的算法检测比较少 难度也较低 今天我们就看下最新的 也就是市面上目前c端产品的1.2算法,废话不多说 直接开搞。


我直接直接找了一个会有检测的接口

url = "https://mapi.dianping.com/mapi/fun/shopdetailktvbooktable2.json2?token=null&clienttype=miniprogram&shopuuid=l5IofsXTPiz3xNNE&device_system=&yodaReady=h5&csecplatform=4&csecversion=3.1.0"

如果不带mtgsig这个参数的话 则会返回

在这里插入图片描述
直接给403了 而且如果被检测次数过多 还会存在封号风险(一般24小时左右解封)


先来看一下这个mtgsig的各个参数

{
    "a1": "1.2",  # 固定版本号标识
    "a2": 1744098324148,  # 时间戳
    "a3": "z612xyxv732v50vu0...w06y9795811v7y4z1",  # cookie相关的一个参数 dfpId
    "a5": "KhMJaJpaXSyx2t2ovUqoKWvQ0EvT3dlnlDJ/+ER9HyOWMxm2SxVAkiIO1EvavRySYI==",  # 暂时未知 动态加密参数
    "a6": "h1.8WGR6bK+cYO4T1hvy85o24ZIT/U1UIiU9ILm/9nPhCBS0sSs3MIFV6qcdL+Ni0bTlMvTmlO3rbKcmZuz0gzQAucgVwWgfndN6Z/NEgREgJU8dw7pzpHIyLB8Qgmq3AURGsepuCg3JEKDb1//hW9nv9QfdC+7+svagaoDF3O5wt7/D1pwV23H9x/BtXmnV7eWk85f80oPxMdFrQl0DvAGBzcpfYoVk9gVK2QzgL7SOGxub+VlKiMwJPUb6CBcK1iHI1T9q9r8u/54eum+7xAgjGYEAvAoKIjzHoSwKmrqxUBnr0PSW70SW/P7Y3n8WyZx90QyI91kyiGnSbWUiiFAxtXvQThNsLh1PEZkRFIPg6cIg7g7E4amNC9wicruimG7g",   # 暂时未知 动态加密参数 目测是一个aes后输出的base64 这个根据1.1经验推测的
    "a8": "3aa4f8a0d0e02e0f722d53a8f0a0e5bc",   # 暂时未知 动态加密参数 目测md5
    "a9": "3.1.0,7,61",  # 暂时未知 动态加密参数 感觉可以随机
    "a10": "c5",  # 固定即可
    "x0": 4,    # 固定即可
    "d1": "dc742acf2d566fac71a74969f1224560"   # 暂时未知 动态加密参数
}

在这里插入图片描述

这里还是先找到入口参数 实际上跟1.1几乎是一模一样的 我们还是复刻操作即可

通过堆栈进入 H5guard.js 文件中,发现有大量的混淆,如下所示:

在这里插入图片描述

这里我们可以用ast解混淆一下 让代码可读性变强 把_b(数组下标)的值全部替换成字符串明文

在这里插入图片描述
在这里插入图片描述

大数组混淆替换以后就是常规的操作了 补环境或者搞纯算法 我们这里还是采用1.1的思路 强行去把环境补全

不过由于1.2的检测点贼多 我们简单补的那些location、navigation、screen 还不足以通过校验

所以这里我们需要找到检测环境的入口

gY = eN(hs, !1, hl)

在这里插入图片描述

实际上这里也是a6的生成所在

在这里插入图片描述

然后我们根据这个k值去缝缝补补 逆向推导一下环境检测就可以了

这里贴一部分需要检测的环境

window = this;
window.H5guard = undefined

Window = function Window(){}

Window = new Window()
Window.toString = function toString(){
    return 'function Window() { [native code] }'
}
Window.toString.toString = function toString(){
    return 'function toString() { [native code] }'
}

window.setTimeout = function setTimeout() {}
window.onerror = {}
window.localStorage = {
    getItem :function getItem(){
        return null
    }
}

window.sessionStorage = {}
window.indexedDB = {}
window.chrome = {}
window.AudioContext = {}
window.location = {}
window.document ={}
window.location.href = 'https://mapi.dianping.com/?time=1743062044802&ignoreSetRouterProxy=true#/gw/static_resource/product#/listView'
window.location.host = 'mapi.dianping.com'
// window.navigator = {webdriver : false}

Location = function Location(){}
Location.prototype.href = "https://mapi.dianping.com/?time=1743062044802&ignoreSetRouterProxy=true#/gw/static_resource/product#/listView"

location = new Location()


Screen = function Screen(){}
Screen.prototype.availHeight = 1040
Screen.prototype.availLeft = 0
Screen.prototype.availTop = 0
Screen.prototype.availWidth = 1920
Screen.prototype.height = 1080
Screen.prototype.isExtended = false
Screen.prototype.width = 1920
Screen.prototype.height = 1080
Screen.prototype.orientation = {type:"landscape-primary"}
Screen.prototype.pixelDepth = 24
Screen.prototype.colorDepth = 24
screen = new Screen()



XMLHttpRequest = function XMLHttpRequest(){}

Navigator =  function Navigator(){}
Navigator.prototype.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
Navigator.prototype.platform = 'Win32'
Navigator.prototype.cookieEnabled =true
Navigator.prototype.plugins = {}
Navigator.prototype.permissions = {}
Navigator.prototype.onLine = true
Navigator.prototype.vibrate = function vibrate(){}
navigator = new Navigator()

Navigator = new Navigator()
Navigator.toString = function toString(){
    return 'function Navigator() { [native code] }'
}
Navigator.toString.toString = function toString(){
    return 'function toString() { [native code] }'
}


URL = function URL(){}
URL.prototype.revokeObjectURL = function revokeObjectURL(){}
URL.prototype.createObjectURL = function createObjectURL(){}
URL = new URL()
Blob = function Blob(){}
// Blob = new Blob()

// TextEncoder = function TextEncoder(){}
// TextEncoder.prototype.encode = function encode(){};

// TextDecoder = function TextDecoder(){}

// TextDecoder.prototype.decode = function decode(){};

Document = function Document(){}

实际上这里确实也就是把k1 k2 k3 … kn 的环境变量检测拿去做了aes加密 最终输出base64 我也分析了一下纯算法 就是扣扣扣完事

在这里插入图片描述

有一个坑点要注意,它的秘钥 key 是动态的。原因是生成的 66 位大数组是随机的。

至此逆向部分就结束了 我们再用express写一个接口暴露出来供python调用

在这里插入图片描述
在这里插入图片描述

最后再测试一下某点评的接口是否能跑通

在这里插入图片描述

Ending

Github传送门

持续更新ing (欢迎各种star与fork)

如有权益问题可以发私信联系我删除

目录 - 算法美团“猜你喜欢”深度学习排序模型实践 ...................................................................... 4 美团大脑:知识图谱的建模方法及其应用 ...................................................................... 16 深度学习在美团搜索广告排序的应用实践 ...................................................................... 37 美团深度学习系统的工程实践 ...................................................................... 47 美团餐饮娱乐知识图谱——美团大脑揭秘 ...................................................................... 56 美团在O2O场景下的广告营销 ...................................................................... 68 美团外卖骑手背后的AI技术 ...................................................................... 85 基于TensorFlow Serving的深度学习在线预估 ...................................................................... 102 强化学习在美团“猜你喜欢”的实践 ...................................................................... 112 深度学习在文本领域的应用 ...................................................................... 125 机器学习在美团配送系统的实践:用技术还原真实世界 ...................................................................... 143 如何基于深度学习实现图像的智能审核? ...................................................................... 154 深度学习在OCR中的应用 ...................................................................... 163 AI技术在智能海报设计中的应用
### 如何在 IntelliJ IDEA 中使用 Git #### 配置 Git 环境 为了能够在 IntelliJ IDEA 中顺利使用 Git,首先需要配置好环境。这涉及到指定 Git 可执行文件的位置。 通过菜单栏中的 `File` -> `Settings` (对于 macOS 用户则是 `IntelliJ IDEA` -> `Preferences`) 进入设置界面,在左侧列表中依次展开 `Version Control` 并选择 `Git` 选项卡[^3]。在这里输入本地安装的 Git Bash 路径下的 `git.exe` 文件位置,并点击 TEST 按钮验证是否能正常识别出 Git 版本号;如果显示出了具体的版本信息则表明配置无误。 #### 初始化 Git 仓库 当开发人员想要将现有的项目纳入版本控制之下时,可以通过两种方式来初始化一个新的 Git 库: - 方法一:右键单击项目的根目录,从弹出菜单里选取 `VCS` -> `Import into Version Control` -> `Create Git Repository...` 来启动向导程序; - 方法二:直接利用顶部工具条上的快捷按钮组合 `VCS` -> `Enable Version Control Integration...` 同样可以达到相同的效果。 一旦选择了上述任一种途径之后,按照提示操作即可完成整个过程——即在一个已有的 Idea 工程内部建立起对应的 .git 子文件夹作为工作区副本的一部分。 #### 基础命令介绍 除了图形化界面上的操作外,掌握一些基本的终端指令也是非常有帮助的。比如克隆远程仓库到本地的例子: ```bash $ git clone https://github.com/noobgod/designPattern.git ``` 这条语句会下载目标地址所指向的内容至当前所在路径下新建立起来的一个同名子目录内[^1]。而另一个例子展示了怎样获取由 cunyu1943 维护着的一系列 Java 编程实例资源库: ```bash $ git clone https://github.com/cunyu1943/java-programming-instance.git ``` 以上就是有关于如何在 IntelliJ IDEA 上面运用 Git 的概述以及部分具体实践指导[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值