CPUCOOL 5.1000註冊碼分析 (6千字)

看雪資料發表於2001-01-19

文章名稱:CPUCOOL 5.1000註冊碼分析
作者:夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的:幫助和我一樣的初學者們。
軟體名稱:CPUCOOL
軟體簡介:一個CPU降溫軟體,也可以定時最佳化記憶體。具體的效果怎麼樣,我也不太清楚。(呵呵...沒用溫度計
     量過...)。
保護分析:這個軟體在你輸入註冊碼的時候會進行一次判斷。如果你就只找到這一處判斷的話,還不能註冊成功。
     另一個檢測點說實在的,我也找了好久,主要原因有興趣的朋友用W32dasm分析一下就知道了----
     雖然所有的對話方塊中的字串,都能夠在反彙編後找到,可是,它們的附近一個有用的跳轉都沒有,
     後來,找了好久用了bpm,全域性flag,登錄檔監視,反正能想的招我都想了,才找到了第二個檢測點。
     還是有點運氣的成分在裡面的。它判斷註冊碼的演算法在反彙編後唯一的特點就是一個“%d”,兩處檢測
     點的字串參考(w32dasm內)都有這個“%d”。兩個檢測點找到了以後分析就是很簡單的事了,不過
     這個軟體的演算法,需要一點浮點指令的知識。我以前沒看過浮點指令的介紹,哪位大蝦能e_mail給小弟
     一份的話,小弟感激不盡!不過,這裡的兩個浮點指令都比較簡單,我看著它們的形式也就猜出意思了
     所以,如果你現在也不懂浮點指令的話,沒關係的,猜吧!好了,廢話少說,下面我們切入正題:
                            教程正文
    輸入註冊碼,用trw2000的萬能中斷hmemcpy+pmodule一會兒還找不出關鍵的跳轉,我是用bpm的方法找
    到了下面的這一處:
* Possible StringData Ref from Data Obj ->"%d"
                                  |
:00414039 687C854600              push 0046857C
:0041403E 50                      push eax
:0041403F E80C2C0200              call 00436C50
:00414044 8B4C2414                mov ecx, dword ptr [esp+14]
:00414048 BF83000000              mov edi, 00000083
:0041404D 8BC1                    mov eax, ecx  <------eax中儲存了你輸入的註冊碼(16進位制)
:0041404F 83C40C                  add esp, 0000000C
:00414052 99                      cdq
:00414053 F7FF                    idiv edi
:00414055 85D2                    test edx, edx
:00414057 0F85C2000000            jne 0041411F  <-----註冊碼要是83H的整數倍

:0041405D B83DCB883E              mov eax, 3E88CB3D
:00414062 F7E9                    imul ecx
:00414064 C1FA05                  sar edx, 05
:00414067 8BC2                    mov eax, edx
:00414069 C1E81F                  shr eax, 1F
:0041406C 03D0                    add edx, eax
:0041406E 3BD7                    cmp edx, edi
:00414070 0F8EA9000000            jle 0041411F  <-----這一段是變相對註冊碼的大小進行判斷

:00414076 81F980470100            cmp ecx, 00014780  <------14780H是一個不能使用的號碼!
:0041407C 7467                    je 004140E5

:0041407E 8BC1                    mov eax, ecx
:00414080 B97F000000              mov ecx, 0000007F
:00414085 99                      cdq
:00414086 F7F9                    idiv ecx  <------註冊碼不能是7FH的整數倍
:00414088 85D2                    test edx, edx
:0041408A 7459                    je 004140E5
:0041408C 8D542468                lea edx, dword ptr [esp+68]
:00414090 B9DC8D4700              mov ecx, 00478DDC
:00414095 52                      push edx
     這裡就是我說的第一處判斷了。詳細的分析,我已經寫在旁邊,相信有一點彙編基礎的朋友就能夠很輕
     松的看懂了。不過在那個變相判斷註冊碼大小的地方,我還編了一個小程式算出來註冊碼必須大於
     252*131=33012。有興趣的朋友可以驗證一下。
     經過了這個“卡子”我們可以得出註冊碼必須要是131大於251的整數倍,而且,還不能被7FH整除,當
     然,還得排除一個作者已知的CRACK號碼。下面,我們來到第二個檢測點:
* Possible StringData Ref from Data Obj ->" %d"
                                  |
:00421FA0 6864974600              push 00469764
:00421FA5 50                      push eax
:00421FA6 E8A54C0100              call 00436C50
:00421FAB 8B442424                mov eax, dword ptr [esp+24]
:00421FAF 83C40C                  add esp, 0000000C
:00421FB2 99                      cdq
:00421FB3 F73DA88D4700            idiv dword ptr [00478DA8]      [478DA8]=1A19H=6681
:00421FB9 8BE8                    mov ebp, eax
:00421FBB 99                      cdq
:00421FBC 33C2                    xor eax, edx
:00421FBE 896C2418                mov dword ptr [esp+18], ebp
:00421FC2 2BC2                    sub eax, edx
:00421FC4 83E001                  and eax, 00000001
:00421FC7 33C2                    xor eax, edx
:00421FC9 2BC2                    sub eax, edx
:00421FCB 742D                    je 00421FFA      上面一連串的位運算就是看是否是6681的奇數倍 
:00421FCD DB442418                fild dword ptr [esp+18]  <----我猜應該是運算元被LOAD
:00421FD1 32DB                    xor bl, bl
:00421FD3 D9FA                    fsqrt          <----我猜應該是開方的意思
:00421FD5 E8464B0100              call 00436B20
:00421FDA 8BF0                    mov esi, eax
:00421FDC B903000000              mov ecx, 00000003
:00421FE1 46                      inc esi
:00421FE2 3BF1                    cmp esi, ecx
:00421FE4 7E14                    jle 00421FFA
:00421FE6 8BC5                    mov eax, ebp
:00421FE8 99                      cdq
:00421FE9 F7F9                    idiv ecx
:00421FEB 85D2                    test edx, edx
:00421FED 7409                    je 00421FF8 
:00421FEF 83C102                  add ecx, 00000002
:00421FF2 3BCE                    cmp ecx, esi
:00421FF4 7CF0                    jl 00421FE6
:00421FF6 EB02                    jmp 00421FFA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00421FED(C)
|
:00421FF8 B301                    mov bl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00421FCB(C), :00421FE4(C), :00421FF6(U)
|
:00421FFA 84DB                    test bl, bl
:00421FFC 7512                    jne 00422010
:00421FFE 6A20                    push 00000020
:00422000 8D4C2418                lea ecx, dword ptr [esp+18]
:00422004 E8B0D80200              call 0044F8B9
:00422009 68DC8D4700              push 00478DDC
:0042200E EB1E                    jmp 0042202E
    上面這段程式碼很簡單吧?呵呵...我的註釋也就加的不多了。下面我就把註冊碼應該滿足的條件列出來:
        假設輸入的數字為N。則其必須滿足:(用C語言的運算子表示)
    1.(N%131)=0,(N/131)>251;
    2. (N%6681)=0.
    3. 設N/6681=M.則M必須為奇數。
    4. 設INT(SQRT(M))=K,則:K>2且從3到K+1所有的奇數都不能被M整除。
    這就是我總結出來的CPUCOOL的註冊碼應該滿足的規律,如有疏漏,盡請執教!

相關文章