文章名稱: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的註冊碼應該滿足的規律,如有疏漏,盡請執教!