Tray Helper V 3.6演算法分析 (26千字)
Software:Tray Helper V 3.6
http://www.trayhelper.com
功能眾多的小軟體
Tools:TRW 2000、Ida v4.5
Cracker:lq7972[bruceyu13@sina.com]
Notes:學習。過完了假,又是工作~
這個軟體的註冊有點意思,輸入了使用者名稱和假碼後,那個“OK”按鈕還是灰色的;我們可以猜測軟體是在使用者輸入名稱的同時計算註冊碼,那麼就下斷點“bpx GetWindowText”(這裡有一個小技巧,就是先把使用者名稱放進系統剪貼簿,再Ctrl+V到輸入框,準攔住)
轉到程式領空:
0167:00426133 E87E410600 CALL `MFC42!ord_00000942`
0167:00426138 8D86E4000000 LEA EAX,[ESI+E4] ;使用者名稱
0167:0042613E 50 PUSH EAX
0167:0042613F 68F2030000 PUSH DWORD 03F2
0167:00426144 57 PUSH EDI
0167:00426145 E86C410600 CALL `MFC42!ord_00000942`
0167:0042614A 8D86E8000000 LEA EAX,[ESI+E8]
0167:00426150 50 PUSH EAX
0167:00426151 68ED040000 PUSH DWORD 04ED
0167:00426156 57 PUSH EDI
0167:00426157 E85A410600 CALL `MFC42!ord_00000942`
0167:0042615C 81C6EC000000 ADD ESI,EC
0167:00426162 56 PUSH ESI
0167:00426163 68EE040000 PUSH DWORD 04EE
0167:00426168 57 PUSH EDI
0167:00426169 E848410600 CALL `MFC42!ord_00000942` ;這裡是關鍵【跟進】
0167:0042616E 5F POP EDI
0167:0042616F 5E POP ESI
0167:00426170 C20400 RET 04
;F8【跟進】後按F10一直到:
.text:0042626E push eax
.text:0042626F push ecx
.text:00426270 call sub_4679DB ;在這裡F8【跟進】
;【跟進】後按F10來到:
.text:00467A08 xor esi, esi ;esi清零
.text:00467A0A push 4
.text:00467A0C push eax
.text:00467A0D mov [ebp-4], esi
.text:00467A10 call ??_L@YGXPAXIHP6EX0@Z1@Z `eh vector constructor iterator'(void *,uint,int,void (*)(void *),uint)
.text:00467A15 mov eax, [ebp-14h] ;使用者名稱
.text:00467A18 mov byte ptr [ebp-4], 1
.text:00467A1C cmp dword ptr [eax-8], 5 ; 長度小於5嗎?
.text:00467A20 jl loc_468022 ;不要跳走了
.text:00467A26 mov ebx, ds:_mbscmp
.text:00467A2C push offset aTemporaryCode "temporary code"
.text:00467A31 push eax
.text:00467A32 call ebx _mbscmp
.text:00467A34 pop ecx
.text:00467A35 test eax, eax ;使用者名稱
.text:00467A37 pop ecx
.text:00467A38 jnz loc_467C62 ;這裡跳到下面計算註冊碼
;***********************************************************************
.text:00467C62 loc_467C62: CODE XREF: sub_4679DB+5Dj
.text:00467C62 lea eax, [ebp-44h]
.text:00467C65 mov [ebp-1Ch], esi ;[ebp-1Ch]=0
.text:00467C68 mov [ebp-18h], eax
;。。。。。。(略N行)
;-----------------------------------------------------------------------按F10一直到:
.text:00467C70 loc_467C70: CODE XREF: sub_4679DB+604j
.text:00467C70 lea ecx, [ebp-10h]
.text:00467C73 call ??0CString@@QAE@XZ CString::CString(void)
.text:00467C78 lea ecx, [ebp+8]
.text:00467C7B mov byte ptr [ebp-4], 5
.text:00467C7F call ??0CString@@QAE@XZ CString::CString(void)
.text:00467C84 mov eax, [ebp-14h] ;使用者名稱
.text:00467C87 push 2
.text:00467C89 pop ebx ;【ebx=2】這個值後面要用
.text:00467C8A mov byte ptr [ebp-4], 6
.text:00467C8E mov eax, [eax-8] ;使用者名稱長度
.text:00467C91 mov ecx, ebx
.text:00467C93 cdq
.text:00467C94 idiv ecx ; 除以2
.text:00467C96 test edx, edx ; 餘數
.text:00467C98 jnz short loc_467C9F ; 不為0,就。。。
.text:00467C9A push dword ptr [ebp-1Ch]
.text:00467C9D jmp short loc_467CA6
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++餘數不等於0
loc_467C9F: CODE XREF: sub_4679DB+2BDj
.text:00467C9F mov eax, [ebp-1Ch] ;eax=0,見00467A08、00467C65
.text:00467CA2 add eax, 5 ; 第一位註冊碼=5
.text:00467CA5 push eax
.text:00467CA6
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++餘數等於0
; 第一位註冊碼=0
.text:00467CA6 loc_467CA6: CODE XREF: sub_4679DB+2C2j
.text:00467CA6 lea eax, [ebp-10h]
.text:00467CA9 push esi
.text:00467CAA push eax
.text:00467CAB call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467CB0 mov eax, [ebp-14h] ;使用者名稱
.text:00467CB3 add esp, 0Ch
.text:00467CB6 movsx eax, byte ptr [eax] ; 第一位
.text:00467CB9 push 0Ah
.text:00467CBB cdq
.text:00467CBC pop ecx ;(ecx=0Ah)
.text:00467CBD idiv ecx ; 除以0Ah
.text:00467CBF lea eax, [ebp+8]
.text:00467CC2 push edx ; 餘數4入棧,
.text:00467CC3 push esi ; 是為註冊碼第2位
.text:00467CC4 push eax
.text:00467CC5 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...) ;格式化為一個字元
.text:00467CCA add esp, 0Ch
.text:00467CCD lea eax, [ebp+8] ;註冊碼第2位,每次都存放在這裡
.text:00467CD0 lea ecx, [ebp-10h] ;註冊碼第1位,(下面類推)
.text:00467CD3 push eax
.text:00467CD4 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;把它們連線成註冊碼的第1、2位
.text:00467CD9 mov eax, [ebp-14h] ;使用者名稱
.text:00467CDC push 4
.text:00467CDE pop ecx ;ecx=4
.text:00467CDF movsx eax, byte ptr [eax+1] ;使用者名稱第2位
.text:00467CE3 cdq
.text:00467CE4 idiv ecx ; 除以ecx(=4)
.text:00467CE6 lea eax, [ebp+8]
.text:00467CE9 add edx, ebx ; 餘數加ebx(=2),見00467C89
.text:00467CEB push edx ;儲存
.text:00467CEC push esi
.text:00467CED push eax
.text:00467CEE call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...) ;同上,格式化
.text:00467CF3 add esp, 0Ch
.text:00467CF6 lea eax, [ebp+8] ;註冊碼第3位
.text:00467CF9 lea ecx, [ebp-10h] ;註冊碼第2位
.text:00467CFC push eax
.text:00467CFD call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;同上,連線
.text:00467D02 push dword ptr [ebp-10h] char *
.text:00467D05 call ds:atoi ;前三位轉為整數,返回eax
.text:00467D0B lea ecx, [ebp-10h]
.text:00467D0E mov [ebp-24h], eax ;【注意】這裡,下面要用;eax是註冊碼前3位(整數形式)
.text:00467D11 mov [esp+14Ch+var_14C], offset asc_4BC800 "-" 這是第四位
.text:00467D18 call ??YCString@@QAEABV0@PBD@Z CString::operator+=(char const *) ;連線後形為“xxx-”
.text:00467D1D mov eax, [ebp-14h] ;使用者名稱
.text:00467D20 push 7
.text:00467D22 pop ecx ;(ecx=7)
.text:00467D23 movsx eax, byte ptr [eax+2] ; 第3位
.text:00467D27 cdq
.text:00467D28 idiv ecx ; 除以ecx(=7)
.text:00467D2A lea eax, [ebp+8]
.text:00467D2D mov edi, edx ; 餘數遞edi
.text:00467D2F inc edi ;再加1就是註冊碼第5位
.text:00467D30 push edi
.text:00467D31 push esi
.text:00467D32 push eax
.text:00467D33 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467D38 add esp, 0Ch
.text:00467D3B lea eax, [ebp+8]
.text:00467D3E lea ecx, [ebp-10h]
.text:00467D41 push eax
.text:00467D42 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467D47 mov eax, edi ;註冊碼第5位ASCII碼
.text:00467D49 push 6
.text:00467D4B imul eax, 0Dh ; 乘以0Dh
.text:00467D4E add eax, [ebp-24h] ; 加上[/];見00467D0E處
.text:00467D51 pop ecx ;(ecx=6)
.text:00467D52 cdq
.text:00467D53 idiv ecx ; 除以ecx(=6)
.text:00467D55 lea eax, [ebp+8]
.text:00467D58 add edx, ebx ; 餘數加上ebx(=2)
.text:00467D5A push edx ;就是註冊碼第6位
.text:00467D5B push esi
.text:00467D5C push eax
.text:00467D5D call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467D62 add esp, 0Ch
.text:00467D65 lea eax, [ebp+8]
.text:00467D68 lea ecx, [ebp-10h]
.text:00467D6B push eax
.text:00467D6C call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467D71 mov eax, [ebp-14h] ;使用者名稱
.text:00467D74 movsx eax, byte ptr [eax+3] ; 第4位
.text:00467D78 push 0Ah
.text:00467D7A cdq
.text:00467D7B pop ecx ;(ecx=0Ah)
.text:00467D7C idiv ecx ; 除以ecx(=0Ah)
.text:00467D7E lea eax, [ebp+8]
.text:00467D81 mov edi, edx ; 餘數遞edi
.text:00467D83 push edi ;註冊碼第7位
.text:00467D84 push esi
.text:00467D85 push eax
.text:00467D86 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467D8B add esp, 0Ch
.text:00467D8E lea eax, [ebp+8]
.text:00467D91 lea ecx, [ebp-10h]
.text:00467D94 push eax
.text:00467D95 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467D9A push 5
.text:00467D9C inc edi ;註冊碼第7位ASCII碼加1
.text:00467D9D pop eax ;(eax=5)
.text:00467D9E cdq
.text:00467D9F idiv edi ;eax idiv edi
.text:00467DA1 mov edi, offset aD_4 "%d-"
.text:00467DA6 lea eax, [ebp+8]
.text:00467DA9 push edx ;註冊碼第8位
.text:00467DAA push edi ;“-”,第9位
.text:00467DAB push eax
.text:00467DAC call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...) ;格式化為“x-”
.text:00467DB1 add esp, 0Ch
.text:00467DB4 lea eax, [ebp+8]
.text:00467DB7 lea ecx, [ebp-10h]
.text:00467DBA push eax
.text:00467DBB call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;連線後註冊碼形如“xxx-yyyy-”
.text:00467DC0 mov eax, [ebp-14h] ;使用者名稱
.text:00467DC3 mov ecx, ebx ;(ecx=ebx=2)
.text:00467DC5 movsx eax, byte ptr [eax+4] ; 第5位
.text:00467DC9 cdq
.text:00467DCA idiv ecx ; 除以ecx(=2)
.text:00467DCC lea eax, [ebp+8]
.text:00467DCF push edx ; 餘數為註冊碼第10位
.text:00467DD0 push esi
.text:00467DD1 push eax
.text:00467DD2 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467DD7 add esp, 0Ch
.text:00467DDA lea eax, [ebp+8]
.text:00467DDD lea ecx, [ebp-10h]
.text:00467DE0 push eax
.text:00467DE1 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;連線後註冊碼形如“xxx-yyyy-z”
.text:00467DE6 mov eax, [ebp-14h] ;使用者名稱
.text:00467DE9 cmp dword ptr [eax-8], 5 ; 的長度大於5?
.text:00467DED jg short loc_467DF5 ; 是,跳~
.text:00467DEF movsx eax, byte ptr [eax+3] ; 否(等於),則取使用者名稱第4位;【注意】:這裡不可能小於5,見前00467A1C處
.text:00467DF3 jmp short loc_467DF9
.text:00467DF5 +++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於5?.text:00467DF5
.text:00467DF5 loc_467DF5: CODE XREF: sub_4679DB+412j
.text:00467DF5 movsx eax, byte ptr [eax+5] ; 就取使用者名稱第6位
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467DF9
.text:00467DF9 loc_467DF9: CODE XREF: sub_4679DB+418j
.text:00467DF9 push 4
.text:00467DFB cdq
.text:00467DFC pop ecx ;(ecx=4)
.text:00467DFD idiv ecx ; 再除以ecx(=4)
.text:00467DFF lea eax, [ebp+8]
.text:00467E02 add edx, ebx ; 餘數加ebx(=2)
.text:00467E04 push edx ;就是註冊碼第11位
.text:00467E05 push esi
.text:00467E06 push eax
.text:00467E07 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467E0C add esp, 0Ch
.text:00467E0F lea eax, [ebp+8]
.text:00467E12 lea ecx, [ebp-10h]
.text:00467E15 push eax
.text:00467E16 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467E1B mov eax, [ebp-14h] ;使用者名稱
.text:00467E1E cmp dword ptr [eax-8], 6 ; 長度大於6?
.text:00467E22 jg short loc_467E32 ; 是,跳~
.text:00467E24 movsx eax, byte ptr [eax+1] ; 否,取使用者名稱第2位
.text:00467E28 push 7
.text:00467E2A cdq
.text:00467E2B pop ecx
.text:00467E2C idiv ecx ; (否)除以ecx(=7)
.text:00467E2E add edx, ebx ; (否)餘數再加ebx(=2)
.text:00467E30 jmp short loc_467E3E
.text:00467E32 +++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於6
.text:00467E32
.text:00467E32 loc_467E32: CODE XREF: sub_4679DB+447j
.text:00467E32 movsx eax, byte ptr [eax+6] ; 取使用者名稱第7位
.text:00467E36 cdq
.text:00467E37 mov ecx, ebx
.text:00467E39 idiv ecx ; 除以ecx(=2)
.text:00467E3B add edx, 6 ; 餘數再加6
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467E3E
.text:00467E3E loc_467E3E: CODE XREF: sub_4679DB+455j
.text:00467E3E push edx ;上面結果就是註冊碼第12位
.text:00467E3F lea eax, [ebp+8]
.text:00467E42 push esi
.text:00467E43 push eax
.text:00467E44 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467E49 add esp, 0Ch
.text:00467E4C lea eax, [ebp+8]
.text:00467E4F lea ecx, [ebp-10h]
.text:00467E52 push eax
.text:00467E53 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467E58 mov eax, [ebp-14h] ;使用者名稱
.text:00467E5B cmp dword ptr [eax-8], 7 ; 長度大於7?
.text:00467E5F jg short loc_467E6D ; 是,跳
.text:00467E61 movsx eax, byte ptr [eax+2] ; 否,取使用者名稱第3位
.text:00467E65 push 3
.text:00467E67 cdq
.text:00467E68 pop ecx
.text:00467E69 idiv ecx ; (否)除以ecx(=3)
.text:00467E6B jmp short loc_467E79
.text:00467E6D +++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於7
.text:00467E6D
.text:00467E6D loc_467E6D: CODE XREF: sub_4679DB+484j
.text:00467E6D movsx eax, byte ptr [eax+7] ; 就取使用者名稱第8位
.text:00467E71 cdq
.text:00467E72 mov ecx, ebx
.text:00467E74 idiv ecx ; 除以ecx(=2)
.text:00467E76 add edx, 6 ; 餘數加6
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467E79
.text:00467E79 loc_467E79: CODE XREF: sub_4679DB+490j
.text:00467E79 push edx ;上面的結果就是註冊碼第13位
.text:00467E7A lea eax, [ebp+8]
.text:00467E7D push edi
.text:00467E7E push eax
.text:00467E7F call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467E84 add esp, 0Ch
.text:00467E87 lea eax, [ebp+8]
.text:00467E8A lea ecx, [ebp-10h]
.text:00467E8D push eax
.text:00467E8E call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;這裡連線後註冊碼形如“xxx-yyyy-zzzz-”
.text:00467E93 mov eax, [ebp-14h] ;使用者名稱
.text:00467E96 cmp dword ptr [eax-8], 8 ; 長度大於8?
.text:00467E9A jg short loc_467EA8 ; 是,跳~
.text:00467E9C movsx eax, byte ptr [eax+4] ; 否,取使用者名稱第5位
.text:00467EA0 push 9
.text:00467EA2 cdq
.text:00467EA3 pop ecx
.text:00467EA4 idiv ecx ; (否)除以ecx(=9)
.text:00467EA6 jmp short loc_467EB4
.text:00467EA8 +++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於8
.text:00467EA8
.text:00467EA8 loc_467EA8: CODE XREF: sub_4679DB+4BFj
.text:00467EA8 movsx eax, byte ptr [eax+8] ; 就取使用者名稱第9位
.text:00467EAC push 6
.text:00467EAE cdq
.text:00467EAF pop ecx
.text:00467EB0 idiv ecx ; 除以ecx(=6)
.text:00467EB2 add edx, ebx ; 餘數加ebx(=2)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467EB4
.text:00467EB4 loc_467EB4: CODE XREF: sub_4679DB+4CBj
.text:00467EB4 push edx ;註冊碼第15位
.text:00467EB5 lea eax, [ebp+8]
.text:00467EB8 push esi
.text:00467EB9 push eax
.text:00467EBA call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467EBF add esp, 0Ch
.text:00467EC2 lea eax, [ebp+8]
.text:00467EC5 lea ecx, [ebp-10h]
.text:00467EC8 push eax
.text:00467EC9 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467ECE mov eax, [ebp-14h] ;使用者名稱
.text:00467ED1 cmp dword ptr [eax-8], 9 ; 長度大於9?
.text:00467ED5 jg short loc_467EE1 ; 是,跳~
.text:00467ED7 movsx eax, byte ptr [eax] ; 否,取使用者名稱第1位
.text:00467EDA cdq
.text:00467EDB mov ecx, ebx
.text:00467EDD idiv ecx ; 除以ecx(=2)
.text:00467EDF jmp short loc_467EEC
.text:00467EE1 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於9
.text:00467EE1
.text:00467EE1 loc_467EE1: CODE XREF: sub_4679DB+4FAj
.text:00467EE1 movsx eax, byte ptr [eax+9] ; 取使用者名稱第10位
.text:00467EE5 cdq
.text:00467EE6 mov ecx, ebx
.text:00467EE8 idiv ecx ; 除以ecx(=2)
.text:00467EEA add edx, ebx ; 餘數加上ebx(=2)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467EEC
.text:00467EEC loc_467EEC: CODE XREF: sub_4679DB+504j
.text:00467EEC push edx ;註冊碼第16位
.text:00467EED lea eax, [ebp+8]
.text:00467EF0 push esi
.text:00467EF1 push eax
.text:00467EF2 call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467EF7 add esp, 0Ch
.text:00467EFA lea eax, [ebp+8]
.text:00467EFD lea ecx, [ebp-10h]
.text:00467F00 push eax
.text:00467F01 call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &)
.text:00467F06 mov eax, [ebp-14h] ;使用者名稱
.text:00467F09 cmp dword ptr [eax-8], 0Ah ; 長度大於10D?
.text:00467F0D jg short loc_467F1B ; 是,跳~
.text:00467F0F movsx eax, byte ptr [eax+1] ; 否,取使用者名稱第2位
.text:00467F13 push 7
.text:00467F15 cdq
.text:00467F16 pop ecx
.text:00467F17 idiv ecx ; 除以ecx(=7)
.text:00467F19 jmp short loc_467F27
.text:00467F1B +++++++++++++++++++++++++++++++++++++++++++++++++++++++使用者名稱長度大於10
.text:00467F1B
.text:00467F1B loc_467F1B: CODE XREF: sub_4679DB+532j
.text:00467F1B movsx eax, byte ptr [eax+0Ah] ; 取使用者名稱第11位
.text:00467F1F push 7
.text:00467F21 cdq
.text:00467F22 pop ecx
.text:00467F23 idiv ecx ; 除以ecx(=7)
.text:00467F25 add edx, ebx ; 餘數加上ebx(=2)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.text:00467F27
.text:00467F27 loc_467F27: CODE XREF: sub_4679DB+53Ej
.text:00467F27 push edx ;註冊碼第17位
.text:00467F28 lea eax, [ebp+8]
.text:00467F2B push esi
.text:00467F2C push eax
.text:00467F2D call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467F32 add esp, 0Ch
.text:00467F35 lea eax, [ebp+8]
.text:00467F38 lea ecx, [ebp-10h]
.text:00467F3B push eax
.text:00467F3C call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;到這裡註冊碼形如“xxx-yyyy-zzzz-aaa”
;還有最後一位沒有計算出來
.text:00467F41 lea eax, [ebp-10h]
.text:00467F44 lea ecx, [ebp+8]
.text:00467F47 push eax
.text:00467F48 call ??4CString@@QAEABV0@ABV0@@Z CString::operator=(CString const &)
.text:00467F4D push offset ValueName
.text:00467F52 push offset asc_4BC800 "-"
.text:00467F57 lea ecx, [ebp+8]
.text:00467F5A call MFC42_6877
.text:00467F5F lea eax, [ebp-20h] ;上面計算好的註冊碼(17位)
.text:00467F62 push 5
.text:00467F64 push eax
.text:00467F65 lea ecx, [ebp+8]
.text:00467F68 call ?Left@CString@@QBE?AV1@H@Z CString::Left(int)
;從它的左邊取出6位,然後去掉“-”
.text:00467F6D push eax
.text:00467F6E lea ecx, [ebp+8]
.text:00467F71 mov byte ptr [ebp-4], 7
.text:00467F75 call ??4CString@@QAEABV0@ABV0@@Z CString::operator=(CString const &)
.text:00467F7A lea ecx, [ebp-20h]
.text:00467F7D mov byte ptr [ebp-4], 6
.text:00467F81 call ??1CString@@QAE@XZ CString::~CString(void)
.text:00467F86 push dword ptr [ebp+8] char *
.text:00467F89 call ds:atoi ;再轉換成整數形式,返回eax
.text:00467F8F pop ecx
.text:00467F90 push 0Ah
.text:00467F92 cdq
.text:00467F93 pop ecx
.text:00467F94 idiv ecx ; 最後除以ecx(=0Ah)
.text:00467F96 lea eax, [ebp+8]
.text:00467F99 push edx ; 餘數就是註冊碼第18位
.text:00467F9A push esi
.text:00467F9B push eax
.text:00467F9C call ?Format@CString@@QAAXPBDZZ CString::Format(char const *,...)
.text:00467FA1 add esp, 0Ch
.text:00467FA4 lea eax, [ebp+8]
.text:00467FA7 lea ecx, [ebp-10h]
.text:00467FAA push eax
.text:00467FAB call ??YCString@@QAEABV0@ABV0@@Z CString::operator+=(CString const &) ;得到完整的註冊碼
.text:00467FB0 mov ecx, [ebp-18h]
.text:00467FB3 lea eax, [ebp-10h]
.text:00467FB6 push eax
【總結】
註冊演算法還是比較簡單的:透過反覆從使用者名稱、已計算的註冊碼中取值運算得到註冊碼,詳細見上。
標 題:Tray Helper V 3.6序號產生器 (6千字)
發信人:lq7972
時 間:2003-10-05 14:49:08
詳細資訊:
Software:Tray Helper V 3.6
http://www.trayhelper.com
功能眾多的小軟體
Tools:TRW 2000、Ida v4.5,MASM32 V8
Cracker:lq7972[bruceyu13@sina.com]
Notes:過完這個國慶假期,下半年的工作那個忙啊~忙啊
如果這篇文字寫得不好,請丟番茄--晚上我好湊個冷盤^_^
【序號產生器】
KeyGen.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; The KeyGen by lq7972,with MASM32 V8
; E-mail:bruceyu13@sina.com
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;Include檔案定義
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
include comdlg32.inc
includelib comdlg32.lib
include masm32.inc
includelib masm32.lib
;Equ等值定義
;ICO_MAIN equ 1000H
DLG_MAIN equ 1
EditName equ 10
EditSN equ 11
;*************************************************************************************
.data?
szName db 11 dup (?)
szSN db 20 dup (?)
Reg1 dd 3 dup (?)
Reg2 dd 4 dup (?)
Reg3 dd 4 dup (?)
Reg4 dd 4 dup (?)
Temp db 5 dup (?)
.data
hInstance dd 0
szErr db '使用者名稱長度要大(等)於5!',0dh,0ah,'請重新輸入。。。',0
szCaption db '錯誤!',0
RegFmt db '%3s-%4s-%4s-%4s',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;***************************************************************************************
_RegCodCalc proc
local @Len,@Temp
pushad
xor esi,esi
mov ebx,2
invoke lstrlen,addr szName
mov dword ptr @Len,eax
.if eax < 5
invoke MessageBox,NULL,offset szErr,offset szCaption,MB_OK
mov eax,FALSE
ret
.endif
mov ecx,ebx
cdq
idiv ecx
test edx,edx
jnz @F
invoke dw2a,edx,addr [Reg1]
invoke dw2a,edx,addr [Temp]
jmp a10
@@:
mov eax,esi
add eax,5
mov edx,eax
invoke dw2a,edx,addr [Reg1]
invoke dw2a,edx,addr [Temp]
a10:
lea eax,offset szName
movsx eax,byte ptr [szName]
mov ecx,0Ah
cdq
idiv ecx
invoke dw2a,edx,addr [Reg1+1]
invoke dw2a,edx,addr [Temp+1]
movsx eax,byte ptr [szName+1]
mov ecx,4
cdq
idiv ecx
add edx,ebx
invoke dw2a,edx,addr [Reg1+2]
invoke dw2a,edx,addr [Temp+2]
invoke htodw,addr Reg1
mov dword ptr @Temp,eax
movsx eax,byte ptr [szName+2]
mov ecx,7
cdq
idiv ecx
mov edi,edx
inc edi
mov edx,edi
invoke dw2a,edx,addr [Reg2]
invoke dw2a,edx,addr [Temp+3]
mov eax,edi
mov ecx,6
imul eax,0Dh
add eax,@Temp
cdq
idiv ecx
add edx,ebx
invoke dw2a,edx,addr [Reg2+1]
invoke dw2a,edx,addr [Temp+4]
mov eax,dword ptr Reg2
movsx eax,byte ptr [szName+3]
mov ecx,0Ah
cdq
idiv ecx
mov edi,edx
invoke dw2a,edx,addr [Reg2+2]
inc edi
mov eax,5
cdq
idiv edi
invoke dw2a,edx,addr [Reg2+3]
movsx eax,byte ptr [szName+4]
mov ecx,ebx
cdq
idiv ecx
invoke dw2a,edx,addr [Reg3]
.if @Len > 5
movsx eax,byte ptr [szName+5]
.else
movsx eax,byte ptr [szName+3]
.endif
mov ecx,4
cdq
idiv ecx
add edx,ebx
invoke dw2a,edx,addr [Reg3+1]
.if @Len > 6
movsx eax,byte ptr [szName+6]
cdq
mov ecx,ebx
idiv ecx
add edx,6
.else
movsx eax,byte ptr [szName+1]
mov ecx,7
cdq
idiv ecx
add edx,ebx
.endif
invoke dw2a,edx,addr [Reg3+2]
.if @Len > 7
movsx eax,byte ptr [szName+7]
cdq
mov ecx,ebx
idiv ecx
add edx,6
.else
movsx eax,byte ptr [szName+2]
cdq
mov ecx,3
idiv ecx
.endif
invoke dw2a,edx,addr [Reg3+3]
.if @Len > 8
movsx eax,byte ptr [szName+8]
cdq
mov ecx,6
idiv ecx
add edx,ebx
.else
movsx eax,byte ptr [szName+4]
cdq
mov ecx,9
idiv ecx
.endif
invoke dw2a,edx,addr [Reg4]
.if @Len > 9
movsx eax,byte ptr [szName+9]
cdq
mov ecx,ebx
idiv ecx
add edx,ebx
.else
movsx eax,byte ptr [szName]
cdq
mov ecx,ebx
idiv ecx
.endif
invoke dw2a,edx,addr [Reg4+1]
.if @Len > 0Ah
movsx eax,byte ptr [szName+0Ah]
cdq
mov ecx,7
idiv ecx
add edx,ebx
.else
movsx eax,byte ptr [szName+1]
cdq
mov ecx,7
idiv ecx
.endif
invoke dw2a,edx,addr [Reg4+2]
invoke atodw,addr Temp
mov ecx,0Ah
cdq
idiv ecx
invoke dw2a,edx,addr [Reg4+3]
invoke wsprintf,addr szSN,addr RegFmt,addr Reg1,addr Reg2,addr Reg3,addr Reg4
popad
ret
_RegCodCalc endp
;**************************************************************************************
_ProcDlgMain proc uses ebx edi esi ebp hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.if eax == IDOK
invoke RtlZeroMemory,offset szName,512
invoke GetDlgItemText,hWnd,EditName,offset szName,11
.if eax != NULL
invoke _RegCodCalc
invoke SetDlgItemText,hWnd,EditSN,offset szSN
mov eax,FALSE
ret
.endif
.elseif eax == IDCANCEL
invoke EndDialog,hWnd,NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
KeyGen.rc
;/////////////////////////////////////////////////////////////////////////////////////
#include
#define ICO_MAIN 0x1000
#define DLG_MAIN 1
#define EDITName 10
#define EDITSN 11
//ICO_MAIN ICON "01.ico"
DLG_MAIN DIALOG 100,150,250,60
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Tray Helper v3.6 序號產生器"
FONT 9,"宋體"
{
CONTROL "Name:" ,-1,"Static",SS_LEFT,10,13,40,17
CONTROL "Code:" ,-2,"Static",SS_CENTER,10,40,20,17
CONTROL "" ,10,"Edit",ES_LEFT,30,13,150,10
CONTROL "" ,11,"Edit",ES_LEFT,30,40,150,10
DEFPUSHBUTTON "GENERATE",IDOK,200,11,40,15
PUSHBUTTON "EXIT",IDCANCEL,200,36,41,14
}
;///////////////////////////////////////////////////////////////////////////////////
makefile
;//////////////////////////////////////////////////////////////////////////////////
NAME = KeyGen
OBJS = $(NAME).obj
RES = $(NAME).res
LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff
$(NAME).exe: $(OBJS) $(RES)
Link $(LINK_FLAG) $(OBJS) $(RES)
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
clean:
del *.obj
del *.res
相關文章
- 輕鬆試卷 V4.50 演算法分析 (5千字)2002-01-03演算法
- Directory Scanner v1.5 註冊演算法分析 (6千字)2015-11-15演算法
- MouseStar V3.01註冊演算法分析 (18千字)2015-11-15演算法
- Speaking Clock Deluxe V3.05 演算法分析
(14千字)2002-07-19UX演算法
- Screen Demo Maker
V3.0註冊演算法分析 (8千字)2002-09-10演算法
- 完美解除安裝 V5.01 演算法分析 (6千字)2002-02-02演算法
- CoolClock V1.02註冊演算法分析 ---OCG (14千字)2015-11-15演算法
- 螢幕錄影專家 V3.0 演算法分析
(13千字)2003-04-08演算法
- 〖網際營銷〗V2.4 註冊演算法分析 (11千字)2001-11-03演算法
- GSview V4.12 for Windows註冊演算法分析 -
OCG (8千字)2015-11-15ViewWindows演算法
- 某國產彩票V3.0軟體的演算法分析
(22千字)2015-11-15演算法
- Search32-PRO
v6.05註冊演算法分析 - OCG (46千字)2002-04-07演算法
- Advanced Dialer v2.5演算法分析(附序號產生器) (3千字)2002-04-17演算法
- EmEditor v3 Version 3.09 漢化版註冊碼演算法分析
(8千字)2001-01-09演算法
- Add/Remove 4Good v2.01 註冊演算法分析 (18千字)2015-11-15REMGo演算法
- mIRC V5.71分析
(9千字)2000-08-19
- 炒股理財演算法分析 (3千字)2001-03-31演算法
- HappyEO演算法分析
(11千字)2015-11-15APP演算法
- Sitman2.1
演算法分析 (5千字)2015-11-15演算法
- 給TAE!的小禮物---對DISKdata v3.3.2註冊演算法的分析 (14千字)2001-07-13演算法
- 初學者(26) (9千字)2000-08-17
- rOYALaCCEZZ Trial Crackme 3.2 演算法分析 (10千字)2002-02-27演算法
- SuperCleaner演算法分析----菜鳥級
(12千字)2015-11-15演算法
- Readbook 1.42版 演算法分析。 (1千字)2015-11-15演算法
- 炒股理財3.1 演算法分析(15千字)2015-11-15演算法
- FolderView 1.7
註冊演算法分析 (14千字)2015-11-15View演算法
- Turbo Photo V2.5 演算法分析2015-11-15演算法
- 小李登錄檔大師 v1.41 註冊演算法分析--獻給 LILITH 和解密演算法初學者 (10千字)2001-11-09演算法解密
- 重新貼過註冊演算法分析 (16千字)2001-10-23演算法
- PC 安全虎[Beta 1]演算法分析 (6千字)2001-12-05演算法
- 屏保自己做2.61版演算法分析! (7千字)2002-02-18演算法
- eLib2.01演算法分析
(31千字)2015-11-15演算法
- 龍文輸入通演算法分析 (27千字)2015-11-15演算法
- HotkeyMaster演算法分析----菜鳥級
(4千字)2015-11-15AST演算法
- DataFit V7.0.36註冊過程的分析 (9千字)2001-11-09
- 書香門第 V1.30 Build 1732 演算法分析 + 無序號產生器 (18千字)2015-11-15UI演算法
- 系網紅巾V1.2演算法分析!2003-06-19演算法
- Windows System Optimizer V3.1演算法分析2015-11-15Windows演算法