EdrawMax的保护与绕过方法
本帖最后由 besterChen 于 2018-5-26 07:34 编辑刚发现的这个软件,画图很好用,奈何一直没有找到MACOSX环境9.1版本的破解版。所以就花时间自己分析了一下,有如下成果与大家分享。
# 软件大致的保护思路
---
软件整体的加密思路大致如下几个步骤:
1. 软件采用C/S结构的网络认证方法。
2. 获取系统的硬件标识符(后面详细说明获取方法)提交给服务端,服务端生成任意20位字符(字母数字组合)作为序列号(用作用户身份标识)。
3. 服务端用RSA的私钥对硬件标识符进行加密得到的密文就是激活码,用户名随意填写。
4. 用户点击激活时,除了校验填写的数据是否合规之外,还会发请求给服务端,服务端校验序列号是否存在,以此判断激活是否成功。
5. 如果网络请求失败可以离线填写激活码来激活(这就留下了安全隐患,可以绕过网络验证)。
6. 每次软件启动,都会将激活码用公钥解密并与系统的硬件标识符进行校验:一致就认证成功,否则就认证失败(这里也存在隐患,要暴力破解可以从这里入手,但是暗桩较多且不完美不建议从这里入手)。
# 绕过保护的思路
---
由于可以本地验证,我们可以生成自己的RSA公钥私钥,来对系统的硬件标识符进行加密,以此来绕过软件的认证。
通过分析可知在软件的`ObjectModule.dll(libObjectModule.dylib)`中存储了RSA加密的公钥,将其替换成我们自己的,然后我们用自己的私钥加密硬件标识符,这样就可以认证成功了。
另外需要说明的一点是,MACOSX系统中`libObjectModule.dylib`存储公钥的空间不足。我对OSX系统的`mach-o文件格式`不了解所以只能通过内存补丁的方法来替换公钥,大致思路是:
1. 通过分析可知`libObjectModule.dylib`文件加载后会在`dllmain`将公钥赋值给到导出符号: `__ZN12LocalizeUtil10s_locCodesE`中,如下图可知导出符号的偏移是: `0x0535be0`.
> !(https://attach.52pojie.cn/forum/201805/26/071611eb5hstpbpghr1orh.png)
2. 自己写程序,监控这个导出符号值的变化,来替换公钥, 我是另起了个线程监控这个值。本来是想写钩子实现,但是C代码用FishHook库这种导入表钩子不知道如何挂钩dllmain这种方法,貌似它只能挂钩 nl或者la类的符号表。
3. 这个导出符号的内存结构是QT的`QByteArray`的内存结构,所以我用QT5写这个dylib(`libDTPatcher.1.0.0.dylib`)直接替换不用自己拼这个内存结构了。
4. 用 `yololib` 添加自己的dylib为依赖,我找了一个比较小的dylib: `libImporter.1.0.0.dylib`来加载自己的dylib文件。
5. keygen就用不着说了,一切都很明了。
# 硬件标识符的获取方法
---
整个硬件信息的获取及编码方法是通过 `libImporter.1.0.0.dylib` 的中导出方法: `__int64 __fastcall PDFExporter::exportEffectShine(PDFExporter *this)` 进行的,有兴趣的童鞋可以跟着一起分析一下,这下只说结果,不贴代码了。
### Windows 环境
1. 通过 `wmic CPU get ProcessorID` 命令获取CPUID。
> 例如得到的是: `BFEBFBFF00040661`
2. 通过 `wmic diskdrive get SerialNumber` 命令获取硬盘序列号。
> 例如得到的是: `4e4d534246484b524e314d443733565243444a57`
3. 通过 `wmic csproduct get UUID` 命令获取主板的UUID。
> 例如得到的是: `EE049876-335D-C447-BD48-A27C393B5C95`
4. 将上面得到的字符串用 `-` 字符以 UUID-硬盘序列号-CPUID 的顺序拼接起来。
> 例如得到的是: `EE049876-335D-C447-BD48-A27C393B5C95-4e4d534246484b524e314d443733565243444a57-BFEBFBFF00040661`
将这些字符串用MD5加密,并截取密文的6~9个字符。如下:
```
// 1. `EE049876-335D-C447-BD48-A27C393B5C95-4e4d534246484b524e314d443733565243444a57-BFEBFBFF00040661` 用MD5加密并截取字符串:
664BF64B6C183B297BC26A723EED0E23
----
5(4): 64B6
// 2. 主板UUID `EE049876-335D-C447-BD48-A27C393B5C95` 用MD5加密并截取字符串:
22D148767E9169B049BF7ADC653DB4D6
----
5(4): 8767
// 3. 硬盘序列号 `4e4d534246484b524e314d443733565243444a57` 用MD5加密并截取字符串:
4400AAFBA449B4CBF8DADB3F78CC0405
----
5(4): AFBA
// 4. 将上面截取得到的字符转换成小写字母拼接起来得到硬件标识符: `64b68767afba`
```
### MacOSX 环境
1. 获取硬件UUID
```
ioreg -c IOPlatformExpertDevice | grep 'IOPlatformUUID' // 这样加密后得到第二组token
```
> ` | "IOPlatformUUID" = "BFE1056A-DBE1-5CC2-BDB8-EBC3A80C108B"`
> 加密得到: `22B76BFDD00D1E58BC2733D2E8FE93C9`,截取6~9个字符得到: `BFDD`
2. 获取系统序列号
```
ioreg -c IOPlatformExpertDevice | grep 'IOPlatformSerialNumber'
```
> ` | "IOPlatformSerialNumber" = "C02NGJPVG3QC"`
> 加密得到: `5AE2186EB36AD059F3A7DDDC4A8D7FD1`,截取6~9个字符得到: `86EB`
3. 将上面两个完整字符串用`-`连接起来,得到:
> `BFE1056A-DBE1-5CC2-BDB8-EBC3A80C108B-C02NGJPVG3QC`
> 加密得到: `D7207A086F1353DABCFBAA52B8A57DC3`,截取6~9个字符得到: `A086`
4. 将上面截取出来的字符串按照3,1,2的顺序排列并转换成小写字母得到硬件标识符: `a086bfdd86eb`
# 后记
---
以上思路应该是通杀现有所有平台和版本的,我上传了补丁和我生成的key文件,keygen由于太大,大家自己到github上下载吧。
相关的代码与文件,我放在github上了: (https://github.com/datochan/DTEdrawMax),keygen 方面,由于我不用windows这部分代码空缺,有需要的童鞋可以自己补全这部分代码。
本帖最后由 besterChen 于 2018-6-14 15:04 编辑
zxy20014 发表于 2018-6-4 16:43
我看他的mindmaster也是采用这种方法,楼主能否写个这个的替换文件,哈哈
libedimporter.1.0.0.dylib
恩,这个软件我也在用~
公钥是存储在 `libedobjectmodule.1.0.0.dylib` 的 `_ZN9EEMMShape11s_mmLayoutsE + 0x10` 中。
由于我QT的开发环境已经卸载了,所以就直接修改帖子附件中的 `libDTPatcher.1.0.0.dylib`文件了。
找了个比较小的dylib用来加载自己的dylib文件。
为了避免有人也要windows版本的,顺便再追加一个windows版本的附件。
具体参考附件,破解方法都是一样的。 f23258 发表于 2018-5-27 14:00
不好意思,是我表达没到位,那两个截图的对比,主要是在图形和名称上,试用版物品和名称是对得上的,而替 ...
好像有一个md5校验,你搜索字符串mdfive就能找到几处,这个可能要patch掉,还有一个可能的问题是选择打印的时候出错,我不知道这样替换会不会遇到。 差点被误导 :lol 似乎10.x的变动也不是很大,感谢楼主给的启发。
deadlybugs 发表于 2018-8-18 18:31
9.2版本出来了,楼主的办法还有效吗? 试着MAC上直接拿9.1的覆盖,程序闪退。
这个补丁是依赖 EdrawMax9.1版本写的,补丁中为了省事儿用了硬编码,所以肯定无法直接用于9.2版本的。
通过分析可知libObjectModule.dylib文件加载后会在dllmain将公钥赋值给到导出符号: __ZN12LocalizeUtil10s_locCodesE中,Mach0View查看导出符号的偏移是: 0x0535be0。
补丁中直接使用了这个便宜的硬编码,要想提高通用性需要解析 libObjectModule.dylib文件的mach-o文件头动态获取此偏移地址就可以通杀目前市面上所有的版本了。
9.2版本的偏移地址是: 0x052BC70,只需要修改补丁文件,重新编译即可。
出这个帖子也只是为了说明思路,不想直接提供通杀的破解补丁,还请见谅。 本帖最后由 qzr 于 2018-6-14 01:14 编辑
其实这个暗桩并不多,爆破也不是很难,各位也可以试试我这个补丁(这软件算是较为优秀的国产软件,所以我故意没有去掉试用版和购买的标识,但功能应该正常)
但是楼主注意下这个程序是有自校验的!简单替换公钥是会遇到错位暗桩的! 本帖最后由 besterChen 于 2018-5-27 07:52 编辑
keygen不用非得用QT写,随便一个能做rsa加密的语言就可以。而且原理都已经知道了,也没有必要非得纠结自己是否会编程啊,办法总比困难多,为啥非得逼我作一个宣传破解软件的呢?
我来一个一行代码不写就可以免费使用这个软件的方法
### 需要用到的工具
1. MD5加密工具: http://tool.chinaz.com/Tools/md5.aspx
2. rsa私钥加密工具: http://tool.chacuo.net/cryptrsaprikey
3. base64解码工具(支持16进制显示):http://www1.tc711.com/tool/BASE64.htm
4. 一款支持正则的编辑器: `Sublime Text`
### 操作步骤
1. 根据楼主帖子的文字收集硬件标识码,并通过MD5工具加密,得到最终的硬件标识符, 比如我电脑的硬件标识符是: `a086bfdd86eb`
2. 用rsa加密工具以附件中的秘钥文件对硬件标识符加密,得到的结果是
>vagEcQbQ5wMYIEzvD7a7mLIoYAsN5yhXbdQU7Uq+p59H5qjt54r4bHleRmNzxhv6M0LwPuiOV47l+jbilbK/NCTPqKtpvH2lIF4Nmh+clp7MILQRdczI45Fryu4SZQAzIFBhgf5MDCiHS7dqdMm+dj6D+0TKSmmSKzwZ3Y10njU=
>
3. 用base64工具解码为十六进制字符,如下图:
>
4. 用编辑器去掉无用字符,得到最终的激活码:
> bda8047106d0e70318204cef0fb6bb98b228600b0de728576dd414ed4abea79f47e6a8ede78af86c795e466373c61bfa3342f03ee88e578ee5fa36e295b2bf3424cfa8ab69bc7da5205e0d9a1f9c969ecc20b41175ccc8e3916bcaee1265003320506181fe4c0c28874bb76a74c9be763e83fb44ca4a69922b3c19dd8d749e35
### 破解过程
1. 安装原版程序(我的是目前最新的9.1版本, 其它版本应该也通用)。
2. 运行起来,断网,输入用户名,随机的20位大写字母数字组合的字符串,点击激活。
3. 提示网络失败后,输入刚得到的激活码点击手工激活。
>
4. 将帖子附件中的文件替换到应用程序指定目录中。
> MACOSX系统是在应用程序包的Framework目录下。
> WINDOWS系统是在应用程序的安装根目录下。
5. 重新启动应用程序,破解成功。
>
*windows环境也是一样的过程,就不用重新截一遍图了.*
哎,我是小白,怎么用啊?windows用户居多,老大能不能搞个windows的版本的?网上windows的也不好用。 不好使,退钱呀,哈哈 这个很厉害啊,谢谢分享。
之前一直在用8.4版本。 kinyon 发表于 2018-5-26 08:20
不好使,退钱呀,哈哈
人穷智短。。。
这个很厉害 分享一下,看看效果,谢谢。 WIN的用户无法享受了~ WINDOWS可用吗 本帖最后由 besterChen 于 2018-5-26 11:20 编辑
WIN环境也是一样的过程,没有一点儿变化啊:
1. win版本已经替换过公钥的dll以及秘钥文件都已经给出来了。
2. 硬件标识符的获取方法也给出了
> ![获取硬件标识符的截图](https://attach.52pojie.cn/forum/201805/26/111704of1g29wdmcbgbw20.png)
3. 只需要自己写个rsa的加密程序用秘钥生成激活码就可以了,只是我电脑配置不高,虚拟机里面装不了QT环境没写到keygen代码中而已。
我给出win和osx的效果图。