ReadBOOK v1.43 中文閱讀程式--註冊破解全攻略 一 (13千字)

看雪資料發表於2001-04-14

ReadBOOK v1.43 中文閱讀程式--註冊破解全攻略

作者:華仔
版權:China Cracking Group
時間:2001.04.14

由於本地上網包月制被取消,網費居高不下,太慘了,每週我只爭取到
兩小時的上網時間(沒辦法,都是Money惹的禍)。朋友推薦我用ReadBOOK v1.41
這個軟體在平時多讀點書,軟體還不錯,真正的綠色環保,不在除解
壓目錄之外的地方留下任何痕跡(我喜歡),再一看要註冊(註冊事小,
但有違Cracker的精神),毫不猶豫拉下了它的新版本ReadBOOK v1.43,
心想這下可大展身手了,不想執行一看差點把我氣趴下,居然是什麼
XXXXX專用版本,已不用註冊了(如果你只是想使用這個軟體,強烈建議
你按一下鍵盤上的Back Space鍵),主視窗中XXXXX標語太打眼,這怎
麼行,我一定要註冊它,仔細分析這個軟體,發現它呼叫了oem.4rb這
個外掛,刪除它,我們又成為未註冊版本了。

一、試執行:

進入註冊視窗
使用者名稱:華仔[CCG]
註冊碼:1974923
單擊“填寫完畢”按鈕後,提示:“註冊碼錯誤,請重新填寫註冊碼”。

二、註冊分析:

1、註冊碼無法輸入數字之外的任何字元,故猜測註冊碼可能是十進位制數
  (八進位制數和二進位制數也有可能,但這種情況很少見)。

2、確定後馬上彈出註冊錯誤視窗,說明它立即對你輸入的註冊碼進行了
  判斷。設斷時可從此下手。

三、實戰:

用W32dsm89反彙編主程式,找關鍵字串“您已經成功地註冊了”,來到以
下一大串程式碼中(分析時我用TRW2000):

:00409FFC BF98444600      mov      edi,00464498
*//讀取ReadBook.ini檔案中[File]段

:0040A001 68A0484600      push    DWORD 004648A0
*//讀取ReadBook.ini檔案User項

:0040A006 57              push    edi
:0040A007 E8A0D30000      call    004173AC
*//讀取ReadBook.ini檔案User項中的值並送給[ebp+FFFFFF44]
*//取姓名十六進位制ASCII碼,結束以00為標誌,並用20補足128位。
*//BB AA D7 D0 5B 43 43 47 5D 00 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

:0040A00C 83C41C          add      esp, 1C
:0040A00F 389D44FFFFFF    cmp      byte ptr [ebp+FFFFFF44], bl
*//將[ebp+FFFFFF44]和BL作比較

:0040A015 756D            jne      0040A084
*//[ebp+FFFFFF44]不為空則跳到校驗程式碼
..
..
..
..
:0040A084 8D8544FFFFFF    LEA      EAX,[EBP+FFFFFF44]   
:0040A08A 50              PUSH    EAX                   
:0040A08B E8E6A30200      CALL    00434476
*//將大寫字母轉換為小寫,其它型別字元不轉換。
*//BB AA D7 D0 5B 63 63 67 5D 00 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

:0040A090 8B854CFFFFFF    MOV      EAX,[EBP+FFFFFF4C]
*//以姓名第12位開始向前依次取四位並送給EAX
*//2020005D

:0040A096 8B8D48FFFFFF    MOV      ECX,[EBP+FFFFFF48]
*//以姓名第8位開始向前依次取四位並送給ECX
*//6763635B

:0040A09C 8BB544FFFFFF    MOV      ESI,[EBP+FFFFFF44]
*//以姓名第4位開始向前依次取四位並送給ESI
*//D0D7AABB

:0040A0A2 03C8            ADD      ECX,EAX
*//簡單的加法運算:ECX=ECX+EAX=6763635B+2020005D=878363B8

:0040A0A4 038D50FFFFFF    ADD      ECX,[EBP+FFFFFF50]
*//取姓名第16位開始向前依次取四位與ECX相加,再將結果送給ECX
*//ECX=ECX+[EBP+FFFFFF50]=878363B8+20202020=A7A383D8

:0040A0AA 69F631750000    IMUL    ESI,ESI,7531
*//帶符號數乘法運算:ESI=ESI*7531=D0D7AABB*7531=8A4F24CB

:0040A0B0 69C931750000    IMUL    ECX,ECX,7531
*//ECX=ECX*7531=A7A383D8*7531=D18DF458

:0040A0B6 C704240C434600  MOV      DWORD [ESP],0046430C
:0040A0BD 68B5000000      PUSH    DWORD B5
:0040A0C2 53              PUSH    EBX
:0040A0C3 2BF1            SUB      ESI,ECX
*//減法運算:ESI=ESI-ECX=8A4F24CB-D18DF458=B8C13073

:0040A0C5 FF1534224500    CALL    `KERNEL32!FindResourceA`
*//函式說明:在模組中尋找資源

:0040A0CB 50              PUSH    EAX
:0040A0CC 53              PUSH    EBX
:0040A0CD FF153C224500    CALL    `KERNEL32!LoadResource`
*//函式說明:返回資源控制程式碼

:0040A0D3 6894484600      PUSH    DWORD 00464894
*//讀取ReadBook.ini檔案

:0040A0D8 57              PUSH    EDI
:0040A0D9 8945EC          MOV      [EBP-14],EAX
*//將EAX的值送給[EBP-14]

:0040A0DC E8EDD20000      CALL    004173CE
*//讀取ReadBook.ini檔案中Register的值並送給EAX

:0040A0E1 6880484600      PUSH    DWORD 00464880
:0040A0E6 57              PUSH    EDI
:0040A0E7 8945F8          MOV      [EBP-08],EAX
*//將EAX的值送給[EBP-08]

:0040A0EA C745F012320000  MOV      DWORD [EBP-10],3212
:0040A0F1 C745E434120000  MOV      DWORD [EBP-1C],1234
:0040A0F8 C745E888880000  MOV      DWORD [EBP-18],8888
:0040A0FF C745F423230000  MOV      DWORD [EBP-0C],2323
:0040A106 E8C3D20000      CALL    004173CE
:0040A10B 83C410          ADD      ESP,BYTE +10
:0040A10E 85C0            TEST    EAX,EAX
:0040A110 7524            JNZ      0040A136
:0040A112 8D45F4          LEA      EAX,[EBP-0C]
:0040A115 50              PUSH    EAX
:0040A116 8D45E8          LEA      EAX,[EBP-18]
:0040A119 50              PUSH    EAX
:0040A11A 8D45E4          LEA      EAX,[EBP-1C]
:0040A11D 50              PUSH    EAX
:0040A11E 8D45F0          LEA      EAX,[EBP-10]
:0040A121 50              PUSH    EAX
:0040A122 6860474600      PUSH    DWORD 00464760
*//取硬碟磁碟機代號C:

:0040A127 FF15F8214500    CALL    `KERNEL32!GetDiskFreeSpaceA`
*//函式說明:獲取磁碟剩餘空間

:0040A12D 8B45F4          MOV      EAX,[EBP-0C]
:0040A130 0FAF45F0        IMUL    EAX,[EBP-10]
:0040A134 EB19            JMP      SHORT 0040A14F
:0040A136 8D45C4          LEA      EAX,[EBP-3C]
:0040A139 C745C420000000  MOV      DWORD [EBP-3C],20
:0040A140 50              PUSH    EAX
:0040A141 FF15F0214500    CALL    `KERNEL32!GlobalMemoryStatus`
*//函式說明:檢查記憶體狀態

:0040A147 8B45D0          MOV      EAX,[EBP-30]
:0040A14A 05CCEDFFFF      ADD      EAX,FFFFEDCC
:0040A14F F7D0            NOT      EAX
:0040A151 3145F8          XOR      [EBP-08],EAX
:0040A154 33C0            XOR      EAX,EAX
*//EAX=0

:0040A156 A3FC644600      MOV      [004664FC],EAX
*//將EAX的值送給[004664FC]

:0040A15B 3975F8          CMP      [EBP-08],ESI
*//將[EBP-08](假註冊碼的十六進位制)和ESI(真註冊碼)比較

:0040A15E 741D            JZ      0040A17D
*//如果相等則跳到註冊成功視窗
*//暴破時此處改為JMP

:0040A160 8B55EC          MOV      EDX,[EBP-14]
*//將[EBP-14]的值送給EDX

:0040A163 8BC8            MOV      ECX,EAX
*//將EAX的值送給ECX

:0040A165 83E17F          AND      ECX,BYTE +7F
*//邏輯與運算:ECX=ECX AND 7F

:0040A168 03348A          ADD      ESI,[EDX+ECX*4]
*//加法運算:ESI=ESI+[EDX+ECX*4]

:0040A16B 40              INC      EAX
*//EAX=EAX+1

:0040A16C 3DFF0F0000      CMP      EAX,0FFF
*//比較EAX是否等於FFF

:0040A171 A3FC644600      MOV      [004664FC],EAX
*//將EAX送給[004664FC]

:0040A176 72E3            JC      0040A15B
*//EAX不等於FFF則跳

:0040A178 3975F8          CMP      [EBP-08],ESI
*//將[EBP-08](假註冊碼的十六進位制)和ESI(真註冊碼)比較

:0040A17B 7547            JNZ      0040A1C4
*//不相等則跳到註冊不成功視窗

:0040A17D 8B75FC          MOV      ESI,[EBP-04]
:0040A180 C705A4974B000100+MOV      DWORD [004B97A4],01
:0040A18A FF761C          PUSH    DWORD [ESI+1C]
:0040A18D FF1598254500    CALL    `USER32!GetMenu`
*//函式說明:返回指定視窗的選單控制程式碼

:0040A193 50              PUSH    EAX
:0040A194 E881270300      CALL    0043C91A
:0040A199 53              PUSH    EBX
:0040A19A 6850800000      PUSH    DWORD 8050
:0040A19F FF7004          PUSH    DWORD [EAX+04]
:0040A1A2 FF158C254500    CALL    `USER32!RemoveMenu`
*//函式說明:刪除選單項和彈出式選單

:0040A1A8 391DA8974B00    CMP      [004B97A8],EBX
:0040A1AE 744C            JZ      0040A1FC
:0040A1B0 53              PUSH    EBX
:0040A1B1 6878484600      PUSH    DWORD 00464878
**//祝賀

:0040A1B6 6864484600      PUSH    DWORD 00464864
*//您已經成功地註冊了!

:0040A1BB 8BCE            MOV      ECX,ESI
:0040A1BD E819000300      CALL    0043A1DB
:0040A1C2 EB38            JMP      SHORT 0040A1FC

:0040A1C4 53              PUSH    EBX
:0040A1C5 68A0484600      PUSH    DWORD 004648A0
:0040A1CA 57              PUSH    EDI
:0040A1CB 891DA4974B00    MOV      [004B97A4],EBX
:0040A1D1 E88ED10000      CALL    00417364
:0040A1D6 53              PUSH    EBX
:0040A1D7 6894484600      PUSH    DWORD 00464894
:0040A1DC 57              PUSH    EDI
:0040A1DD E882D10000      CALL    00417364
:0040A1E2 8B45FC          MOV      EAX,[EBP-04]
:0040A1E5 83C418          ADD      ESP,BYTE +18
:0040A1E8 53              PUSH    EBX
:0040A1E9 6853800000      PUSH    DWORD 8053
:0040A1EE 6811010000      PUSH    DWORD 0111
:0040A1F3 FF701C          PUSH    DWORD [EAX+1C]
:0040A1F6 FF1528264500    CALL    `USER32!PostMessageA`
*//函式說明:將訊息加入線索訊息佇列

:0040A1FC 891DA8974B00    MOV      [004B97A8],EBX
:0040A202 5F              POP      EDI
:0040A203 5E              POP      ESI
:0040A204 5B              POP      EBX
:0040A205 C9              LEAVE 
:0040A206 C3              RET   

:0040A207 56              PUSH    ESI
:0040A208 6A00            PUSH    BYTE +00
:0040A20A 68C8484600      PUSH    DWORD 004648C8
*//錯了啦!

:0040A20F 8BF1            MOV      ESI,ECX
:0040A211 68A8484600      PUSH    DWORD 004648A8
*//註冊碼錯誤,請重新填寫註冊碼!

:0040A216 E8C0FF0200      CALL    0043A1DB
:0040A21B 6A00            PUSH    BYTE +00
:0040A21D 6850800000      PUSH    DWORD 8050
:0040A222 6811010000      PUSH    DWORD 0111
:0040A227 FF761C          PUSH    DWORD [ESI+1C]
:0040A22A FF1528264500    CALL    `USER32!PostMessageA`
*//函式說明:將訊息加入線索訊息佇列

:0040A230 5E              POP      ESI
:0040A231 C3              RET   

四、結論:

1、取姓名十六進位制ASCII碼,結束以00為標誌,並用20補足128位。如姓名中
  有大寫字母,先轉換為小寫字母再取。例如:

    | 第1位 ==>BB
華-|
    | 第2位 ==>AA

    | 第3位 ==>D7
仔-|
    | 第4位 ==>D0

    第5位 [ ==> 5B
    第6位 C ==> 43 ==> 63
    第7位 C ==> 43 ==> 63
    第8位 G ==> 47 ==> 67
    第9位 ] ==> 5D
    第10位 結束標緻00
    第11位 填充20
    ......
    ......
    第128位 填充20

2、從第四位開始向前取四位,記為SN1,如:
  SN1=D0D7AABB

3、從第十六位開始每四位為一組,順序向前取三組,並求出這三組數之和,
  記為SN2,如:
  SN2=20202020+2020005D+6763635B=A7A383D8

3、將SN1減去SN2的差再乘以7531,記為SN,如:
  SN=(SN1-SN2)*7531=(D0D7AABB+A7A383D8)*7531=B8C13073

4、取SN的十進位制數,就是真正的註冊碼之一。
  B8C13073 ==> 3099668595

  所以完整的註冊碼:
  姓  名:華仔[CCG]
  註冊碼:3099668595

5、分析0040A160至0040A176程式碼段發現,註冊碼不只一個,還有FFF個。

  ①演算法:
  將0-FFF順序取數並與7F邏輯與運算,將運算結果乘以4再加上EDX=4D5990,
  得出密碼錶(我已提取出來供大家參考)偏移量,然後依次取4位(低位在
  前、高位在後)最後再加上當前的SN值就得到了一個新的註冊碼。

  ②密碼錶如下:
          0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
004D5990: 4D 44 07 48 36 6C 81 0B 4B 7C 5A 27 97 31 96 25  MD.H6l?K|Z'??
004D59A0: A6 32 C0 2C 40 05 44 67 E2 7E 7D 3E FD 6D 75 4F  ??@.Dg~}>.muO
004D59B0: 50 6A 6B 6E CA 6C 8A 77 E2 13 86 5E 43 5F FA 3B  Pjknlw?^C_?
004D59C0: 3D 46 AE 4E 5C 66 3C 58 10 34 A9 37 52 25 E8 79  =FN\f<X.4?R%y
004D59D0: A4 4E 68 17 E2 6C 19 0F B5 6A 8B 52 B8 26 15 54  Nh.l..jR?.T
004D59E0: 81 27 27 4F 2A 15 30 64 1E 4C C6 2C 26 3B ED 51  ?'O*.0d.L?&;Q
004D59F0: 10 0F AF 3D 69 00 67 0A 1B 7C 68 25 F2 65 EF 07  ..?i.g..|h%e?
004D5A00: 56 6C 7A 40 B7 5E F7 17 81 44 74 39 96 20 2F 38  Vlz@^?Dt9?/8
004D5A10: 98 6D 32 6F 8E 01 ED 4E A8 3B 5F 10 2F 35 D2 42  m2o?N?_./5B
004D5A20: E2 36 39 10 4F 7E AB 35 EE 7A 94 58 FF 28 95 66  ?9.O~?zX.(f
004D5A30: 82 20 22 5D BE 60 65 7F 32 65 F1 73 EC 36 46 51  ?"]`e.2es?FQ
004D5A40: 8A 05 35 17 81 6D A4 44 5A 7D 48 74 FE 59 49 00  ?5.mDZ}Ht.YI.
004D5A50: 51 22 EF 6B A4 74 C6 0B CD 4C DF 67 E4 67 15 71  Q"kt?Lgg.q
004D5A60: F2 02 80 29 18 34 7C 21 FA 59 F0 75 70 3B B4 21  ?).4|!Yup;?
004D5A70: CB 01 4B 43 2F 4A 4B 41 CF 2E 2A 4B 17 6F 47 61  ?KC/JKA?*K.oGa
004D5A80: 00 56 69 26 21 38 0C 0E 42 6F 2E 56 72 27 80 70  .Vi&!8..Bo.Vr'p
004D5A90: F6 31 26 5E 8B 74 6C 5A CC 7F 12 54 C0 6D 26 72  ?&^tlZ?.Tm&r
004D5AA0: D8 71 83 08 EB 0D 6D 41 E9 3B E1 2C 61 1A 94 2B  q??mA??a.?
004D5AB0: 16 5A B2 1A 25 5D E3 0E 99 3C 19 20 5C 4F 3A 15  .Z?%]??. \O:.
004D5AC0: E1 65 9D 75 01 48 F7 77 E2 2E 2C 41 DA 02 1A 3B  eu.Hw?,A?.;
004D5AD0: B0 25 60 4A AB 13 A7 23 4C 3A 01 44 A9 19 4C 6D  ?`J??L:.D?Lm
004D5AE0: BD 2D CA 4E 31 47 44 03 63 77 70 19 BA 11 7B 40  ?N1GD.cwp.?{@
004D5AF0: 89 14 E0 41 09 1E F3 7A 39 76 C8 5B A4 3C 66 5E  ?A..z9v[?f^
004D5B00: 54 01 5A 40 88 0A 2D 5A E2 54 4D 0B 1E 0A 60 26  T.Z@?-ZTM...`&
004D5B10: A6 4A 24 69 6C 48 3F 24 F5 65 B2 1A 88 62 D0 1D  J$ilH?$e?b?
004D5B20: C9 24 DE 51 53 7F CA 28 12 67 A4 4B 63 11 B2 30  ?QS.?.gKc.?
004D5B30: 4C 60 5C 4B 41 75 44 6C 56 47 3F 5B D5 3F 14 42  L`\KAuDlVG?[?.B
004D5B40: 82 38 27 76 1E 51 75 60 E9 7D 96 7E 27 7F 9A 0C  ?'v.Qu`}~'.?
004D5B50: 01 32 FA 26 36 6D FB 6C 71 70 2F 2F 46 63 FA 52  .2?6mlqp//FcR
004D5B60: 23 09 46 1B B7 39 C7 47 9B 69 85 47 45 2D 81 60  #.F.?GiGE-`
004D5B70: 88 30 AE 7D 37 2F 9E 1D 99 1F 85 6F D8 05 8C 59  ?}7/??o?Y
004D5B80: 92 5F 8C 3A 2B 51 98 0A 9F 4A 11 59 DB 47 10 5C  _?+Q?J.YG.\
 
  ③例如:

  姓  名:華仔[CCG]
  註冊碼:3099668595 ==> B8C13073

  註冊碼1 ==> [4D5990+0*4]=4D5990 ==> 4807444D+B8C13073=C874C0 ==> 13137088
  註冊碼2 ==> [4D5990+1*4]=4D5994 ==> 0B816C36+C874C0=C49E0F6 ==> 206168310
  註冊碼3 ==> [4D5990+2*4]=4D5998 ==> 275A7C4B+C49E0F6=33A45D41 ==> 866409793
  註冊碼4 ==> [4D5990+3*4]=4D599C ==> 25963197+33A45D41=593A8ED8 ==> 1497009880
  ....
  ....
  註冊碼FFF ==> [4D5990+7E*4]=4D5B88 ==> 59114A9F+C53475F9=1E45C098 ==> 507887768

相關文章