OllyDBG 入门系列(三)-函数参考 之 注册机的实现

本程序是在我阅读了

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

最后在使用的时候,只需要将该程序与待破解程序放在一起即可。

原文地址:https://www.cnblogs.com/aicro/p/1802315.html