破解AIM2000 ver2.0 demo版的流程
注:此文已經完全沒意義了,Multiwfn (http://www.shanxitv.org/multiwfn)做AIM分析比AIM2000快得多、功能強大得多、靈活得多、好用得多還完全免費,見
使用Multiwfn做拓撲分析以及計算孤對電子角度 http://www.shanxitv.org/108
使用Multiwfn做電子密度、ELF、靜電勢、密度差等函數的盆分析 http://www.shanxitv.org/179
在破解軟件、匯編方面筆者并不靈通,雖說當年自學匯編初衷之一是為了破解軟件,但一直未操刀破解過軟件,如今也生疏了。飯后看了篇關于軟件破解的帖子,覺得這并不復雜,于是就用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,這就是篡改后的可執行文件。可以點“測試運行”來運行此文件檢驗破解效果。
假設要篡改的地方分散在各處,相應機器碼在文件補丁窗口中無法被同時顯示在一起,那么可以在各處依次篡改,每次都點“應用”,這樣最后一次生成的篡改后的可執行文件將包括之前在各處篡改的效果。