?? regirstry.asm
字號:
.386
.model flat, stdcall
option casemap :none
; Include 文件定義
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
; Equ 等值定義
IDD_DIALOG_MAIN equ 101
IDC_EDIT_NAME equ 1000
IDC_EDIT_REGIRSTRY equ 1001
IDC_BUTTON_REGIRSTRY equ 1002
IDC_BUTTON_EXIT equ 1003
; 數據段
.data?
hInstance dd ? ;模塊句柄
hDlg dd ?
.const
szText db '請輸入用戶名',0
szCaption db 'Error',0
szFmtHex db "%lx",0
szFmtchar db '%s',0
; 代碼段
.code
;用戶名計算
RegirstryCal proc hWnd
local @szbuffer[1024]:byte
sub esp,104
push esi
push edi
invoke GetDlgItemText,hWnd,IDC_EDIT_NAME,addr @szbuffer,sizeof @szbuffer
lea esi,@szbuffer
mov edi,0047694Ch ;edi指向值為8B20244C,固定值,用來判斷用戶名長度是不是為零
push esi
call lstrlen
test eax,eax
jle Error ;用戶名長度為零?
push ebx
push ebp
mov ebp,esi ;ebp指向轉換后的用戶名
xor ecx,ecx
sub ebp,3
mov dword ptr ss:[esp+10h],ebp
mov esi,dword ptr ss:[esp+10h] ; esi=ebp-3
mov ebx,eax ; 用戶名長度-》ebx
jmp @loop1
jmp @loop
lea esp,dword ptr ss:[esp]
@loop:
mov ebp,dword ptr ss:[esp+10h] ; 循環計算用戶名
@loop1:
mov eax,92492493 ;
imul ecx ;
add edx,ecx
sar edx,3
mov eax,edx
shr eax,1Fh
add eax,edx
lea edx,dword ptr ds:[eax*8]
sub edx,eax
add edx,edx
mov eax,ecx
sub eax,edx
jnz @get
mov esi,27h
@get:
movzx edx,byte ptr ds:[ecx+ebp+3]; edx==取得用戶名每一位
lea eax,dword ptr ds:[ecx+3]
imul edx,esi ; 用戶名名每一位*esi
add edi,edx ; edi存放計算后的值
cdq ; edx設為eax最高為的值
mov ebp,0Eh
idiv ebp ; edx-eax除0e
test edx,edx ; 余數
je Zero ; 余數為零跳
lea esi,dword ptr ds:[esi+esi*2]
@@: add ecx,1
cmp ecx,ebx ; 比較用戶名計算完了嗎
jl @loop ; 循環計算
mov eax,edi
jmp _ret
Zero:
lea eax,dword ptr ds:[esi*8]
sub eax,esi
mov esi,eax
jmp @B
Error:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
xor eax,eax
_ret: pop ebp
pop ebx
pop edi
pop esi
ret
RegirstryCal endp
;計算結果進行轉換
Change proc
sub esp,10h
push esi
push eax ; /<%lX>
lea ecx,dword ptr ss:[esp+8] ; |
push offset szFmtHex ; |%lX
push ecx
mov esi,edi
call wsprintfA ; \wsprintfA
mov al,byte ptr ss:[esp+10h] ; 取得第一位注冊碼
add esp,0Ch
test al,al
je @zero
lea ecx,dword ptr ss:[esp+4]
sub ecx,edi
comp:
cmp al,38h ; 比較每一位是不是8,是8轉為B
je changeB
cmp al,42h ; 比較每一位是不是B,是B轉為8
je change8
result: mov byte ptr ds:[esi],al
mov al,byte ptr ds:[ecx+esi+1] ; 取得計算出的注冊碼的一位
add esi,1
test al,al
jnz comp ; 循環比較
@zero:
mov byte ptr ds:[esi],0
mov eax,edi ; 計算結果->edi
pop esi
add esp,10h
retn
change8:
mov al,38h
jmp result
changeB:
mov al,42h
jmp result
Change endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @szbuffer[1024]:byte
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDC_BUTTON_EXIT
invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
ret
.elseif ax == IDC_BUTTON_REGIRSTRY
invoke RegirstryCal,hWnd
call Change
invoke wsprintf,addr @szbuffer, offset szFmtchar,eax
invoke SetDlgItemText,hWnd,IDC_EDIT_REGIRSTRY,addr @szbuffer
ret
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,0
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_DIALOG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -