看过就要学习――逆向Viruss刚上传的那个Crackme
发表于:
2006-7-31 19:06
5684
看过就要学习――逆向Viruss刚上传的那个Crackme
下载地址:(嗯,还是说一下)http://bbs.pediy.com/showthread.php?s=&threadid=29885
使用工具:
反编译工具:IDA,Resource Hacker
程序开发包:MASM32 逆向汇编SDK程序的好处就是不需要懂高级语言的编译原理,呵呵,还是先列出IDA的分析
结果吧: ======================以下是代码====================
; enum Control_IDs
; 根据Resource Hacker分析资源得出
EDT_SERIAL = 3000
ID_CHECK = 3001
ID_EXIT = 3002
ID_VCTLEXIT = 32002 ; 代码段
; 主程序
public start
start proc near
push NULL ; lpModuleName
call GetModuleHandleA
mov hInstance, eax
push 0 ; dwInitParam
push offset _ProcDlgMain ; lpDialogFunc - 根据这个参数找到对话框过程
push NULL ; hWndParent
push offset szTplDlgMain ; "ADDialog"
push hInstance ; hInstance
call DialogBoxParamA
push eax ; uExitCode
call ExitProcess
start endp ; 对话框过程
; BOOL __stdcall ProcDlgMain(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
_ProcDlgMain proc near ; DATA XREF: start+Eo
hWnd = dword ptr 8
uMsg = dword ptr 0Ch
wParam = dword ptr 10h
lParam = dword ptr 14h
push ebp
mov ebp, esp
cmp [ebp+uMsg], WM_INITDIALOG
jnz short loc_40104F
push EDT_SERIAL ; nIDDlgItem
push [ebp+hWnd] ; hDlg
call GetDlgItem
push eax ; hWnd
call SetFocus ; 此调用似乎属于多此一举,
; 因为返回值为TRUE的话,
; Windows会将输入焦点设置到第一个
; 定义了WS_TABSTOP的控件上,
; 看资源就知道,这个控件正是EDT_SERIAL
jmp loc_401113
loc_40104F: ; CODE XREF: _ProcDlgMain+Aj
cmp [ebp+uMsg], WM_CLOSE
jnz short loc_40106E
push NULL ; lParam
push ID_VCTLEXIT ; wParam
push WM_COMMAND ; Msg
push [ebp+hWnd] ; hWnd
call SendMessageA
jmp loc_401113
loc_40106E: ; CODE XREF: _ProcDlgMain+28j
cmp [ebp+uMsg], WM_COMMAND
jnz loc_40110A
mov eax, [ebp+wParam]
cmp [ebp+lParam], NULL
jnz short loc_40109A
cmp ax, ID_VCTLEXIT
jnz loc_401113
push 0 ; nResult
push [ebp+hWnd] ; hDlg
call EndDialog
jmp short loc_401113
loc_40109A: ; CODE XREF: _ProcDlgMain+57j
mov edx, [ebp+wParam]
shr edx, 10h
or dx, dx ; 不支持加速键
jnz short loc_401108
cmp ax, ID_CHECK
jnz short loc_4010EE
push 7 ; nMaxCount
push offset szSerial ; lpString
push EDT_SERIAL ; nIDDlgItem
push [ebp+hWnd] ; hDlg
call GetDlgItemTextA
mov eax, offset szSerial
mov ebx, offset szUnlockCode ; "qWeRtZ"
mov ecx, 7
loc_4010CE: ; CODE XREF: _ProcDlgMain+ABj
mov dl, [ebx] ; 将szSerial与szUnlockCode逐字符进行比较
cmp [eax], dl
jnz short badboy ; 不相等则注册失败(没事发生)
inc eax
inc ebx
loop loc_4010CE ; 共比较7个字符
push MB_ICONINFORMATION ; uType
push offset szCaption ; "ArturDents CrackMe#1"
push offset szTxtRegSucc ; "Yeah, you did it!"
push [ebp+hWnd] ; hWnd
call MessageBoxA
badboy: ; CODE XREF: _ProcDlgMain+A7j
jmp short loc_401108
loc_4010EE: ; CODE XREF: _ProcDlgMain+7Ej
cmp ax, ID_EXIT
jnz short loc_401108
push NULL ; lParam
push ID_VCTLEXIT ; wParam
push WM_COMMAND ; Msg
push [ebp+hWnd] ; hWnd
call SendMessageA
loc_401108: ; CODE XREF: _ProcDlgMain+78j
; _ProcDlgMain:badboyj ...
jmp short loc_401113
loc_40110A: ; CODE XREF: _ProcDlgMain+4Aj
mov eax, FALSE
leave
retn 10h
loc_401113: ; CODE XREF: _ProcDlgMain+1Fj
; _ProcDlgMain+3Ej ...
mov eax, TRUE
leave
retn 10h
_ProcDlgMain endp ; 数据段
; char szTplDlgMain[]
szTplDlgMain db 'ADDialog',0 ; DATA XREF: start+15o
; char szCaption[]
szCaption db 'ArturDents CrackMe#1',0 ; DATA XREF: _ProcDlgMain+AFo
szUnlockCode db 'qWeRtZ',0 ; DATA XREF: _ProcDlgMain+99o
aNopeTryAgain db 'Nope, try again!',0
; char szTxtRegSucc[]
szTxtRegSucc db 'Yeah, you did it!',0 ; DATA XREF: _ProcDlgMain+B4o
aCrackme1 db 'Crackme #1',0
align 4
; HINSTANCE hInstance
hInstance dd 0 ; DATA XREF: start+7w start+1Ar
db 0
db 0
db 0
db 0
; char szSerial[]
szSerial db 1A4h dup(0) ; DATA XREF: _ProcDlgMain+82o
; _ProcDlgMain+94o end start
======================以上是代码====================
主程序还是那三个函数,不过这次对话框模板的ID不是数值了,换成了字符串。对话框过程中
值得一提的地方:
第一是当接收到WM_CLOSE消息或者Exit按钮被按下时,通常情况下都会直接调用
EndDialog,但是这个程序中却采用一种独特的方式:向对话框发送wParam为ID_VCTLEXIT(虚
拟控件)的WM_COMMAND消息,然后在这个虚拟控件消息的处理中才调用EndDialog。当然这不
是必须如此,不过考虑到这大概也算是程序的一点特色,在源代码中还是保留了下来。
第二是WM_INITDIALOG消息分支的处理过程,原程序的意图是想把输入焦点设置到序列号
输入框上,但是最后返回的值是TRUE,这就会让Windows把输入焦点设置到第一个定义了
WS_TABSTOP的控件上,而看一下资源脚本就知道,这个控件正是序列号输入框,所以设置焦点
的函数调用就显得多此一举了,在源代码中把这整个分支改成了一个nop指令。(不要这个分
支的话流程会转到.else部分的mov eax, FALSE; ret上去,不是我们的本意)
验证注册码的算法其实就是比较它跟一个固定的字符串"qWeRtZ"是否相等(原来如此!!
难怪有人都说不用看了……),因此可以搞个注册机条件汇编把这个串显示出来,就成为一个
对应的注册机了……
上传文件内容:1.asm 源文件(含注册机条件汇编)
1.rc 资源脚本
2.rc 注册机资源脚本
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: