XiaoZi's CrackMe

来源:互联网 发布:琅琊榜2刘昊然 知乎 编辑:程序博客网 时间:2024/06/07 06:14

不知道是不是经验累积还是这个CrackMe太简单的关系?一下子就弄出来了

新手可以拿这个来练练

扫了一眼破文,说主要是anti

打开一下程序就把桌面给隐藏了。。总感觉像那种黑客恶作剧软件什么的

载入程序F9运行一下,会有一个内存访问异常(有一条指令往内存地址0处写数据)

00401564  |.  C700 01000000 mov     dword ptr [eax], 1

这条指令的上面有这样的设置异常处理程序的命令:

00401553  |> \68 00104000   push    00401000                         ; /pTopLevelFilter = XiaoZi'C.0040100000401558  |.  E8 F3000000   call    <jmp.&KERNEL32.SetUnhandledExcep>; \SetUnhandledExceptionFilter

就是说,你在401000这个位置下个断点,Shift+F9运行停到断点之后再跟踪找到返回地址就行了,在这里的异常处理程序里面有这样一句

0040100A  |.  C787 B8000000>mov     dword ptr [edi+B8], 0040156A

就是修改寄存器EIP40156A,那就在这个地址下个断点就可以继续走了(其实就是引发异常的下一条指令)

当然你也可以直接把引发异常的指令直接nop

一直F8单步。。直到这里的时候

004015C1  |.  6A 00         push    0                                ; /lParam = NULL004015C3  |.  68 56134000   push    00401356                         ; |DlgProc = XiaoZi'C.00401356004015C8  |.  6A 00         push    0                                ; |hOwner = NULL004015CA  |.  6A 01         push    1                                ; |pTemplate = 1004015CC  |.  FF35 70304000 push    dword ptr [403070]               ; |hInst = NULL004015D2  |.  E8 07000000   call    <jmp.&USER32.DialogBoxParamA>    ; \DialogBoxParamA

就是创建对话框的时候,程序异常,来到这样一个位置:

7C92E4FF    8B0424          mov     eax, dword ptr [esp]7C92E502    8BE5            mov     esp, ebp7C92E504    5D              pop     ebp7C92E505    C3              retn

返回到程序领空是这个样子:

00401184      E8 79040000   call    <jmp.&KERNEL32.CloseHandle>      ; \CloseHandle00401189      FF35 6C304000 push    dword ptr [40306C]               ; /hObject = NULL0040118F  |.  E8 6E040000   call    <jmp.&KERNEL32.CloseHandle>      ; \CloseHandle00401194  |.  C9            leave

在call一个CloseHandle的时候死掉,很显然是因为句柄值无效

再看看上面的代码,似乎都是在做坏事(anti),所以把滚动条拉倒最上面Ctrl+F查找所有”call 40101E”(40101E这个地方是专门做坏事的。。),然后逐个nop(一共有两个)

其中一个附近还有一个call

0040142B  |.  E8 EEFBFFFF   call    0040101E00401430  |.  E8 CCFEFFFF   call    00401301

所谓近朱者赤 近墨者黑啊,也进去看看吧

00401301  /$  B8 74124000   mov     eax, 0040127400401306  |.  A3 90384000   mov     dword ptr [403890], eax0040130B  |.  8B18          mov     ebx, dword ptr [eax]0040130D  |.  66:81FB 753A  cmp     bx, 3A7500401312  |.  74 41         je      short 0040135500401314  |.  68 94384000   push    00403894                            ; /pOldProtect = anti.0040389400401319  |.  6A 40         push    40                                  ; |NewProtect = PAGE_EXECUTE_READWRITE0040131B  |.  6A 10         push    10                                  ; |Size = 10 (16.)0040131D  |.  FF35 90384000 push    dword ptr [403890]                  ; |Address = anti.0040127C00401323  |.  E8 2E030000   call    <jmp.&KERNEL32.VirtualProtect>      ; \VirtualProtect00401328  |.  A1 90384000   mov     eax, dword ptr [403890]0040132D  |.  BB 753A0000   mov     ebx, 3A7500401332  |.  66:8918       mov     word ptr [eax], bx00401335  |.  B8 7C124000   mov     eax, 0040127C0040133A  |.  A3 90384000   mov     dword ptr [403890], eax0040133F  |.  8B18          mov     ebx, dword ptr [eax]00401341  |.  66:81FB 7532  cmp     bx, 327500401346  |.  74 0D         je      short 0040135500401348  |.  A1 90384000   mov     eax, dword ptr [403890]0040134D  |.  BB 75320000   mov     ebx, 327500401352  |.  66:8918       mov     word ptr [eax], bx00401355  \>  C3            retn

在这里动态修改了验证密码部分的代码(只改了很少,不是整个算法改掉)

但是调试看来je(如果不实现的话就会修改)很少会不实现,以防万一还是改为jmp

破解方面就不说了,手法比较简单,断点MessageBoxA就可以到达验证密码的算法位置了