PauYyoung大哥你还记得这句话吗??
↓↓↓↓↓
【有信心,凡事有可能】
【请各位大哥帮小弟找一下这个注册算法有什么错误】
作者:随风而去[CNCG]
所用时间:一周
软件名:Dance Dance Revlution for winamp
软件介绍:
此乃winamp的一个插件,可以让winamp实现跳舞毯的功能,
没有注册前,不能使用跳舞毯,还有一个特殊效果也用不上。注册之后就没有这些限制了。
***************************************************************************************
先运行winamp,招到此插件的配置窗口,然后点击注册,标准的注册窗口,用户名加注册码。
先随便试了一下,有错误提示,,用trw追。
下中断bpx
hmemcpy,
不要下pmodule,
直接按F12,按了11下就回到程序了
重新来一次,按10下F12后。
按一下F10,来到如下的程序段:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10003740(C)
|
* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:10003769 8B35D0B10010 mov esi, dword ptr [1000B1D0]//F10来到这里
:1000376F 53 push ebx
:10003770 8B5C2430 mov ebx, dword ptr [esp+30]
:10003774 6A64 push 00000064
:10003776 6830F40010 push 1000F430
:1000377B 68FB030000 push 000003FB
:10003780 53 push ebx
:10003781 FFD6 call esi <--取注册码长度放入EAX中
:10003783 8D4C240C lea ecx, dword ptr [esp+0C] <--D EDX可看假码
:10003787 6A20 push 00000020
:10003789 51 push ecx
:1000378A 68FA030000 push 000003FA
:1000378F 53 push ebx
:10003790 FFD6 call esi
:10003792 8D54240C lea edx, dword ptr [esp+0C]
:10003796 52 push edx
:10003797 6830F40010 push 1000F430 <--此处D 0287F430可看用户名
:1000379C E8EFF7FFFF call 10002F90 //这里有一个经典的对比,
所以这个CALL嫌疑非常大,
F8跟进到看看。
:100037A1 83C408 add esp, 00000008
:100037A4 85C0 test eax, eax
:100037A6 0F84A3000000 je 1000384F
:100037AC 8D442430 lea eax, dword ptr [esp+30]
:100037B0 50 push eax
F8来到这里
* Referenced by a CALL at Addresses:
|:100010D8 , :1000379C
|
:10002F90 83EC28 sub esp, 00000028
:10002F93 55 push ebp
:10002F94 8B6C2430 mov ebp, dword ptr [esp+30]
:10002F98 85ED test ebp, ebp <--看用户名是否为空
:10002F9A 57 push edi
:10002F9B 0F8429010000 je 100030CA
:10002FA1 8B542438 mov edx, dword ptr [esp+38]
:10002FA5 85D2 test edx, edx <--看注册码是否为空
:10002FA7 0F841D010000 je 100030CA
:10002FAD 8BFD mov edi, ebp
:10002FAF 83C9FF or ecx, FFFFFFFF
:10002FB2 33C0 xor eax, eax
:10002FB4 F2 repnz
:10002FB5 AE scasb
:10002FB6 F7D1 not ecx
:10002FB8 49 dec ecx
:10002FB9 0F840B010000 je 100030CA
:10002FBF 8BFA mov edi, edx
:10002FC1 83C9FF or ecx, FFFFFFFF
:10002FC4 F2 repnz
:10002FC5 AE scasb
:10002FC6 F7D1 not ecx
:10002FC8 49 dec ecx
:10002FC9 0F84FB000000 je 100030CA
:10002FCF 53 push ebx
:10002FD0 32DB xor bl, bl
:10002FD2 B908000000 mov ecx, 00000008
:10002FD7 8D7C2411 lea edi, dword ptr [esp+11]
:10002FDB 885C2410 mov byte ptr [esp+10], bl
:10002FDF 33D2 xor edx, edx
:10002FE1 F3 repz
:10002FE2 AB stosd
:10002FE3 8BFD mov edi, ebp
:10002FE5 83C9FF or ecx, FFFFFFFF
:10002FE8 F2 repnz
:10002FE9 AE scasb
:10002FEA F7D1 not ecx
:10002FEC 49 dec ecx
:10002FED 56 push esi
:10002FEE 85C9 test ecx, ecx
:10002FF0 894C243C mov dword ptr [esp+3C], ecx
:10002FF4 7E0A jle 10003000
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002FFE(C)
|
:10002FF6 8A042A mov al, byte ptr [edx+ebp] --| |注册名用十六进制放入al
:10002FF9 32D8 xor bl, al | | 和BL异或后,
:10002FFB 42 inc edx |-----|BL再和第二位异或……
:10002FFC 3BD1 cmp edx, ecx | |到最后一位,得出BL
:10002FFE 7CF6 jl 10002FF6 -----------------| |
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002FF4(C)
|
:10003000 33F6 xor esi, esi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10003073(U)
|
:10003002 83FE08 cmp esi, 00000008 //注册码不小于8个<1>
:10003005 7C07 jl 1000300E//小于就跳
:10003007 8D0409 lea eax, dword ptr [ecx+ecx]//注册码是注册名*2
:1000300A 3BF0 cmp esi, eax //比较
:1000300C 7D67 jge 10003075 //大于或等于跳,跳到注册码比较
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10003005(C)
|
:1000300E 8BFD mov edi, ebp
:10003010 83C9FF or ecx, FFFFFFFF
:10003013 33C0 xor eax, eax
:10003015 F2 repnz
:10003016 AE scasb
:10003017 8BC6 mov eax, esi
:10003019 99 cdq
:1000301A F7D1 not ecx
:1000301C 2BC2 sub eax, edx
:1000301E 49 dec ecx
:1000301F D1F8 sar eax, 1
:10003021 33D2 xor edx, edx
:10003023 F7F1 div ecx
:10003025 83FE01 cmp esi, 00000001
:10003028 8BFA mov edi, edx
:1000302A 7E05 jle 10003031
:1000302C 8D46FF lea eax, dword ptr [esi-01]
:1000302F EB02 jmp 10003033
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000302A(C)
|
:10003031 33C0 xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000302F(U)
|
:10003033 8A4C0414 |---mov cl, byte ptr [esp+eax+14]//正确的注册码从0位开始放入cl
:10003037 32CB <B>==| xor cl, bl <---------------- //与上面得出的bl异或
:10003039 80F18D | xor cl, 8D <---------------- //与8d异或
:1000303C 8AD9 |---mov bl, cl <---------------- //放入bl, 保留着下次再计算
:1000303E 885C2410 mov byte ptr [esp+10], bl
:10003042 8B542410 mov edx, dword ptr [esp+10] //得出的结果放入<1>计算
:10003046 52 push edx
:10003047 E8F4FEFFFF call 10002F40 <------------- //-----------<1>
:1000304C 8B4C2440 mov ecx, dword ptr [esp+40]
:10003050 88443418 mov byte ptr [esp+esi+18], al //放入<1>计算的注册码
:10003054 2BCF sub ecx, edi
:10003056 8A5429FF |---mov dl, byte ptr [ecx+ebp-01]----| |注册名的最后一位和注册
:1000305A 32D0 <C>==| xor dl, al |===|码第二位异或,再与D8异
:1000305C 80F2D8 |---xor dl, D8-----------------------| |或。得出dl放入<1>计算
:1000305F 52 push edx
:10003060 E8DBFEFFFF call 10002F40 <------------- //-------------<1>
:10003065 8B4C2444 mov ecx, dword ptr [esp+44]
:10003069 83C408 add esp, 00000008
:1000306C 88443415 mov byte ptr [esp+esi+15], al //放入<1>计算的注册码
:10003070 83C602 add esi, 00000002
:10003073 EB8D jmp 10003002 <------------- //向上跳,跳到<1>
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000300C(C)
|
:10003075 8B742440 mov esi, dword ptr [esp+40] //这里是假码,下d esp+40
:10003079 8D442414 lea eax, dword ptr [esp+14] //这里是真码,下d esp+14
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000309F(C)
跟进<1> *
*************************************
* Referenced by a CALL at Addresses:
|:10003047 , :10003060
|
:10002F40 8B442404 mov eax, dword ptr [esp+04] //将结果放入EAX
:10002F44 B93E000000 mov ecx, 0000003E <---------//ECX=3e
:10002F49 25FF000000 and eax, 000000FF <---------//取EAX最后两位
:10002F4E 99 cdq
:10002F4F F7F9 idiv ecx <------------------//eax/ecx al=商 dl=余
:10002F51 B03D mov al, 3D <----------------//al=3d
:10002F53 2AC2 sub al, dl <----------------//al=al-dl
:10002F55 3C09 cmp al, 09 <----------------//比较
:10002F57 88442404 mov byte ptr [esp+04], al //al放入[esp+04]
:10002F5B 761A jbe 10002F77 <--------------//不低于或等于
:10002F5D 3C23 cmp al, 23 <---------------//比较
:10002F5F 8B442404 mov eax, dword ptr [esp+04] //[esp+04]放入eax
:10002F63 7609 jbe 10002F6E <--------------//不低于或等于
:10002F65 25FF000000 and eax, 000000FF <---------//取EAX最后两位
:10002F6A 83C03D add eax, 0000003D <---------//eax=eax+3d
:10002F6D C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002F63(C)
|
:10002F6E 25FF000000 and eax, 000000FF <---------//取EAX最后两位
:10002F73 83C037 add eax, 00000037 <---------//eax=eax+37
:10002F76 C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002F5B(C)
|
:10002F77 8B442404 mov eax, dword ptr [esp+04] //[esp+04]放入eax
:10002F7B 25FF000000 and eax, 000000FF <---------//取EAX最后两位
:10002F80 83C030 add eax, 00000030 <---------//eax=eax+30
:10002F83 C3 ret
都不知道那些XOR是怎么计算的,现在写出过程!
我的注册名:black
整理:b与bl异或,bl再和第二位注册名异或得出bl再和第三位异或……到最后一位得出bl。
里异或的第一次过进
bl与b(62)得bl=62
bl与l(6c)得bl=e
bl与a(61)得bl=6f
bl与c(63)得bl=c
bl与k(6b)得bl=67
<B>整理:正注册码的0位开始放入cl与上面的bl异或得出bl,bl与8d异或得出bl,bl保留下次现计。
<B>里异或的第一次过进
第一次 cl(0)与bl(67)得cl=67
cl与8d得cl=ea
cl保留到bl=ea
第二次 cl(30)与bl得cl=da
cl与8d得cl=57
cl保留到bl=57
第三次 cl(54)与bl得cl=3
cl与8d得cl=8e
cl保留到bl=8e
第四次 cl(63)与bl得cl=ed
cl与8d得cl=60
cl保留到bl=60
第五次 cl(48)与bl得cl=28
cl与8d得cl=a5
cl保留到bl=a5
<C>整理:注册名的最后一位dl和注册码第一位al异或,得出dl位异或,再与D8异或……得出dl
<C>里异或的第一次过进
第一次 dl(67)与al(44)得dl=2f
dl与D8得dl=f7
第二次 dl(63)与al(61)得dl=2
dl与D8得dl=da
第三次 dl(61)与al(68)得dl=9
dl与D8得dl=d1
第四次 dl(6c)与al(52)得dl=32
dl与D8得dl=e6
第五次 dl(62)与al(4d)得dl=29
dl与D8得dl=f1
【请大哥级的高手帮一下小弟,讲解一下<B><C>xor的计算过程】
最后得出
注册名:black
注册码:D0aTHcRHK6 (注意大小写)
要各位大哥们帮我写个注册机来
先谢谢大哥们了
标 题:一点小意见,不知对否…… (3千字)
发信人:LILITH[CNCG]
时 间:2001-12-17 20:41:42
详细信息:
与我同时出道的随风而去[CNCG]兄今天终于搞出了他的第一个算法,实在是可喜可贺!呵呵,我看了看,但居然发现有一些地方还存在问题,最奇怪的是我跟踪过程中看到的地址竟完全不同,不过指令大致一样,所以写了出来,望大家多多指教。
具体跟踪过程及取注册码风兄已说得很清楚,在此不再哆嗦,只是我跟的地址有所不同,所以我干脆一步到位,下bpx GETDLGITEMTEXTA断点,再按一下F12就到达程序领空,不用按10次F10,然后跟进风兄提及到的第一个Call中。
0177:015C2F90 SUB ESP,BYTE +28
0177:015C2F93 PUSH EBP
0177:015C2F94 MOV EBP,[ESP+30]
0177:015C2F98 TEST EBP,EBP
0177:015C2F9A PUSH EDI
0177:015C2F9B JZ NEAR 015C30CA
0177:015C2FA1 MOV EDX,[ESP+38]
0177:015C2FA5 TEST EDX,EDX
0177:015C2FA7 JZ NEAR 015C30CA
0177:015C2FAD MOV EDI,EBP
0177:015C2FAF OR ECX,BYTE -01
0177:015C2FB2 XOR EAX,EAX
0177:015C2FB4 REPNE SCASB
0177:015C2FB6 NOT ECX
0177:015C2FB8 DEC ECX
0177:015C2FB9 JZ NEAR 015C30CA
0177:015C2FBF MOV EDI,EDX
0177:015C2FC1 OR ECX,BYTE -01
0177:015C2FC4 REPNE SCASB
0177:015C2FC6 NOT ECX
0177:015C2FC8 DEC ECX
0177:015C2FC9 JZ NEAR 015C30CA
0177:015C2FCF PUSH EBX
0177:015C2FD0 XOR BL,BL
0177:015C2FD2 MOV ECX,08
0177:015C2FD7 LEA EDI,[ESP+11]
0177:015C2FDB MOV [ESP+10],BL
0177:015C2FDF XOR EDX,EDX
0177:015C2FE1 REP STOSD
0177:015C2FE3 MOV EDI,EBP
0177:015C2FE5 OR ECX,BYTE -01
0177:015C2FE8 REPNE SCASB
0177:015C2FEA NOT ECX
0177:015C2FEC DEC ECX
0177:015C2FED PUSH ESI
0177:015C2FEE TEST ECX,ECX
0177:015C2FF0 MOV [ESP+3C],ECX
0177:015C2FF4 JNG 015C3000
0177:015C2FF6 MOV AL,[EDX+EBP] \\取用户名第一位字母十六进制值并存入al
0177:015C2FF9 XOR BL,AL \\al与bl相异或,结果存入bl
0177:015C2FFB INC EDX \\edx的值递增,初值为0
0177:015C2FFC CMP EDX,ECX \\取完一位后edx的值变1,与ecx比较,(ecx值为用户名长度)
0177:015C2FFE JL 015C2FF6 \\当edx小于ecx时跳到上面继续取用户名,至取完后则跳
0177:015C3000 XOR ESI,ESI \\这里esi清零
0177:015C3002 CMP ESI,BYTE +08 \\奇怪的是上面清零后esi当然不可能等于8
0177:015C3005 JL 015C300E \\我跟到这里是不跳的,只有改变跳转才能去到计注册码的地方?
0177:015C3007 LEA EAX,[ECX+ECX]
0177:015C300A CMP ESI,EAX
0177:015C300C JNL 015C3075
0177:015C300E MOV EDI,EBP
0177:015C3010 OR ECX,BYTE -01
0177:015C3013 XOR EAX,EAX
0177:015C3015 REPNE SCASB
0177:015C3017 MOV EAX,ESI
0177:015C3019 CDQ
0177:015C301A NOT ECX
0177:015C301C SUB EAX,EDX
0177:015C301E DEC ECX
0177:015C301F SAR EAX,1
0177:015C3021 XOR EDX,EDX
0177:015C3023 DIV ECX
0177:015C3025 CMP ESI,BYTE +01
0177:015C3028 MOV EDI,EDX
0177:015C302A JNG 015C3031
0177:015C302C LEA EAX,[ESI-01]
0177:015C302F JMP SHORT 015C3033
0177:015C3031 XOR EAX,EAX
0177:015C3033 MOV CL,[ESP+EAX+14]
0177:015C3037 XOR CL,BL
0177:015C3039 XOR CL,8D
0177:015C303C MOV BL,CL
0177:015C303E MOV [ESP+10],BL
0177:015C3042 MOV EDX,[ESP+10]
0177:015C3046 PUSH EDX
0177:015C3047 CALL 015C2F40
0177:015C304C MOV ECX,[ESP+40]
0177:015C3050 MOV [ESP+ESI+18],AL
0177:015C3054 SUB ECX,EDI
0177:015C3056 MOV DL,[ECX+EBP-01]
0177:015C305A XOR DL,AL
0177:015C305C XOR DL,D8
0177:015C305F PUSH EDX
0177:015C3060 CALL 015C2F40
0177:015C3065 MOV ECX,[ESP+44]
0177:015C3069 ADD ESP,BYTE +08
0177:015C306C MOV [ESP+ESI+15],AL
0177:015C3070 ADD ESI,BYTE +02
0177:015C3073 JMP SHORT 015C3002
0177:015C3075 MOV ESI,[ESP+40]\\经过上面的跳转已经来到这里,假注册出现
0177:015c3079 lea eax, dword ptr [esp+14] //这里存放了真的注册码,下d esp+14
总结:跟了一遍,发现与风兄所写的有很大出入,不知是否我的Winamp版本问题?
我的注册名和注册码:
CNCG
rApCpHu9
谨以此文献给我的好朋友风兄!
标 题:靠,MASM32注册机!!!! (5千字)
发信人:WenXinJY
时 间:2001-12-18 8:29:17
详细信息:
;=====dwakg.asm=====
;去掉了.data段的6个定义,加上了自动生成注册码功能,去除了错误提示。其余两个文件照旧。
.386
.model flat,stdcall
option casemap:none
include hd.h
_WinMain Proto :DWORD,:DWORD,:DWORD,:DWORD
Calculation Proto
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_SN equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
.data
MsgCap db "Dance Revlution for winamp 注册机 by WenXinJY",0
hInstance dd 0
UserLen dd 0
szFormat db "%i",0
UserID db 80 dup (0)
SN db 80 dup (0)
.radix 16
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _WinMain,NULL
invoke ExitProcess,NULL
_WinMain proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
invoke SetWindowText,hWnd,ADDR MsgCap
invoke SendDlgItemMessage,hWnd,IDC_SN,EM_SETREADONLY,TRUE,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
AND EAX,0FFFFH
CMP EAX,IDC_UN
JZ gENkEY
.IF lParam!=0
.if eax==ID_GEN
gENkEY:
invoke RtlZeroMemory,addr UserID,80
invoke RtlZeroMemory,addr SN,80
invoke GetDlgItemText, hWnd, IDC_UN, addr UserID, 80
.if eax!=NULL
mov UserLen,eax
invoke Calculation
invoke SetDlgItemText, hWnd, IDC_SN, addr SN
.endif
.elseif eax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif
.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_WinMain ENDP
Calculation Proc
pushad
lea esi,UserID
xor ebx,ebx
mov ecx,UserLen
mov ebp,ecx
shl ebp,1
Cal_Lop_1:
lodsb
xor bl,al ;don't change bl
loop Cal_Lop_1
xor esi,esi
Cal_Next:
cmp esi,8
jl Cal_Lab_0
cmp esi,ebp
jge Cal_Exit
Cal_Lab_0:
mov eax,esi
test eax,eax
jz Cal_Lab_1
dec eax
Cal_Lab_1:
mov edi,esi
shr edi,1 ;save
mov cl,SN[eax]
xor cl,bl
xor cl,8dh
mov bl,cl ;save
movzx eax,cl
mov ecx,3eh
cdq
idiv ecx
mov al,3Dh
sub al,dl
cmp al,9
jbe Cal_OK_11
cmp al,0ah+1ah ;10个数字+26个大写字母
jb Cal_OK_12
add al,'a'-(0a+1ah) ;转化为小写字母
jmp Cal_Lab_3
Cal_OK_11:
add al,'0' ;转化为数字
jmp Cal_Lab_3
Cal_OK_12:
add al,'A'-0ah ;转化为大写字母
Cal_Lab_3:
mov SN[esi],al
mov ecx,UserLen
sub ecx,edi
mov dl,UserID[ecx-1]
xor dl,al
xor dl,0d8h
movzx eax,dl
mov ecx,3eh
cdq
idiv ecx
mov al,3dh
sub al,dl
cmp al,9
jbe Cal_OK_21
cmp al,0ah+1ah ;10个数字+26个大写字母
jb Cal_OK_22
add al,'a'-(0a+1ah) ;转化为小写字母
jmp Cal_Lab_4
Cal_OK_21:
add al,'0' ;转化为数字
jmp Cal_Lab_4
Cal_OK_22:
add al,'A'-0ah ;转化为大写字母
Cal_Lab_4:
inc esi
mov SN[esi],al
inc esi
jmp Cal_Next
Cal_Exit:
popad
ret
Calculation Endp
End start
;======dfwakg.rc=========
#include <\masm32\include\resource.h>
#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_SN 1002
#define ID_GEN 1003
#define ID_EXIT 1004
2 icon key.ico
DLG_MAIN DIALOG 64,53,240,52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dance Revlution for winamp 注册机 by WenXinJY"
FONT 9, "宋体"
{
DEFPUSHBUTTON "注册", ID_GEN, 200, 8, 30, 14
PUSHBUTTON "退出", ID_EXIT, 200, 26, 30, 14
EDITTEXT IDC_UN, 40, 10, 150, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_SN, 40, 29, 150, 13, WS_BORDER | WS_TABSTOP
LTEXT "用户名:", -1, 8, 12, 30, 10
LTEXT "注册码:", -1, 8, 30, 30, 9
}
;========hd.h==========
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\advapi32.lib