DiskGenius Pro 4.2.0.100注册算法简析 下载本文

这部分很容易,先随机生成注册码的前22位,再将16bits的Hash值编码为Base32字符得到注册码的末3位。

二.激活请求发送了什么

现在注册码是有效的了,试着激活。但这次是服务器回答“Error: 注册码无效!”,这里可理解为:注册码仍然有问题、确实无效,或有效、但在它的数据库中没有记录,还可能数据库存在记录、但其他字段不匹配。无论那种情况都不可能指望它返回有用的信息,也不好意思老去骚扰人家的服务器。

换个思路,转而从处理返回结果的代码着手。为方便和避免错误,我需要在本地启用HTTP服务,将激活服务器的地址指向本地,进行模拟。程序需要什么数据,就按要求响应它,让我能一步一步走下去。

但再这之前,得搞清楚程序向激活服务器发送了些什么数据,以帮助我们猜测和理解返回数据的构成。用Wireshark这类的工具记录一下HTTP的Request和Response内容。

捕获的数据简单明了,它使用GET方法发送请求数据,URL中各字段依次为(在跟程序时也可观察到):

1. ver=4.2.0.100

2. code=YH23U-R65WC-CKPA2-RN2JB-XENVZ 3. name=MistHill

4. email=misthill@easycompany.com

5. mid=mOD_CDOcD^OFHLOHLHLLL 6. appname=DiskGenius

7. diskinfo1=XCyo|kXg|z{obGJKFo|jJ|gxkQ>?>>>>>>>>>>>>>>>>>?Q:?

7:=>:>

复制代码

注意到:首先,传递的值一定要编码为有效的URI(Uniform Resource Identifier)。其次,mid和diskinfo1的内容是加密的,其他字段的含义一目了然。

mid从字面上理解意为机器码,为三次CPUID指令的结果变化而成。

diskinfo1显然代表磁盘信息,我在调试的机器上都只挂了一块硬盘,两块及以上的情况是不是还会发送diskinfo?,没仔细查程序代码,不能确认。

程序为找到的每一个磁盘都创建一个磁盘对象,共支持0x80个磁盘。对每个磁盘对象,调用两次KERNEL32.DeviceIoControl。第一次取Geometry,第二次取ProductId和SerialNumber。

根据Geometry计算出磁盘的总扇区数,再加上ProductId(型号)和SerialNumber(序列号)得到diskinfo1的内容。

三.实现一个简单的HTTP服务

前面讲到激活分网络和加密锁两种方式。没有加密锁可以写一个Driver来模拟,为使事情变得简单,我选择网络方式。在本地如果有现成的IIS或Apache[Tomcat],可简单地写个页面来响应请求。

这里我决定借用现成的模板写一个APP来实现简单的HTTP服务,我就不用在调试虚拟机上搞一大堆东西,也方便以后类似的工作。

可以找到很多类似的东西,但我希望尽可能简单,并一定要有详细的文档。来自IBM的Nigel Griffiths有一篇\nweb: a tiny, safe Web server (static pages only)\就非常不错,全部C源码仅200行,支持静态页面.html或.htm、图像、压缩文件。遗憾它需要UNIX系统,如Ubuntu、Fedora、OpenSUSE和Debian等。

我需要Windows环境的。MSFT的David Cook一篇\Write a Simple HTTP-based Server Using MFC and Windows Sockets\正是我要找的,文章发表于MSJ(Microsoft Systems Journal - MSDN的前身)February 1996。嗯?,这么古老的东西?没错,就是它。越早越容易被奉为经典。

它的工程名称为Webster,文章十分详细,涵盖HTML、HTTP、Sockets等,可设置Server的基本选项,高度可控;\可扩展;支持详细的调试和日志记录;支持\图标;源码注释得也很好。

编译连接后,先用Telnet测试一下:

啊哈,工作完全正常!现在我们可以使用自己的“激活服务器”了。但是激活时Webster服务器Hung在那里,追查Bug:发现用于接收GET请求URI的Buffer太小,请求的URI字符串太长造成“缓冲区溢出”。 再来,这次没问题了:

对工程Webster改了大概以下几处:

a) HTTP/1.1协议支持,96年那时还只有HTTP/0.9和HTTP/1.0。 b) URI缓冲区大小。

c) 由CScrollView派生的CWebView水平滚动条支持。

d) 由CPropertySheet派生的CWebProps各属性标签CPropertyPage里Controls的字体。

四.完美激活

接下来,根据程序处理激活码那部分代码的分析,开始写注册机。因为要用到CPUID指令和API调用,用VC++来写。