破解AIM2000 ver2.0 demo版的流程

注:此文已经完全没意义了,Multiwfn (http://sobereva.com/multiwfn)做AIM分析比AIM2000快得多、功能强大得多、灵活得多、好用得多还完全免费,见
使用Multiwfn做拓扑分析以及计算孤对电子角度 http://sobereva.com/108
使用Multiwfn做电子密度、ELF、静电势、密度差等函数的盆分析 http://sobereva.com/179


破解AIM2000 ver2.0 demo版的流程

文/Sobereva @北京科音
First release: 2010-Dec-21   Last update: 2010-Dec-30


在破解软件、汇编方面笔者并不灵通,虽说当年自学汇编初衷之一是为了破解软件,但一直未操刀破解过软件,如今也生疏了。饭后看了篇关于软件破解的帖子,觉得这并不复杂,于是就用AIM2000 ver2.0 demo版实践了一下(尽管我这里也有正式版,破解demo版纯粹是为了玩),这个能免费下载的demo版的原子数上限是8,轨道数上限是14,GTF上限是128。笔者没想到如此轻而易举地就破解成功了,在此介绍下流程,以供参考,有些地方可能说得不准确。大家有兴趣也不妨多试试破解其它软件。

按照软件破解的一般流程,先要看软件是否加了壳。所谓加壳,就是将.exe、.dll等类型文件通过专门的加壳程序(如ASPACK, UPX)进行处理,一方面使得文件体积变小,相当于对文件进行了压缩,但使用时不必解压;另一方面使得程序内容无法直接被篡改。PEiD是常用的且免费的检测文件是否加壳以及壳的类型的工具。如果文件被加了壳,就要用专门的脱壳工具脱壳后才能进行破解,注意脱壳后程序能照常使用,只是体积会变大。用PEiD检测了AIM2000 ver2.0 demo版可执行文件,发现没有壳,所以可以直接进行反汇编。

反汇编简单来说就是将编译好的程序文件还原成人可以读懂的汇编语言(或高级语言),由此分析程序流程,找出破解方案。常用的反汇编软件是W32Dasm,有一些修改版本,我这里用的是W32Dasm无极版 v3.0,是免费的,经国人汉化、修改过。进入W32Dasm后,打开AIM2000 v2.0 demo版的可执行文件,经反编译后,看到主窗口中显示的内容主要有三列,比如
:00462138 D8CC                    fmul st(0), st(4)
:0046213A DD1C02                  fstp qword ptr [edx+eax]
:0046213D 8B9394000000            mov edx, dword ptr [ebx+00000094]
第一列是行地址,第二列是机器码,第三列是机器码翻译成的汇编语句。另外W32Dasm还会对汇编代码进行注释便于分析,比如
* Referenced by a CALL at Address:
|:0045D238
表明这个注释后面的一部分内容是个子程序,是被0045D238语句所调用的。再比如
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045D68A(C)
就是指下面的代码是被0045D68A语句根据一定条件决定是否跳转到这里的。

破解前需要先弄明白没破解之前程序在哪里有限制,然后找到与这些限制相关的汇编语句,再分析程序流程进行修改。对于AIM2000 ver2.0 demo版来说,先找个不太小的波函数文件读入程序,程序就会提示"This is a demo version of AIM2000..."。于是将这句话在W32Dasm里面用Ctrl+F搜索,就找到了与出现这段话相关的代码区域,从0045D6D5开始。

然后顺藤摸瓜,查0045D6D5之前的代码,一点点分析,特别注意条件跳转语句,这一般是问题关键所在。往上查了没多少行,目标就被找到了:
:0045D6A9 83F808                  cmp eax, 00000008
:0045D6AC 7F11                    jg 0045D6BF
:0045D6AE 837C24140E              cmp dword ptr [esp+14], 0000000E
:0045D6B3 7F0A                    jg 0045D6BF
:0045D6B5 817C241880000000        cmp dword ptr [esp+18], 00000080
:0045D6BD 7E41                    jle 0045D700
0045D6A9是比较eax寄存器的数值与8谁大谁小,立刻就想到这个8就是指最多8个原子这个限制条件,下面0045D6AC对应的jg 0045D6BF就表明当原子数目大于8,就会跳转到0045D6BF,最终将导致出现"This is a demo version of AIM2000..."的错误提示。再下面的0045D6AE是与E来比较,E对应的十进制就是14,分明就是指轨道上限数目,也是一旦超过就跳到0045D6BF上去。再往下就是与80比较,转成十进制就是128,如果波函数只包含小于等于128个GTF,就会跳到0045D700,也就是将绕过下面的导致出现错误提示的那些语句。

接下来将这些语句进行篡改就可以绕过限制了。这需要一个十六进制编辑器,建议使用UltraEdit。用UltraEdit打开AIM2000 ver2.0 demo版可执行文件后,先跳转到上面这些语句对应的位置上。比如对于0045D6AC来说,在W32Dasm里双击这个语句,在下面的提示中将看到Line:145403 Pg 1711 of 3948 Code Data @:0045D6AC @Offset 0005D6ACh in...,其中0005D6ACh是偏移地址,在UltraEdit中按Ctrl+G弹出来的输入框中输入0x0005D6ACh(也可以只输入0x5D6AC),光标就会跳转到对应的位置,内容如果与W32Dasm显示的机器码一致,即7F11就对了。

为了让0045D6AC这句代码失效,即无论是否大于8个原子都不报错,就需要把7F11改成9090。机器码90代表nop命令,也就是什么都不干,9090就是做两次nop,将7F11的位置给覆盖掉。同理,将后面的7F0A也改成9090。然后将后面的7E41改为EB41,这里EB代表jmp命令,用它将jle代替就说明无论波函数文件是否超过128个GTF,一律跳到0045D700去。最后保存文件。如果不放心,可以再用W32Dasm把改过的文件读入,从翻译成的汇编语句上看看是否改对了。

现在启动改过的AIM2000 ver2.0 demo版可执行文件,读入一个大波函数文件,发现波函数限制的提示没了,一切功能都正常,程序已经变成了正式版了!起码对于简单的软件,破解其实并不难,有入门的汇编水平即可。


补充:
虽然UltraEdit编辑功能灵活强大,但实际上直接用W32Dasm也可以对语句进行修改,往往还更方便。对于此例,双击0045D6AC那行使之被选定,然后选“编辑-补丁”(或直接按Ctrl+P),将补丁字节中的机器码按照前述进行修改,之后点“应用”。若被修改的文件叫AIM2000v2.0 demo.exe,此时就会在相同目录下生成AIM2000v2.0 demo_.exe,这就是篡改后的可执行文件。可以点“测试运行”来运行此文件检验破解效果。
假设要篡改的地方分散在各处,相应机器码在文件补丁窗口中无法被同时显示在一起,那么可以在各处依次篡改,每次都点“应用”,这样最后一次生成的篡改后的可执行文件将包括之前在各处篡改的效果。