已经拥有的东西很容易会被忘记。而我的这个坏毛病更夸张一些,经常会付完钱忘记拿东西,或是买回家了忘记用。我的苹果和苹果版IDA这样安静的在抽屉里睡了大半年。。。

一直以来都想琢磨琢磨苹果,但总是因为这个那个原因耽搁了下来。今天就找个什么练练手熟悉一下吧。。。UltraEdit是个挺熟悉的名字,虽然在Windows中没用它,在Mac下也没这个计划(有010 Editor了,关键是它的授权双平台都有效),新版本2.3.0.0大前天才发布,Google一下也没发现苹果版的注册机,就它了。

第一次正式用苹果版的IDA(以前打开过,但没分析过),虽然有些不习惯,但总的来说和Windows下的没有很大的区别(这得归功于QT跨平台统一的界面,虽然有些不舍IDAG,但从6.2开始也不得不放弃了)。只不过UltraEdit文件实在是太大了。。。足足50兆。。。差点没把IDA累死,不过这还不算什么,后面还有更大的惊讶。。。
   
虽然不熟悉环境,不过运气不错,很快就发现用户名和注册信息保存在User/Library/Application Support/UltraEdit/uex.conf文件中。
   
[Registration]
Registration\ Name=7065646979
Registration\ Code=454C49525A2D5347494A…
   
保存方式很简单,类似于Windows环境中的INI文件,字符串转换为十六进制后保存
   
先简单查看一下初始代码


很显然,是否注册的控制位保存在图示数据结构的偏移地址0x120处。
   
往回找找看。。。 4428AC找到了关键函数ueMain::OnProcessRegistration


究竟要如何实现442D9E处的bl不为0呢?往回看看算法。。。
  
先是位于442B27GetKeyIdFromKey函数。这个函数名有些不太准确。该函数的主要功能是检测注册码长度是否大于0x12,注册码第5个字母是否为大写的Z,注册码第10,第15个字母是否为合法的主从版本号。并返回相应的版本号。
   
接下来是位于442BE2DeObfuscateKey函数。该函数很显然是基于注册用户名,对注册密码反混淆(转换为目标密钥)。
   
最后的关键是位于442CF4_hgf9q9h9h3298hr89fw函数。这个函数基于注册用户名以及反混淆后的密钥进行计算,并设置一系列的DWORD442B27处的bl正是基于这些DWORD 计算后得出的。


算法本身就不多说了,整理一下丢个注册机出来(没在苹果下写过程序,所以只好先在Windows下凑合一下,见谅)。

UEMKGen.7z

Windows平台下他们的产品似乎注册机泛滥,虽然我没看过但估计强度也不会太高。苹果版UltraEdit的注册机虽然没看到,估计是玩的人不多吧。感觉作者虽然做了一些努力,可惜强度一般。而且整个框架通过一个注册控制位来控制有些太软了(非常容易爆破)。

UltraEdit似乎是一款比较成功的产品,只不过有一点实在让我惊讶。。。部分函数实在是长的变态,有兴趣的朋友不妨看看位于48223CueConfig::LoadFromConfig

好了,就到这里吧,第一次逆苹果练练手而已,也希望有朋友喜欢这颗万圣节糖果