首页
社区
课程
招聘
看过就要学习――逆向Viruss刚上传的那个Crackme
发表于: 2006-7-31 19:06 5684

看过就要学习――逆向Viruss刚上传的那个Crackme

2006-7-31 19:06
5684

下载地址:(嗯,还是说一下)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  注册机资源脚本


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嗯嗯~早知道冲天剑要逆向我就把源码也发上来了......
2006-8-1 09:59
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
3
最初由 Viruss 发布
嗯嗯~早知道冲天剑要逆向我就把源码也发上来了......



早说过一定会完的!

啥东西到他手,源码基本跑不掉!
2006-8-1 14:47
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 冷血书生 发布

早说过一定会完的!

啥东西到他手,源码基本跑不掉!


那就更好了~什么时候给我一套Windows的源码,我只要核心的
2006-8-1 14:53
0
游客
登录 | 注册 方可回帖
返回
//