Personal Antispy 1.14 註冊演算法分析
標 題: Personal Antispy 1.14 註冊演算法分析
發信人:炎之川
時 間:2003/04/30 08:38pm
詳細資訊:
Personal Antispy 1.14 註冊演算法分析
破解目標:Personal
Antispy 1.14
官方主頁:http://www.antispy.biz/
軟體簡介:檢查你的系統裡面有沒有被人植下可以記錄鍵盤操作的特洛伊木馬程式
下載地址:http://www.antispy.biz/downloads/inst_antispy.exe
使用工具:PEiD 0.8、Ollydbg、Windows 自帶的計算器、32bit Calculator 1.6 by cybult、UltraEdit
作者:炎之川[BCG]
時間:2003.4.30
主頁:http://skipli.yeah.net/
========================================================================
宣告:
本文純屬技術交流,無其他任何目的,轉載請註明作者並保持文章的完整。
========================================================================
先說明,Personal Antispy 1.14 和我前段時間寫的 AntiSpy PRO 1.02 那篇演算法分析文章中提到的軟體不是同一個軟體,功能也完全不一樣,所以我可不是寫重複了^^
經 PEiD 0.8 檢查可知,Personal Antispy 1.14 的主程式為 VC++ 6.0 編寫且無殼。
直接用 OD 裝入程式。載入完成後,在 CPU 視窗中右擊,選擇“搜尋”->“字串參考”,然後在出現的視窗中搜尋註冊錯誤的提示“Registration code or user name is invalid. Please check all fields and try again!”,找到後雙擊進入對應的程式碼段,F2下斷點。
然後執行程式,在輸入註冊資訊的視窗中輸入註冊名和假註冊碼(註冊碼有四個框)
Name:
lovefire[BCG]
Serial:: ABCD-EFGH-IJKL-MNOP
(; 後是 Ollydbg 所分析的內容,// 後是我加的註釋,文中數值均為十六進位制值)
004040B0
/$ 81EC CC000000 SUB ESP,0CC //斷點
004040B6 |. 8D4424
64 LEA EAX,DWORD PTR SS:[ESP+64]
004040BA |. 56
PUSH ESI
004040BB |. 8BB424 D400000>MOV
ESI,DWORD PTR SS:[ESP+D4]
004040C2 |. 57
PUSH EDI
004040C3 |. 8B3D A4764400 MOV EDI,DWORD
PTR DS:[<&USER32.GetDlgIte>; USER32.GetDlgItemTextA
004040C9
|. 6A 32 PUSH 32
; /Count = 32 (50.)
004040CB |. 50
PUSH EAX
; |Buffer
004040CC
|. 6A 6A PUSH 6A
; |ControlID = 6A (106.)
004040CE |. 56
PUSH ESI
; |hWnd
004040CF
|. FFD7 CALL EDI
; \GetDlgItemTextA
004040D1 |. 8A4424 6C MOV
AL,BYTE PTR SS:[ESP+6C] //取註冊名的第一個字元放入 al
004040D5 |. 84C0
TEST AL,AL //al 是否為0,即是否輸入了註冊名?
004040D7
|. 75 1E JNZ SHORT antispy.004040F7
//沒有就彈出下面的 MessageBox
004040D9 |. 6A 40 PUSH
40
; /style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004040DB
|. 68 D4824500 PUSH antispy.004582D4
; |Title = "Attention!"
004040E0
|. 68 BC824500 PUSH antispy.004582BC
; |Text = "Please enter your
name!"
004040E5 |. 56
PUSH ESI
; |hOwner
004040E6 |. FF15
A8764400 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004040EC
|. 5F POP EDI
004040ED |.
33C0 XOR EAX,EAX
004040EF |. 5E
POP ESI
004040F0 |. 81C4 CC000000
ADD ESP,0CC
004040F6 |. C3
RETN
004040F7 |> 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
004040FB
|. 6A 0A PUSH 0A
004040FD |.
51 PUSH ECX
004040FE |. 6A
6B PUSH 6B
00404100 |. 56
PUSH ESI
00404101 |. FFD7
CALL EDI //取第一個框的註冊碼
00404103 |. 8D5424 2C
LEA EDX,DWORD PTR SS:[ESP+2C]
00404107 |. 6A 0A
PUSH 0A
00404109 |. 52
PUSH EDX
0040410A |. 6A 6C
PUSH 6C
0040410C |. 56
PUSH ESI
0040410D |. FFD7 CALL EDI
//取第二個框的註冊碼
0040410F |. 8D4424 20 LEA EAX,DWORD
PTR SS:[ESP+20]
00404113 |. 6A 0A PUSH
0A
00404115 |. 50 PUSH EAX
00404116
|. 6A 6D PUSH 6D
00404118 |.
56 PUSH ESI
00404119 |. FFD7
CALL EDI //取第三個框的註冊碼
0040411B |.
8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8]
0040411F |.
6A 0A PUSH 0A
00404121 |. 51
PUSH ECX
00404122 |. 6A 6E
PUSH 6E
00404124 |. 56
PUSH ESI
00404125 |. FFD7
CALL EDI //取第四個框的註冊碼
00404127 |. 8D5424 14
LEA EDX,DWORD PTR SS:[ESP+14]
0040412B |. 8D4424 38
LEA EAX,DWORD PTR SS:[ESP+38]
0040412F |. 52
PUSH EDX
; /String2
00404130
|. 50 PUSH EAX
; |String1
00404131 |. FF15 54734400 CALL DWORD PTR
DS:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00404137 |. 8B3D
48734400 MOV EDI,DWORD PTR DS:[<&KERNEL32.lstrcat>; kernel32.lstrcatA
0040413D
|. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
00404141
|. 8D5424 38 LEA EDX,DWORD PTR SS:[ESP+38]
00404145
|. 51 PUSH ECX
; /StringToAdd
00404146 |. 52
PUSH EDX
; |ConcatString
00404147
|. FFD7 CALL EDI
; \lstrcatA
00404149 |. 8D4424 20 LEA
EAX,DWORD PTR SS:[ESP+20]
0040414D |. 8D4C24 38 LEA
ECX,DWORD PTR SS:[ESP+38]
00404151 |. 50
PUSH EAX
; /StringToAdd
00404152
|. 51 PUSH ECX
; |ConcatString
00404153 |. FFD7
CALL EDI
; \lstrcatA
00404155 |.
8D5424 08 LEA EDX,DWORD PTR SS:[ESP+8]
00404159 |.
8D4424 38 LEA EAX,DWORD PTR SS:[ESP+38]
0040415D |.
52 PUSH EDX
; /StringToAdd
0040415E |. 50
PUSH EAX
; |ConcatString
0040415F
|. FFD7 CALL EDI
; \lstrcatA
//以上分別取每個框中的註冊碼,並將其合併,我輸入的註冊碼“ABCD-EFGH-IJKL-MNOP”被合併為“ABCDEFGHIJKLMNOP”
00404161
|. 8D8C24 A000000>LEA ECX,DWORD PTR SS:[ESP+A0]
00404168 |.
8D5424 6C LEA EDX,DWORD PTR SS:[ESP+6C] //取註冊名到edx
0040416C
|. 51 PUSH ECX
0040416D |.
68 60804400 PUSH antispy.00448060
00404172 |. 52
PUSH EDX
00404173 |. E8 18FEFFFF
CALL antispy.00403F90 //演算法call!我們當然跟進去~
00404178 |. 83C4
0C ADD ESP,0C
0040417B |. 8D4424 38
LEA EAX,DWORD PTR SS:[ESP+38] //取假碼
0040417F |. 8D8C24
A000000>LEA ECX,DWORD PTR SS:[ESP+A0] //取真碼
00404186 |. 50
PUSH EAX
; /String2 //假碼入棧
00404187 |. 51
PUSH ECX
; |String1
//真碼入棧
00404188 |. FF15 A4734400 CALL DWORD PTR DS:[<&KERNEL32.lstrcmpiA>>;
\lstrcmpiA //比較真假註冊碼
0040418E |. 85C0
TEST EAX,EAX //eax=1則註冊失敗
00404190 |. 6A 40
PUSH 40
; /style
= MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00404192 |. 75 31
JNZ SHORT antispy.004041C5
; |
00404194 |. 68 AC824500 PUSH antispy.004582AC
; |Title
= "Registration"
00404199 |. 68 68824500 PUSH
antispy.00458268
; |Text = "Registration succeeded. Thank you for choosing Personal
Antispy!"
0040419E |. 56
PUSH ESI
; |hOwner
0040419F |. FF15
A8764400 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004041A5
|. 8D5424 38 LEA EDX,DWORD PTR SS:[ESP+38]
004041A9
|. 8D4424 6C LEA EAX,DWORD PTR SS:[ESP+6C]
004041AD
|. 52 PUSH EDX
004041AE |.
50 PUSH EAX
004041AF |. E8
BCFEFFFF CALL antispy.00404070
004041B4 |. 83C4 08
ADD ESP,8
004041B7 |. B8 01000000 MOV
EAX,1
004041BC |. 5F POP EDI
004041BD
|. 5E POP ESI
004041BE |.
81C4 CC000000 ADD ESP,0CC
004041C4 |. C3
RETN
004041C5 |> 68 54824500 PUSH antispy.00458254
; |Title
= "Registration error"
004041CA |. 68 00824500 PUSH
antispy.00458200
; |Text = "Registration code or user name is invalid. Please check
all fields and try again!"
004041CF |. 56
PUSH ESI
; |hOwner
004041D0
|. FF15 A8764400 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>;
\MessageBoxA
004041D6 |. 68 2C010000 PUSH 12C
; /Timeout = 300. ms
004041DB |. FF15 4C734400 CALL
DWORD PTR DS:[<&KERNEL32.Sleep>] ; \Sleep
004041E1
|. 5F POP EDI
004041E2 |.
33C0 XOR EAX,EAX
004041E4 |. 5E
POP ESI
004041E5 |. 81C4 CC000000
ADD ESP,0CC
004041EB \. C3
RETN
------------------------------------------------------------------------
進入
00403F90 的演算法call
00403F90
/$ 53 PUSH EBX
00403F91 |.
8B5C24 0C MOV EBX,DWORD PTR SS:[ESP+C]
00403F95 |.
55 PUSH EBP
00403F96 |. 56
PUSH ESI
00403F97 |. 57
PUSH EDI
00403F98 |. 8B3D 50734400
MOV EDI,DWORD PTR DS:[<&KERNEL32.lstrlen>; kernel32.lstrlenA
00403F9E
|. 53 PUSH EBX
; /String
00403F9F |. FFD7
CALL EDI
; \lstrlenA
00403FA1 |.
8BF0 MOV ESI,EAX
00403FA3 |. 8B4424
14 MOV EAX,DWORD PTR SS:[ESP+14] //取註冊名到eax
00403FA7
|. 50 PUSH EAX
; /String
00403FA8 |. 897424 1C MOV DWORD
PTR SS:[ESP+1C],ESI ; |
00403FAC
|. FFD7 CALL EDI
; \lstrlenA
00403FAE |. 8BE8
MOV EBP,EAX //使用者名稱長度
00403FB0 |. 85ED
TEST EBP,EBP //長度是否為0?
00403FB2 |. 75 0C
JNZ SHORT antispy.00403FC0 //不為0就對了
00403FB4 |.
8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
00403FB8 |.
5F POP EDI
00403FB9 |. 5E
POP ESI
00403FBA |. 5D
POP EBP
00403FBB |. C600 00
MOV BYTE PTR DS:[EAX],0
00403FBE |. 5B
POP EBX
00403FBF |. C3
RETN
00403FC0 |> 8B7C24 1C MOV EDI,DWORD
PTR SS:[ESP+1C] //不為0就跳到此處,開始具體演算法
00403FC4 |. 53
PUSH EBX
; /String2
//
00403FC5 |. 57 PUSH
EDI
; |String1
00403FC6 |. FF15 54734400
CALL DWORD PTR DS:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
//過了這個call以後,用OD在“轉存”中檢視edi中的值,可以看到下面的程式碼,注意!
0012F034
5F 74 20 3C 40 36 3D 6B _t <@6=k
0012F03C 6C 2F 31 37
67 D8 2C 3E l/17g?>1
//我沒弄清楚這個字串是如何得來的,因為我只有XP,也沒有辦法到其他系統去驗證這個字串是不是唯一的
//這個字串關係到軟體的演算法
00403FCC
|. 3BEE CMP EBP,ESI //esi為輸入的註冊名長度,ebp為0D,即16
00403FCE
|. 8BC5 MOV EAX,EBP
00403FD0 |.
7F 02 JG SHORT antispy.00403FD4
00403FD2
|. 8BC6 MOV EAX,ESI
00403FD4 |>
33C9 XOR ECX,ECX
00403FD6 |. 894424
1C MOV DWORD PTR SS:[ESP+1C],EAX
00403FDA |. 85C0
TEST EAX,EAX
00403FDC |. 7E 39
JLE SHORT antispy.00404017
00403FDE |. EB
04 JMP SHORT antispy.00403FE4
00403FE0
|> 8B7424 18 /MOV ESI,DWORD PTR SS:[ESP+18]
00403FE4
|> 8BC1 MOV EAX,ECX
00403FE6
|. 8B5C24 14 |MOV EBX,DWORD PTR SS:[ESP+14] //註冊名放入ebx
00403FEA
|. 99 |CDQ
00403FEB |.
F7FE |IDIV ESI
00403FED |. 8BC1
|MOV EAX,ECX
00403FEF |. 8BF2
|MOV ESI,EDX
00403FF1 |. 99
|CDQ
00403FF2 |. F7FD
|IDIV EBP
00403FF4 |. 33C0
|XOR EAX,EAX //edx清零
00403FF6 |. 8A041A
|MOV AL,BYTE PTR DS:[EDX+EBX] //edx是計數器,這裡逐位從ebx中取註冊名到al
00403FF9 |.
33D2 |XOR EDX,EDX //edx清零
00403FFB
|. 8A143E |MOV DL,BYTE PTR DS:[ESI+EDI]
//從預設字串中(記得edi指向地址的內容嗎)取對應的字元
00403FFE |. BB 19000000 |MOV
EBX,19 //ebx=19
00404003 |. 33C2
|XOR EAX,EDX //eax^edx,eax->使用者名稱ASCII,edx->對應位的預設字串ASCII,兩者異或
00404005
|. 99 |CDQ //edx 清零
00404006
|. F7FB |IDIV EBX //eax/=ebx,edx=eax%ebx,ebx=19
00404008
|. 8B4424 1C |MOV EAX,DWORD PTR SS:[ESP+1C] //註冊名長度送回eax
0040400C
|. 80C2 41 |ADD DL,41 //dl+=41,dl=eax%ebx
0040400F
|. 41 |INC ECX //計數器+1
00404010
|. 3BC8 |CMP ECX,EAX //比較是否已取完
00404012
|. 88143E |MOV BYTE PTR DS:[ESI+EDI],DL
//dl的值放回EDI指向的地址中,覆蓋掉原始的值(原始值是對應位的預設字串),算完16位的註冊碼之後,這個地址就不再是原預設字串,而是註冊碼了
00404015
|.^7C C9 \JL SHORT antispy.00403FE0
//沒有取完跳回去繼續
//注意,因為註冊碼有16位,而每位註冊碼是由註冊名單獨決定的,所以有效註冊名也是16位
//如果不足16位,則從頭取,直到補足16位,比如輸入
12345abcde,則實際使用的註冊名是 12345abcde12345a
00404017
|> 8BC7 MOV EAX,EDI
00404019 |.
5F POP EDI
0040401A |. 5E
POP ESI
0040401B |. 5D
POP EBP
0040401C |. 5B
POP EBX
0040401D \. C3
RETN
演算法總結:
1、註冊名最長有效位數為16位,超過16位也只取前16位,不足16位的從頭取直到補足
2、預設的字串“_t
<@6=kl/17g?>1”
3、對應註冊名的註冊碼演算法為:((註冊名ASCII^對應字串字元的ASCII)%19)+41,這裡保證了註冊碼肯定在大寫英文字母範圍內
4、最後得到的註冊碼,每隔四位用“-”相連
試舉例如下:
我輸入的第一位註冊名為“l”,對應字串字元“_”
則:(6C^5F)%19+41=42,即“B”
至此
Personal Antispy 1.14 註冊演算法分析完成,一組可用的註冊碼:
Name: lovefire[BCG]
Serial:
BCLO-NUEO-FJOM-IFRW
註冊資訊儲存:
[HKEY_USERS\S-1-5-21-1454471165-789336058-1343024091-1003\Software\Blazing
Tools\Personal Antispy]
"RegName"="lovefire[BCG]"
"RegCode"="BCLONUEOFJOMIFRW"
(注意
S-1-5-21-1454471165-789336058-1343024091-1003 這個主鍵在不同機器上可能不同)
------------------------------------------------------------------------
炎之川
屬於中國破解組織BCG
(BeGiNnEr'S CrAcKiNg Group)
_/_/_/ _/_/_/ _/_/_/
_/
_/ _/ _/
_/_/_/ _/
_/ _/_/
_/ _/ _/
_/ _/
_/_/_/ _/_/_/
_/_/_/
相關文章
- AntiSpy PRO 1.02
註冊演算法分析 + 序號產生器原始碼(tc2) (12千字)2003-04-11演算法原始碼
- supercleaner註冊演算法分析2015-11-15演算法
- SpeedFlash註冊演算法分析(VB)2015-11-15演算法
- 財智老闆通3.04註冊版---註冊演算法分析2003-03-16演算法
- Instant Source 註冊演算法分析+註冊器原始碼2015-11-15演算法原始碼
- Screen Demo Maker 3.0 註冊演算法分析2003-07-15演算法
- <<Anti-Hack>> 2.0註冊演算法分析2003-06-06演算法
- 冰盾濾鏡註冊演算法分析2015-11-15演算法
- DLL Show V4.4 註冊演算法分析2015-11-15演算法
- Disk
Chief 1.2 簡單註冊演算法分析2015-11-15演算法
- E族百變桌面6.0註冊演算法分析2015-11-15演算法
- FolderView 1.7
註冊演算法分析 (14千字)2015-11-15View演算法
- ffmpeg分析系列之一(註冊該註冊的)2010-11-04
- LanSee 註冊演算法2015-11-15演算法
- 新狐傳真群發2.0註冊演算法分析2003-06-29演算法
- 網路精確時鐘 2.25註冊演算法分析2003-07-30演算法
- 重新貼過註冊演算法分析 (16千字)2001-10-23演算法
- 長沙vod點歌系統(註冊演算法分析)2015-11-15演算法
- Netscan pro 3.3 註冊演算法分析全過程2015-11-15演算法
- 公務員之路3.0註冊分析2015-11-15
- 東晨庫管網路版 6.5註冊演算法分析2003-08-14演算法
- EffeTech HTTP Sniffer 3.2註冊演算法分析 (5千字)2002-06-24HTTP演算法
- Green Tea 2.60註冊碼演算法分析 (3千字)2000-07-17演算法
- VB控制元件21Hex DockIt註冊演算法分析2015-11-15控制元件演算法
- [原創]Focus
Magic V3.01 註冊演算法分析2015-11-15演算法
- 海嘯錄音機Ver2.1註冊演算法分析2015-11-15演算法
- 財智家庭理財V3.30註冊演算法分析2003-08-19演算法
- SuperCleaner 2.31註冊碼演算法分析 - OCG (13千字)2002-04-02演算法
- Registry Crawler 4.0註冊碼演算法分析 - OCG
(20千字)2002-04-07演算法
- UltraEdit-32
10註冊碼演算法分析 (19千字)2003-05-17演算法
- AZR註冊流程分析及疑問(BlowFish演算法) (699字)2001-11-03演算法
- 完美解除安裝6.0註冊演算法分析 (2千字)2002-02-27演算法
- Directory Scanner v1.5 註冊演算法分析 (6千字)2015-11-15演算法
- 海月圖片獵手(SeaMoon Pic Hunter) 1.52 註冊演算法分析2015-11-15演算法
- MouseStar V3.01註冊演算法分析 (18千字)2015-11-15演算法
- **********.exe註冊碼演算法分析--高手莫笑 (31千字)2015-11-15演算法
- Theme Builder註冊碼分析2015-11-15UI
- ShadowDefender 註冊碼 分析2024-08-17