1. CrackMe小程序Brad Soblesky.1.exe分析
首先尝试程序功能, 发现其会弹出一个对话框, 上面有字符串, 可以通过直接定位MessageBox的位置, 但这里使用搜索字符串的方法:
查找所有字符串:
追踪到后, 就可以发现一个非常清晰的结构:
发现是明文, 立马就可以找到对应的密钥
2. CrackMe小程序Brad Soblesky.2.exe
第二个CrackMe小程序, 发现其需要输入2个字符串, 然后得出结果:
搜索该字符串后定位到该函数的起始位置:
将输入的内容12345678的二级指针传到了ecx内, eax内获取长度, 与5进行对比, 确保用户名至少5个字节
将输入的内容12345678的二级指针传到了ecx内, 然后传入了该call内, 发现该call提取了其中的一个字符
其首先对比长度, 如果没有全部运算完, 调用GetCharInBuffer获取下一个字符然后继续进行运算
发现其最终运算完成后生成eax, 然后它将其作为参数传入了一个Format函数进行格式化。
最终获取了一串十进制字符串
最终进行对比后得出结论:
获取了最终的密码, 其第一个edit控件中传入的内容会经过运算最终会生成一段字符串, 这串字符串就是密钥
3. 注册机的编写
这里直接使用汇编语言编写:
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include KeyGen.inc
.data
g_szOriginString db 32 dup(0)
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG,NULL,addr DlgProc,NULL
invoke ExitProcess,0
GenPwd PROC stdcall hWnd:HWND
LOCAL @strOriginLen:DWORD
LOCAL @strOriginIdx:DWORD
LOCAL @dwFixVal:DWORD
invoke GetDlgItemText, hWnd, IDC_EDT_ORIGIN, offset g_szOriginString, size g_szOriginString
; 获取原字符串长度, 并初始化数组偏移
invoke lstrlen, offset g_szOriginString
mov @strOriginLen, eax
mov @strOriginIdx, 0
mov @dwFixVal, 81276345h
jmp short STARTLOOP
; 指向下一个字符
NEXTLOOP:
mov edx, @strOriginIdx
add edx, 1
mov @strOriginIdx, edx
STARTLOOP:
mov eax,@strOriginIdx
cmp eax, @strOriginLen
jge short ENDLOOP
mov ecx, @strOriginIdx
mov al, byte ptr g_szOriginString[ecx]
movsx edx,al
mov eax,@dwFixVal
add eax,edx
mov @dwFixVal, eax
mov ecx, @strOriginIdx
shl ecx, 8
mov edx, @dwFixVal
xor edx,ecx
mov @dwFixVal, edx
mov eax, @strOriginIdx
add eax, 1
mov ecx, @strOriginLen
imul ecx, @strOriginIdx
not ecx
imul eax,ecx
mov edx, @dwFixVal
imul edx,eax
mov @dwFixVal, edx
jmp short NEXTLOOP
ENDLOOP:
mov eax, @dwFixVal
invoke SetDlgItemInt, hWnd, IDC_EDT_PWD, eax, FALSE
ret
GenPwd 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 == IDC_BTN_GEN
invoke GenPwd, hWin
.endif
.elseif eax==WM_CLOSE
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
完成后的效果: