Mac OS X下一软件Voila注册算法分析
Voila keygen
工具: IDA v5.2, gdb
IDA可以用Wine在mac os x上跑起来,或者有两台电脑,一台windows,跑IDA,另一台Mac。
在windows平台中打开ida,加载Voila(Mac OS X binary)
找到的关键地方为:
000A9B8F __VLRegister_registerContinue__


下面再跟进下面的函数:
000AA67A __VLRegister_validateKeyWithInfo_Fortype__
在000AA681执行后,查看ecx:

下面,判断使用什么key

参数nType_C是从下面传进来的.
__text:000A9C0B C7 44 24 0C 00 00 00 00 mov [esp+0B8h+var_AC], 0
看看key:

继续:

注意到上图最上面两行, 两个常数, 为方便起见,就当作是一个int64整数.
跟进_GetSystemInfo
实例化一个SystemState类

进入构造函数 SystemState::SystemState(unsigned char const*, char const*, long long, EValidationType):

如果没有传入上面提到的int64常数,则调用GetSeed函数来生成一个int64.
继续:

SystemState::GetFirstState 用来校验注册码的长度(0x20)和注册码的字符(数字和字母).
再跟进 SystemState::GetState

首先调用SystemState::GetDecryptText,然后对解出来的信息进行校验.
跟进SystemState::GetDecryptText:

取出序列号的最后一个字符,然后找到这个字符在” NIWHSALRMPJ5EKTUYX3012QV67ZGF984”中的位置(第一个字符位置为0),设为LastCharIndex。
下面再从注册码中的LastCharIndex开始,取5个字符,设为Part_5,将剩余的26个字符,合并为Part_26

再来看看SystemState::GenerateEncryptedPart
这个函数先将注册码分割为两部分,再将注册码用其在两个字符串中的位置所代替。
偶数字符从 SystemState::m_acSet2 db 'BCDORSJAMP5LEKTUYX3012QV67ZGF984',0 中取
奇数字符从 SystemState::m_acSet1 db 'NIWHSALRMPJ5EKTUYX3012QV67ZGF984',0 中取
注册码的第一个字符为0,偶数字符
再往下看

函数SystemState::ConvertNToHexa,将part_5转换为密钥(aes128),当成一个int64来看。
来看看函数SystemState::ConvertNToHexa的关键代码:

将part_5紧凑起来。因为两个字符级是32,index最大31,占5个bit,因此将这些5bit合并,使得每个字节的每个bit都利用。
同时将这个int64变成一个字符串。
jmp SystemState::GenerateNinHexa(uchar *,ulong long) ; 将int64变成字符串
再看看part_26的转换:

将26个index,也紧凑起来。
继续
调用CAESDecryptor::DecryptText,将part_26用part_5作密钥来解密

解密之后,回到函数SystemState::GetState
校验解出来的16个字节,以及part_5
解密出来的16个字节必须是 ds:__ZL13KeyForGeneric

part_5得到的int64,必须比上面提到的int64 0x00000000 001e8480 要小
Over。
剩下的活,就是写注册机。
该公司的另一款产品web2delight,算法一样。
关键代码为:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
