影像合成的利器 2003 v4(一)註冊演算法 (8千字)

看雪資料發表於2015-11-15

標 題:影像合成的利器 2003 v4(一)註冊演算法 (8千字)

發信人:lq7972  [發短訊息]

時 間:2003-09-29 16:52:05

詳細資訊:



Software:h*y*2003 v4.06
影像合成的利器
Tools:IDA Pro v4.5、TRW 2000
Cracker:lq7972[bruceyu13@sina.com]
Notes:學習。以前用過它的老版本,今天看到新點的就裝上了;由於上次PJ的資料丟了,只好從頭來~這個軟體實屬國產精品,有條件就註冊用Z版;如果你只是為了省錢,那麼不用看這篇文字了

記得老版本中的序號產生器制是非常典型的真假碼對比跳轉,斷點“bpx hmemcpy”很容易找到註冊碼比較的地方~實際上攔住轉到程式領空後“d ecx”再Alt+↑↓就見得到了,可見程式是事先把註冊碼計算好,再透過開啟註冊介面獲得使用者輸入,最後比較
我關心的是它演算法~
TRW載入,斷點“bpx SendMessage”(其它如ShowWindow等等也行,但CreateWindow就~),按F5,開啟註冊視窗,攔住後“pmodule”,來到程式介面,按ESC鍵退出註冊視窗,再次中斷;現在我們看看在哪裡?
snyped:004119B8                 mov     [esp+0C0h+var_18], eax
snyped:004119BF                 call    ?DoModal@CDialog@@UAEHXZ  CDialog::DoModal(void)
snyped:004119C4                 cmp     eax, 1
snyped:004119C7                 jnz     short loc_4119EC

004119BF處的Call就是了。好,基於前面的分析我們從這裡往前不遠應該能找到註冊演算法或呼叫註冊演算法的Call--果然,上面就有這麼一句
snyped:004118E1                 call    ds:GetComputerNameA
看來正在接近中。。。
snyped:004118B0                 push    offset asc_4404E4  "%x"
snyped:004118B5                 push    eax
snyped:004118B6                 mov     byte ptr [esp+0CCh+var_4], bl
snyped:004118BD                 call    ?Format@CString@@QAAXPBDZZ  CString::Format(char const *,...)
激動中。。。
snyped:00411831                 lea     edx, [esp+100h+var_90]
snyped:00411835                 push    offset aCCCCCCCCCCCCCC  "%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c"
snyped:0041183A                 push    edx
snyped:0041183B                 call    ?Format@CString@@QAAXPBDZZ  CString::Format(char const *,...)
snyped:00411840                 mov     eax, [esp+108h+var_A4]
到這裡,"%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c"這個東西應就是註冊碼的格式了!註冊演算法就在這裡!
再次激動。。。

頂上就是註冊演算法
snyped:004116B1 
snyped:004116B1 loc_4116B1:                              CODE XREF: sub_410FD0+5DDj
snyped:004116B1                 mov     eax, [edi+0D0h] ;這個值?(387F9FFh)
snyped:004116B7                 cmp     eaxebx
snyped:004116B9                 jnz     short loc_41171A
;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
 loc_41171A:                              CODE XREF: sub_410FD0+6E9j
snyped:0041171A                 add     eax, 0BCC09h ;加上0BCC09h
snyped:0041171F                 push    eax
snyped:00411720                 lea     eax, [esp+0C4h+var_A8]
snyped:00411724                 push    offset a8d       "%8d"
snyped:00411729                 push    eax
snyped:0041172A                 call    ?Format@CString@@QAAXPBDZZ  CString::Format(char const *,...) ;這個是Hex2Dec
snyped:0041172F                 mov     eax, [esp+0CCh+var_A8] ;Num
snyped:00411733                 add     esp, 0Ch

;從這裡正式開始。。。
snyped:00411736                 mov     dl, [eax+1]
snyped:00411739                 mov     cl, [eax]
snyped:0041173B                 movsx   eaxbyte ptr [eax+2]
snyped:0041173F                 movsx   edxdl
snyped:00411742                 movsx   ecxcl
snyped:00411745                 add     eaxedx
snyped:00411747                 lea     eax, [eax+ecx-90h]
snyped:0041174E                 mov     ecx, 7
snyped:00411753                 cdq
snyped:00411754                 idiv    ecx
snyped:00411756                 lea     ecx, [esp+0C0h+var_A8]
snyped:0041175A                 add     dl, 30h
;歇一下,喘口氣

snyped:0041175D                 push    edx
snyped:0041175E                 push    3
snyped:00411760                 call    ?SetAt@CString@@QAEXHD@Z  CString::SetAt(int,char)
;這個是結果替換Num第4位
snyped:00411765                 mov     eax, [esp+0C0h+var_A8]

;開始~
snyped:00411769                 mov     dl, [eax+5]
snyped:0041176C                 mov     cl, [eax+4]
snyped:0041176F                 movsx   eaxbyte ptr [eax+6]
snyped:00411773                 movsx   edxdl
snyped:00411776                 movsx   ecxcl
snyped:00411779                 add     eaxedx
snyped:0041177B                 lea     eax, [eax+ecx-90h]
snyped:00411782                 mov     ecx, 7
snyped:00411787                 cdq
snyped:00411788                 idiv    ecx
snyped:0041178A                 add     dl, 30h
;再歇歇

snyped:0041178D                 push    edx
snyped:0041178E                 push    ecx
snyped:0041178F                 lea     ecx, [esp+0C8h+var_A8]
snyped:00411793                 call    ?SetAt@CString@@QAEXHD@Z  CString::SetAt(int,char)
;這個是結果替換Num第8位
snyped:00411798                 mov     eax, [esp+0C0h+var_A8]

;Come on~
snyped:0041179C                 mov     cl, [eax+2]
snyped:0041179F                 mov     bl, [eax+1]
snyped:004117A2                 mov     dl, [eax+7]
snyped:004117A5                 mov     [esp+0C0h+var_AD], cl
snyped:004117A9                 mov     cl, [eax+3]
snyped:004117AC                 mov     [esp+0C0h+var_A9], bl
snyped:004117B0                 mov     bl, [eax+4]
snyped:004117B3                 mov     [esp+0C0h+var_AB], cl
snyped:004117B7                 mov     cl, [eax+6]
snyped:004117BA                 mov     [esp+0C0h+var_AA], bl
snyped:004117BE                 mov     bl, [eax]
snyped:004117C0                 mov     al, [eax+5]
snyped:004117C3                 mov     [esp+0C0h+var_AC], al
;計算完
;最後處理並格式化輸出,要注意前後變數(變數沒有r/s)的移送:
snyped:004117C7                 movsx   eaxdl ;從第16位到第1位
snyped:004117CA                 push    eax
snyped:004117CB                 movsx   eax, [esp+0C4h+var_AD]
snyped:004117D0                 add     eax, 15h
snyped:004117D3                 push    eax
snyped:004117D4                 movsx   eax, [esp+0C8h+var_AB]
snyped:004117D9                 push    eax
snyped:004117DA                 movsx   eaxcl
snyped:004117DD                 add     eax, 17h
snyped:004117E0                 push    eax
snyped:004117E1                 movsx   eax, [esp+0D0h+var_A9]
snyped:004117E6                 push    eax
snyped:004117E7                 movsx   eax, [esp+0D4h+var_AA]
snyped:004117EC                 add     eax, 11h
snyped:004117EF                 push    eax
snyped:004117F0                 movsx   eaxbl
snyped:004117F3                 push    eax
snyped:004117F4                 movsx   eax, [esp+0DCh+var_AC]
snyped:004117F9                 add     eax, 11h
snyped:004117FC                 push    eax
snyped:004117FD                 movsx   eaxcl
snyped:00411800                 push    eax
snyped:00411801                 movsx   eax, [esp+0E4h+var_AB]
snyped:00411806                 add     eax, 13h
snyped:00411809                 push    eax
snyped:0041180A                 movsx   eax, [esp+0E8h+var_AA]
snyped:0041180F                 push    eax
snyped:00411810                 movsx   edxdl
snyped:00411813                 movsx   eax, [esp+0ECh+var_AC]
snyped:00411818                 add     edx, 12h
snyped:0041181B                 push    edx
snyped:0041181C                 push    eax
snyped:0041181D                 movsx   edx, [esp+0F4h+var_AD]
snyped:00411822                 movsx   eaxcl
snyped:00411825                 movsx   ecxbl
snyped:00411828                 add     edx, 1Bh
snyped:0041182B                 add     ecx, 11h
snyped:0041182E                 push    edx
snyped:0041182F                 push    eax
snyped:00411830                 push    ecx
snyped:00411831                 lea     edx, [esp+100h+var_90]
snyped:00411835                 push    offset aCCCCCCCCCCCCCC  "%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c
snyped:0041183A                 push    edx
snyped:0041183B                 call    ?Format@CString@@QAAXPBDZZ  CString::Format(char const *,...) ;ECX指向生成的註冊碼


很簡單吧?
寫序號產生器,還是用MASM32,方便,照抄就行:)
【序號產生器】
;//////////////////////////////////////////////////////////////////////////////////////////////
;今天有點事兒要辦,晚上再寫吧




標 題:hy2003  v 4.0.6 序號產生器(MASM32) (6千字)
發信人:lq7972
時 間:2003-10-01 17:44:12
詳細資訊:

hy2003 v 4.0.6 序號產生器(MASM32)
Notes:到今天才寫它,因為終於要放幾天假啦;啦啦啦啦~

[補遺]上面對那個值(004116B1  mov eax, [edi+0D0h])沒有弄明白:原以為是軟體的固定值;到今天寫序號產生器才知道它需要也可以從軟體編號反算出來,見序號產生器原始碼--其它的主要是注意透過對這個值進行不停的或前或後取(並計算)出注冊碼

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 4 dup (?)
Reg2 dd 4 dup (?)
Reg3 dd 4 dup (?)
Reg4 dd 4 dup (?)
Temp dd 8 dup (?)

.data
hInstance dd 0
szErr db '請輸入!',0
szCaption db '錯誤!',0 
RegFmt db '%4s-%4s-%4s-%4s',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;***************************************************************************************
_RegFmt proc
local @Temp1:byte,@Temp2:byte,@Temp3:byte,@Temp4:byte,@Temp5:byte

pushad
lea eax,offset Temp
mov cl,[eax+2]
mov bl,[eax+1]
mov dl,[eax+7]
mov byte ptr @Temp1,cl
mov cl,[eax+3]
mov byte ptr @Temp2,bl
mov bl,[eax+4]
mov byte ptr @Temp3,cl
mov cl,[eax+6]
mov byte ptr @Temp4,bl
mov bl,[eax]
mov al,[eax+5]
mov byte ptr @Temp5,al

mov byte ptr [Reg4+3],dl
movsx   eax,byte ptr [@Temp1]
add     eax,15h               
mov byte ptr [Reg4+2],al
movsx   eax,byte ptr [@Temp3]
mov byte ptr [Reg4+1],al
movsx   eax,cl                
add     eax,17h               
mov byte ptr [Reg4],al
movsx   eax,byte ptr [@Temp2]
mov byte ptr [Reg3+3],al
movsx   eax,byte ptr [@Temp4]
add     eax,11h               
mov byte ptr [Reg3+2],al   
mov byte ptr [Reg3+1],bl
movsx   eax,byte ptr [@Temp5]
add     eax,11h               
mov byte ptr [Reg3],al    
mov byte ptr [Reg2+3],cl
movsx   eax,byte ptr [@Temp3]
add     eax,13h               
mov byte ptr [Reg2+2],al
movsx   eax,byte ptr [@Temp4]
mov byte ptr [Reg2+1],al
movsx   edx,dl                
movsx   eax,byte ptr [@Temp5]
add     edx,12h               
mov byte ptr [Reg2],dl
mov byte ptr [Reg1+3],al
movsx   edx,byte ptr [@Temp1]
movsx   eax,cl                
movsx   ecx,bl                
add     edx,1Bh               
add     ecx,11h               
mov byte ptr [Reg1+2],dl
mov byte ptr [Reg1+1],al                    
mov byte ptr [Reg1],cl                    
 
invoke wsprintf,addr szSN,addr RegFmt,addr Reg1,addr Reg2,addr Reg3,addr Reg4
popad
ret
_RegFmt endp
;***************************************************************************************
_RegCodCalc proc

pushad
invoke htodw,addr [szName+3] ;MASM32.LIB轉換函式,從軟體編號反算生成註冊碼的關鍵值
sub eax,0B4E9Dh
add eax,0BCC09h
invoke dwtoa,eax,addr Temp
lea eax,offset Temp
xor edx,edx
xor ecx,ecx
mov dl,[eax+1]
mov cl,[eax]
movsx eax,byte ptr [eax+2]
movsx edx,dl
movsx ecx,cl
add eax,edx
lea eax,[eax+ecx-90h]
mov ecx,7
cdq
idiv ecx
add dl,30h
mov byte ptr [Temp+3],dl

lea eax,offset [Temp]
mov dl,[eax+5]
mov cl,[eax+4]
movsx eax,byte ptr [eax+6]
movsx edx,dl
movsx ecx,cl
add eax,edx
lea eax,[eax+ecx-90h]
mov ecx,7
cdq
idiv ecx
add dl,30h
mov byte ptr [Temp+7],dl

invoke _RegFmt
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
                 .else 
invoke MessageBox,NULL,offset szErr,offset szCaption,MB_OK
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 "幻影2003 v4.06 序號產生器" 
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

相關文章