本程序是在我阅读了
OllyDBG 入门系列(三)-函数参考 (http://bbs.pediy.com/showthread.php?s=&threadid=21330)
之后根据已知的分析结果用win32汇编实现的练习。
具体的分析方法在原文中已经有了非常详细的解释,这里仅给出具体的注册机实现代码。由于刚学破解,请笔下留情。
代码
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL @DriveType: DWORD
LOCAL @szVolumnName [128] : BYTE
LOCAL @szBuffer[128] : BYTE
pushad
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax==IDM_FILE_EXIT
invoke SendMessage,hWin,WM_CLOSE,0,0
.elseif eax==IDM_HELP_ABOUT
invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
.elseif eax == IDC_BTN1
;register
;为局部变量清零
push edi
mov ecx, 128
lea edi, @szVolumnName
mov al, 0
rep STOSB
pop edi
;获得卷轴属性
invoke GetDriveType, NULL
push eax
pop @DriveType
;获得卷轴名
invoke GetVolumeInformation, NULL, addr @szVolumnName, 128, \
NULL, NULL, NULL, NULL, NULL
;按照破解得到的算法进行解密
xor edi, edi
mov ecx, @DriveType
.repeat
mov eax, ecx
mov ebx, dword ptr @szVolumnName
mul ebx
add edi, eax
;dec ecx ;在反汇编后.untilcxz会自动递减ecx
.untilcxz
xor edi, 797a7553h
;将十六进制转换成十进制, Format被定义为db '%d'
invoke wsprintf, addr @szBuffer, addr Format, edi
;显示结果
invoke MessageBox, NULL, addr @szBuffer, addr Result, MB_OK
.endif
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
popad
xor eax,eax
ret
WndProc endp
LOCAL @DriveType: DWORD
LOCAL @szVolumnName [128] : BYTE
LOCAL @szBuffer[128] : BYTE
pushad
mov eax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax==IDM_FILE_EXIT
invoke SendMessage,hWin,WM_CLOSE,0,0
.elseif eax==IDM_HELP_ABOUT
invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
.elseif eax == IDC_BTN1
;register
;为局部变量清零
push edi
mov ecx, 128
lea edi, @szVolumnName
mov al, 0
rep STOSB
pop edi
;获得卷轴属性
invoke GetDriveType, NULL
push eax
pop @DriveType
;获得卷轴名
invoke GetVolumeInformation, NULL, addr @szVolumnName, 128, \
NULL, NULL, NULL, NULL, NULL
;按照破解得到的算法进行解密
xor edi, edi
mov ecx, @DriveType
.repeat
mov eax, ecx
mov ebx, dword ptr @szVolumnName
mul ebx
add edi, eax
;dec ecx ;在反汇编后.untilcxz会自动递减ecx
.untilcxz
xor edi, 797a7553h
;将十六进制转换成十进制, Format被定义为db '%d'
invoke wsprintf, addr @szBuffer, addr Format, edi
;显示结果
invoke MessageBox, NULL, addr @szBuffer, addr Result, MB_OK
.endif
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
popad
xor eax,eax
ret
WndProc endp
最后在使用的时候,只需要将该程序与待破解程序放在一起即可。