Win32汇编调试技巧
定位关键点有三种方法:过程函数、API调用和字符串匹配。根据具体情况选择合适的方法,因为不同程序可能适用不同的方法。
查看窗口控件信息
使用OllyDbg分析
OllyDbg可以帮助我们查看窗口控件的信息。
使用Spy++工具
Spy++也是查看窗口控件信息的一个好工具。
使用Visual Studio
通过Visual Studio打开程序,可以直接查看控件属性。
COM注册机分析
定位关键点
首先,通过程序弹出的窗口或字符串来定位关键点。在OllyDbg中查找字符串并设置断点。
寻找关键分支
找到关键点后,检查函数中的条件跳转指令,设置断点以确定程序执行的路径。
分析关键调用
检查关键分支附近的CALL指令,这些通常涉及校验算法。可以通过修改代码来验证其功能。
逆向工程校验算法
校验算法通常包含位操作和算术运算。通过分析代码片段,可以推测其功能并实现自己的版本。
mov eax, esi xor edx, edx mov ecx, 3 div ecx test edx, edx jnz L050 push 004640F8 lea ecx, dword ptr [esp+14] call 0042F273 L050: inc esi cmp esi, 9 jb L002
代码中存在一个全局字符串 "0123456789"。
通过观察CALL指令前后的变化,可以推测其功能。
实现注册码生成器
.386 .model flat, stdcall option casemap :none include Register.inc .data g_szUserName db 128 dup(0) g_szNumber db "0123456789", 0 g_szSerNumb db "6769-", 32 dup(0) g_ch db 2 dup(0) g_szGang db "-", 0 g_dwCnt dd 0 .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke InitCommonControls invoke DialogBoxParam, hInstance, IDD_DIALOG1, NULL, addr DlgProc, NULL invoke ExitProcess, 0 Make proc uses esi ecx edi ebx hWin:HWND LOCAL @dwCnt:DWORD invoke GetDlgItemText, hWin, EDT_USERNAME, offset g_szUserName, size g_szUserName mov g_dwCnt, eax push ebp xor esi, esi L002: lea ebp, g_szNumber or ecx, 0FFFFFFFFh mov edi, ebp xor eax, eax repne scas byte ptr es:[edi] not ecx dec ecx mov eax, esi xor edx, edx mov edi, ebp div ecx mov ecx, g_dwCnt mov eax, esi movsx ebx, byte ptr [edx+ebp] xor edx, edx div ecx movsx eax, byte ptr [edx + offset g_szUserName] lea edx, dword ptr [eax+eax*2] lea eax, dword ptr [eax+edx*4] mov edx, esi imul edx, esi imul edx, esi imul edx, ecx add ebx, eax or ecx, 0FFFFFFFFh xor eax, eax add ebx, edx repne scas byte ptr es:[edi] not ecx dec ecx mov eax, ebx xor edx, edx div ecx mov al, byte ptr [edx+ebp] mov g_ch, al invoke crt_strcat, offset g_szSerNumb, offset g_ch test esi, esi je L050 mov eax, esi xor edx, edx mov ecx, 3 div ecx test edx, edx jnz L050 invoke crt_strcat, offset g_szSerNumb, offset g_szGang L050: inc esi cmp esi, 9 jb L002 pop ebp invoke SetDlgItemText, hWin, EDT_SERNUMBER, offset g_szSerNumb ret Make endp DlgProc proc hWin:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov eax, uMsg .if eax == WM_INITDIALOG .elseif eax == WM_COMMAND mov eax, wParam .if ax == BTN_MAKE invoke Make, hWin .endif .elseif eax == WM_CLOSE invoke EndDialog, hWin, 0 .else mov eax, FALSE ret .endif mov eax, TRUE ret DlgProc endp end start
