记一次对某邮箱软件账户数量上限破解
本文仅做技术交流,请支持正版软件
前言
邮件这个东西对我来说一直很重要,我最开始用的是巨硬的那个邮件 UWP 客户端,那个是真的好用,但是耐不住巨硬要推他那个 Outlook New,然后邮件 UWP 就死翘翘了
之前我找到一家厂子的邮件客户端很好用,但是它限制普通用户只能有 10 个邮箱账户,我自己的邮箱都不止十个了,这哪里够用,然后我就转战了 DreamMail
但是 DreamMail 我近期发现有些邮件它看不了(体现为邮件内容全白),并且这个客户端存在编码问题,会导致邮件内容显示出问题
于是我就又尝试用回了某厂的这个邮箱软件,但是限制 10 个账户咋办嘛,那就只能发挥我只学了一点点的逆向技术去改一改了
本文旨在记录我逆向研究的过程,请支持正版软件
破解过程
本次用到的客户端版本是某厂的 5.4.2.1011 版本,这个算是一个比较老的版本了
安装软件
这点倒没啥好说的,勾选同意各种协议即可
因为我以前的数据是在的,所以安装完打开就告诉我登录邮箱达到上限了
定位限制所在位置
先看看这个程序是什么东西写的,打开目录发现本体才几百 K,有个版本号目录,点进去发现有 Qt 组件,应该是 Qt 没跑了
尝试找一下提示所在的位置,添加邮箱的时候,软件会弹出一个提示,让我们开通会员
所以直接找提示,又因为在当前目录找到了一个 webui.zip,所以猜软件应该是从 zip 文件中获取它的前端内容,解压一下,直接搜关键词「登录邮箱」,搜出来一坨
直接看到有个 app.min.js,直觉告诉我一般在这种地方,不对的话……再说吧
1 | s.createElement(_.AlertMaster,{className:O.account_limit_tips,alertType:"error",alertContent:r.dashiPlusVipState>0?"登录邮箱达到最高上限,建议您适当删减不常用的邮箱。":"登录邮箱达到上限,建议开通大师会员解锁更多邮箱数量或删减不常用的邮箱。",closable:!0,onClose:function(){t.setState({showAddAccountLimitTip:!1}),w.stat(w.STATS_KEYS.pc_accountlist_email_limit_close_click,{})},seamless:!0,actions:r.dashiPlusVipState>0?[]:[{text:"立即解锁",onClick:function(){y.AccountInfoPrefHandler.navigateTo({path:"web",params:{url:t.state.configInfo.ds_setting_accountlist_dashi_master_link||"",isModal:!0,sharedWebId:"pay_vip_window",pageSize:{width:786,height:600}}}),w.stat(w.STATS_KEYS.pc_accountlist_email_limit_unlock_click,{})}}]}) |
可以看到上面的内容,与我们看到的弹窗基本相符。可以看到这里有一个检测是否为 VIP 的过程,稍微搜一下什么 Account Limit 之类的关键词,可以搜到有一个 addAccountLimit,可以猜测与账户数量限制有关
刚刚说了这是一个 Qt 程序,它的主逻辑也不在那个几百 k 的启动程序,所以再去看看文件,发现有 mastercore.dll
尝试丢进 IDA 反编译,搜索字符串,发现对应的东西
双击以后按 X 看看引用,可以看到有这样的逻辑
1 | HIBYTE(v24) = 0; |
进入 sub_1009211B 函数看看,可以发现限制所在的位置
1 | char __cdecl sub_1009211B(_BYTE *a1) |
这里对 VIP 和非 VIP 进行了判断,明显下面的 else if 就是我们非会员的情况,限制了 10 个账户,而会员给到了 100 个的额度,在上面的 js 代码中也能看到会员其实也有数量限制,能够确认的是 var_20 是普通用户限制,var_24 是会员用户限制,所以先改个名字为 userLimit 和 vipLimit
1 | userLimit = 10; |
修改上限数值
对这里的数值进行修改,虽然这里给到了 int 类型,但是我还是改的稍微保守一点,都改成 255 吧(FFh)
我这里用 patch bytes 改的,keypatch 不知道为啥会炸
改好了以后预览一下改的内容
然后导出程序,得到修改后的 dll,直接覆盖到程序里面去,结果……没成功?
nop 掉恢复函数
经查发现后面还带着这两个限制变量跑了一个 sub_10091545(&userLimit, &vipLimit);
翻了一下这个函数,是一个从文件读取配置的函数,读取不到就自动恢复成 10 和 100
1 | int *__cdecl sub_10091545(int *arg0, int *n100_2) |
我管你那么多,直接不让跑,nop 掉
重新导出一下,覆盖
这下就没有讨人厌的提示了
验证
此时尝试添加一个新的邮箱,发现登陆框正常弹出,游戏结束
做 Patcher
以上原理有了,让 AI 写个脚本来 patch 吧
因为在反编译的代码里面,userLimit 和 vipLimit 都给到了 int 类型,所以可以大胆改成一个很大的值
https://github.com/GamerNoTitle/MailMaster-Account-Limit-Escaper
后记
这是我第一次做这种破解类的事情,但是但是但是,好孩子不要学哦,我做这个只是用来学习的,被 Cracked 的程序已经被我恢复原样了




























