簡單演算法---A Speeder V2.5破解的簡要分析!

看雪資料發表於2015-11-15

破解軟體:A Speeder V2.5版
下載網址:http://www8.pconline.com.cn/download/download.phtml?id=106208
破解難度:易
破解工具:TRW1.22
軟體說明:一個可以顯著提高你的Windows和Windows下面執行的所有應用程式的執行速度,讓你的程式和遊戲跑的更快的程式。

 該程式的演算法比較簡單,但是要跟蹤到演算法部分對我這樣菜鳥來說有點麻煩。因為該軟體在你輸入註冊碼註冊後它不會出現註冊成功與否的對話方塊,而是透過修改程式介面來體現註冊與否,所以會很容易跟進其它的程式段中。而且該程式應該是反反彙編的,因為我試圖用WDasm反彙編,卻出現非法操作。
我第1次破解時用BPX HMEMCPY斷點竟然斷不下來,只好用S搜尋大法找到輸入的註冊碼值在記憶體中的位置,然後用 BPM Address R下斷一步步的跟出來的,好累!後來破解成功後又試了一下,竟然又可以用BPX HMEMCPY下斷了,真是搞不懂!
以下部分是按照BPX HMEMCPY的斷點操作流程和我輸入的假碼1234567進行分析的。

任意埴入註冊碼,我的為12345678,下BPX HMEMCPY,點OK,程式被攔斷,BC *,PMODULE,然後按11下F12,再按F10,來到如下程式碼:
0167:00402DE7  CALL     0046DDB0
0167:00402DEC  DEC      DWORD [EBP-18]      <---程式中斷於此
0167:00402DEF  LEA      EAX,[EBP-10]
0167:00402DF2  MOV      EDX,02
0167:00402DF7  CALL     0049D754
0167:00402DFC  DEC      DWORD [EBP-18]
0167:00402DFF  LEA      EAX,[EBP-0C]
0167:00402E02  MOV      EDX,02
0167:00402E07  CALL     0049D754
0167:00402E0C  DEC      DWORD [EBP-18]
0167:00402E0F  LEA      EAX,[EBP-08]
0167:00402E12  MOV      EDX,02
0167:00402E17  CALL     0049D754
0167:00402E1C  MOV      WORD [EBP-24],08
0167:00402E22  PUSH     BYTE +10
0167:00402E24  CMP      DWORD [EBP-04],BYTE +00
0167:00402E28  JZ       00402E2F
0167:00402E2A  MOV      ECX,[EBP-04]      <---取我們輸入的註冊碼到ECX中
0167:00402E2D  JMP      SHORT 00402E34
0167:00402E2F  MOV      ECX,004B24CE
0167:00402E34  PUSH     ECX
0167:00402E35  PUSH     DWORD 004BBE78
0167:00402E3A  CALL     004933F4
0167:00402E3F  ADD      ESP,BYTE +0C
0167:00402E42  MOV      EAX,004BBE78
0167:00402E47  CALL     00401F90          <---關鍵比對的Call,跟進去看看
0167:00402E4C  TEST     AL,AL
0167:00402E4E  JZ       00402E77          <---關鍵判斷
0167:00402E50  XOR      EDX,EDX
0167:00402E52  MOV      EAX,[EBX+0334]
0167:00402E58  CALL     00473654
0167:00402E5D  XOR      EDX,EDX
0167:00402E5F  MOV      EAX,[EBX+0338]
0167:00402E65  CALL     00473654
0167:00402E6A  XOR      EDX,EDX
0167:00402E6C  MOV      [004B2264],EDX
0167:00402E72  CALL     004022B4
0167:00402E77  DEC      DWORD [EBP-18]
0167:00402E7A  LEA      EAX,[EBP-04]
0167:00402E7D  MOV      EDX,02
0167:00402E82  CALL     0049D754
0167:00402E87  MOV      ECX,[EBP-34]
0167:00402E8A  MOV      [FS:00],ECX
0167:00402E91  POP      EBX
0167:00402E92  MOV      ESP,EBP
0167:00402E94  POP      EBP
0167:00402E95  RET    
我們跟進上面的那個關鍵Call,可看到如下程式碼:
0167:00401F90  PUSH     EBX
0167:00401F91  ADD      ESP,BYTE -20
0167:00401F94  XOR      EBX,EBX
0167:00401F96  MOV      EDX,ESP
0167:00401F98  MOVSX    ECX,BYTE [EAX]   <---EAX中為我們輸入的註冊碼
0167:00401F9B  CMP      ECX,BYTE +41     <---是否大於字元“A“
0167:00401F9E  JNL      00401FA7
0167:00401FA0  ADD      ECX,BYTE -30     <---十六進位制值轉換為字元值
0167:00401FA3  MOV      [EDX],ECX        
0167:00401FA5  JMP      SHORT 00401FBE
0167:00401FA7  MOVSX    ECX,BYTE [EAX]
0167:00401FAA  CMP      ECX,BYTE +61     <---是否大於字元“a“  
0167:00401FAD  JNL      00401FB6
0167:00401FAF  ADD      ECX,BYTE -37   <---ECX=ECX-37,處理A-a之間的字元(不包括a)
0167:00401FB2  MOV      [EDX],ECX
0167:00401FB4  JMP      SHORT 00401FBE
0167:00401FB6  MOVSX    ECX,BYTE [EAX]
0167:00401FB9  ADD      ECX,BYTE -3D     <---ECX=ECX-3D,處理大於等於a的字元
0167:00401FBC  MOV      [EDX],ECX
0167:00401FBE  INC      EBX
0167:00401FBF  ADD      EDX,BYTE +04
0167:00401FC2  INC      EAX
0167:00401FC3  CMP      EBX,BYTE +08     <---輸入的註冊碼位數不能小於8位
0167:00401FC6  JL       00401F98
0167:00401FC8  MOV      EBX,[ESP]        <---取註冊碼的第1位,為1    
0167:00401FCB  MOV      EAX,[ESP+08]     <---取註冊碼的第3位,為3      
0167:00401FCF  ADD      EAX,[ESP+0C]     <---[EBP+0C]為註冊碼的第4位,為4
0167:00401FD3  ADD      EBX,[ESP+04]     <---[EBP+04]為註冊碼的第2位,為2
0167:00401FD7  ADD      EBX,[004B2278]   <---[004B2278]中為17,結果為1A        
0167:00401FDD  ADD      EAX,[004B227C]   <---[004B2278]中為43,結果為4A
0167:00401FE3  IMUL     EBX,EAX          <---EBX=EBX*EAX=784
0167:00401FE6  MOV      EDX,[ESP+10]     <---[EBP+04]為註冊碼的第5位,為5
0167:00401FEA  MOV      ECX,3E           <---ECX=3E
0167:00401FEF  ADD      EDX,[004B2280]   <---[004B2280]中為39,結果為3E  
0167:00401FF5  IMUL     EBX,EDX          <---EBX=EBX*EDX=784*3E=1E100
0167:00401FF8  MOV      EAX,EBX
0167:00401FFA  CDQ    
0167:00401FFB  IDIV     ECX              
0167:00401FFD  CMP      EDX,[ESP+14]<--[ESP+14]為註冊碼的第6位,EDX=EAX mod ECX=4
0167:00402001  JZ       00402007         <---要是不跳就完了
0167:00402003  XOR      EAX,EAX          <---EAX=0
0167:00402005  JMP      SHORT 00402049  
0167:00402007  MOV      ECX,3E           <---ECX=3E
0167:0040200C  MOV      EAX,EBX          <---EAX=EBX=1E100
0167:0040200E  CDQ    
0167:0040200F  IDIV     ECX
0167:00402011  MOV      EBX,EAX          <---EBX=EAX/ECX=7C2
0167:00402013  MOV      EAX,EBX        
0167:00402015  MOV      ECX,3E
0167:0040201A  CDQ    
0167:0040201B  IDIV     ECX
0167:0040201D  CMP      EDX,[ESP+18]<--[ESP+18]為註冊碼的第7位,EDX=EAX mod ECX=2
0167:00402021  JZ       00402027         <---要是不跳還得玩完了  
0167:00402023  XOR      EAX,EAX          <---EAX=0
0167:00402025  JMP      SHORT 00402049
0167:00402027  MOV      ECX,3E
0167:0040202C  MOV      EAX,EBX          <---EAX=EBX=7C2
0167:0040202E  CDQ    
0167:0040202F  IDIV     ECX
0167:00402031  MOV      EBX,EAX          <---EBX=EAX/ECX=20
0167:00402033  MOV      EAX,EBX
0167:00402035  MOV      ECX,3E
0167:0040203A  CDQ    
0167:0040203B  IDIV     ECX
0167:0040203D  CMP      EDX,[ESP+1C]<--[ESP+18]為註冊碼第7位,EDX=EAX mod ECX=20
0167:00402041  JZ       00402047         <---最後一處判斷
0167:00402043  XOR      EAX,EAX
0167:00402045  JMP      SHORT 00402049
0167:00402047  MOV      AL,01            <---置AL中的值為1,勝利女神!
0167:00402049  ADD      ESP,BYTE +20
0167:0040204C  POP      EBX
0167:0040204D  RET    
從上面的分析我們可得到我的正確註冊碼的後3位為42W。因為最後一次的EDX中值為20,而又因為61-3D=24>20,可知為大寫字元,所以未轉換前值應為37+20,對應的字元為W,這樣就可得到正確的註冊碼:1234542W.其實從上面的分析可以看出,只要註冊碼的位數不小於8,而且只要前8位滿足上面的演算法即可,第8位以後可任意輸。
該程式註冊成功後將註冊資訊儲存在登錄檔的
“HKEY_CURRENT_USER/Software/aspeeder”中,程式重啟會取出再進行比對。

相關文章