今天补上,小球兄满意否,给点鼓励,我可是菜鸟,不要让菜鸟哭泣。。。 (6千字)
昨天晚上没有详细写出,今天补上,希望对初学者有所帮助第一步:注册算法分析,关键部分如下:
0167:01301313 JNL 01301360 ****-> 开始注意了,以下为注册码计算部分
0167:01301315 MOV EAX,[EBP-10]****->顺序取取注册名每个字母
0167:01301318 LEA EDI,[ECX+01]****->初始化EDI,1,以后顺序加1,设为n(n=1,2...)
0167:0130131B MOV BL,[EAX]
0167:0130131D MOVSX ESI,BL
0167:01301320 MOV EAX,ESI ****->ESI=EDI=取出注册名 设为X
0167:01301322 MOV EBX,4B
0167:01301327 IMUL ESI
0167:01301329 IMUL ESI ****->X三次方
0167:0130132B LEA EDX,[ECX+01]
0167:0130132E IMUL EDX,EDI
0167:01301331 SUB EAX,EDX
0167:01301333 LEA EDX,[ECX+01] ****->减n平方
0167:01301336 IMUL EDX,ESI
0167:01301339 SUB EAX,EDX ****->减n*X
0167:0130133B INC ECX
0167:0130133C MOV [EBP-0C],EAX
0167:0130133F MOV EAX,[EBP-0C]
0167:01301342 CDQ
0167:01301343 XOR EAX,EDX ****-> 与0 XOR
0167:01301345 SUB EAX,EDX
0167:01301347 CDQ
0167:01301348 IDIV EBX
0167:0130134A MOV EAX,EDX ****->除0x4b,取余送eax
0167:0130134C MOV EDX,[EBP-14]
0167:0130134F ADD AL,30 ****->加0x30
0167:01301351 MOV [EDX],AL ****->保存
0167:01301353 INC DWORD [EBP-14]
0167:01301356 INC DWORD [EBP-10]
0167:01301359 MOV EAX,[EBP-08]
0167:0130135C CMP ECX,EAX
0167:0130135E JL 01301315 ****->循环处理每一个字母
第二步:构造GUI接口,以后写注册机可以用它作为模板
;cr_yj.rc******************************
#include <c:\masm32\include\resource.h>
#define DLG_MAIN 1000
#define IDC_UN 1001
#define IDC_REG 1002
#define ID_GEN 1003
#define ID_EXIT 1004
DLG_MAIN DIALOG 64, 53, 204, 52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "易经八卦彩票占卜程序.V6.3 Asm Keygen by Hume"
FONT 8, "MS Sans Serif"
{
DEFPUSHBUTTON "GENERATE", ID_GEN, 148, 6, 50, 14
PUSHBUTTON "EXIT", ID_EXIT, 148, 24, 50, 14
EDITTEXT IDC_UN, 52, 10, 78, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_REG, 52, 29, 78, 13, WS_BORDER | WS_TABSTOP
LTEXT "USERNAME:", -1, 8, 12, 40, 10
LTEXT "REG CODE:", -1, 8, 30, 41, 9
}
;hd.h****************************************head include files
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\comctl32.inc
include c:\masm32\include\comdlg32.inc
include c:\masm32\include\shell32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\gdi32.lib
includelib c:\masm32\lib\comctl32.lib
includelib c:\masm32\lib\comdlg32.lib
includelib c:\masm32\lib\shell32.lib
;cr_yj.asm******************************
.386
.model flat,stdcall
option casemap:none
include hd.h
_ProcDlg proto :DWORD,:DWORD,:DWORD,:DWORD
;->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>data seg
.data
User db 80 dup(0)
Serial db 80 dup(0)
Count dd 0
adsn dd 0
MsgMesaage1 db "Must input Usernmae in oder to generate Reg Code! ",0
MsgCap db "By (C)hume,July,2001",0
.data?
hInstance HANDLE ?
.const
DLG_MAIN equ 1000
IDC_UN equ 1001
IDC_REG equ 1002
ID_GEN equ 1003
ID_EXIT equ 1004
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>code seg
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlg,0
invoke ExitProcess,NULL
_ProcDlg 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_COMMAND
mov eax,wParam
.IF lParam!=0
.if ax==ID_GEN ;generate按钮按下时的处理
invoke RtlZeroMemory,addr User,80
invoke RtlZeroMemory,addr Serial,80
invoke GetDlgItemText,hWnd,IDC_UN,addr User,80
.if eax!=NULL
mov Count,eax
call Cal ;注册码生成子程序
invoke SetDlgItemText,hWnd,IDC_REG,addr Serial
.else
invoke MessageBox,NULL,addr MsgMesaage1,addr MsgCap,MB_OK or MB_ICONEXCLAMATION ;错误处理
.endif
.elseif ax==ID_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
.endif
.ENDIF
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlg ENDP
第三步:拷贝这部分代码,去掉前面的地址,构造Cal子程序:
稍微修改一下这部分代码,使之能够从数据部分取数,计算注册码,小写代码为改动部分
Cal PROC uses eax ebx
xor edx,edx
mov ecx,0
lea ebx,Serial
mov adsn,ebx
lopcal: LEA EDI,[ECX+01]
lea eax,User
add eax,ecx
MOV BL,[EAX]
MOVSX ESI,BL
MOV EAX,ESI
MOV EBX,4Bh
IMUL ESI
IMUL ESI
LEA EDX,[ECX+01]
IMUL EDX,EDI
SUB EAX,EDX
LEA EDX,[ECX+01]
IMUL EDX,ESI
SUB EAX,EDX
INC ECX
CDQ
XOR EAX,EDX
SUB EAX,EDX
CDQ
IDIV EBX
MOV EAX,EDX
ADD AL,30h
mov ebx,adsn
add ebx,ecx
dec ebx
MOV [ebx],AL
inc ebx
inc eax
CMP ECX,Count
JL lopcal ;//比较循环是否结束循环,计算
ToEit: ret
Cal endp
;-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end all
end start
第四步:编译,我用MASM32 V6编译,如果环境不同路径需要作部分修改
;mk.bat
cls
c:\masm32\bin\ml /c /coff /Cp yj.asm
rc /v yj.rc
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib yj.obj yj.res
第五步:享受成果,编译文件只有3k,没有进行压缩处理,执行速速飞快,win界面,dos界面总使人感觉与时代脱节,注册机在本人机器上运行正常,不知程序是否有BUG?调试真是比破解还累啊
第六步:总结
本人实在菜鸟一个,告诉菜鸟们一个秘诀,拿简单的开刀,使自己也变成老鸟!
付诗几句:
人生得意须尽欢,莫使金樽空对月!
仰天大笑出门去,我辈岂是蓬蒿人!
Hume,10/7,2001
