h_one 发表于 2013-12-17 00:44

【吾爱2013CM大赛解答】--TempCrackme2013--Rookietp分析

【文章标题】: 吾爱2013CM大赛解答--TempCrackme2013--Rookietp分析
【文章作者】:zxcfvasd
【作者主页】: 无
【操作平台】: win xp
【工具】 OD,IDA
【博客地址】http://honeblog.duapp.com/
ps:博客中有本Crackme,crc校验保护源码

详细分析:
此程序是MFC写的,所以对次下按钮事件断:

00402100   .8379 20 7B    cmp dword ptr ds:,0x7B   
00402104      75 0E       jnz XTempCrac.00402114   这是程序的关键跳,将nop掉就可以爆破成功了。
00402106   .6A 00         push 0x0
00402108   .6A 00         push 0x0
0040210A   .68 28F85400   push TempCrac.0054F828
0040210F   .E8 9F030000   call TempCrac.004024B3
00402114   >C3            retn


但是怎么不爆破也成功注册啊,,我就跟了下程序
cmp dword ptr ds:,0x7B   12fe60 保存的值是怎么得到的喃?
发现在让程序跑起后下断,程序就退出了。我就猜测肯定是在WM_INITDIALOG消息处理中断点检查(或CRC32)

对于mfc程序我想最关键的就是跟中到WM_INITDIALOG处理,和按钮事件函数了
MFC中寻找OnInitDialog
1,可以使用IDA静态分析,在左边FuntionName窗口输入CDialog::OnInit定位
2,直接在OD里ctrl+n 找到CreateDialogIndirectParam完成非模态对话框的创建,之后找到DlgPrco函数
这里我用第二种放法
0040695D   > \53            push ebx                                 ; /lParam
0040695E   .68 2C624000   push TempCrac.0040622C                   ; |pDlgProc = TempCrac.0040622C 转到反汇编
00406963   .50            push eax                                 ; |hOwner
00406964   .57            push edi                                 ; |pTemplate
00406965   .FF75 10       push dword ptr ss:             ; |hInst
00406968   .FF15 B4575200 call dword ptr ds:[<&USER32.CreateDialog>; \CreateDialogIndirectParamW

0040623A|.FF75 08       push                            ;HWND   次句发现12fe60 保存的值是窗口句柄,
0040623D|.E8 44740000   call TempCrac.0040D686
00406242|.50            push eax
00406243|.68 30665200   push TempCrac.00526630
00406248|.E8 5EB90000   call TempCrac.00411BAB
0040624D|.59            pop ecx
0040624E|.59            pop ecx
0040624F|.85C0          test eax,eax
00406251|.74 0C         je XTempCrac.0040625F
00406253|.8B10          mov edx,dword ptr ds:
00406255|.8BC8          mov ecx,eax
00406257|.FF92 74010000 call dword ptr ds:

关键call,,利RtlComputeCrc32函数对断点检查
0040625D|.EB 07         jmp XTempCrac.00406266
00401193|.68 4CF45400   push TempCrac.0054F44C                   ; /FileName = "ntdll.dll"
00401198|.FF15 FC535200 call dword ptr ds:[<&KERNEL32.LoadLibrar>; \LoadLibraryW
0040119E|.68 7CF45400   push TempCrac.0054F47C                   ; /ProcNameOrOrdinal = "RtlComputeCrc32"
004011A3|.50            push eax                                 ; |hModule
004011A4|.FF15 28545200 call dword ptr ds:[<&KERNEL32.GetProcAdd>; \GetProcAddress
004011AA|.68 27010000   push 0x127      检测大小
004011AF|.68 00104000   push TempCrac.00401000检查地址
004011B4|.8BF0          mov esi,eax
004011B6|.6A 00         push 0x0
004011B8|.FFD6          call esi
004011C6|.3D 71196895   cmp eax,0x95681971
004011CB      74 07       je XTempCrac.004011D4   将je,给成jmp 就可以了
004011CD|.6A FF         push -0x1                              ; /ExitCode = FFFFFFFF (-1.)
004011CF|.FFD3          call ebx                                 ; |[GetCurrentProcess
004011D1|.50            push eax                                 ; |hProcess
004011D2|.FFD7          call edi                                 ; \TerminateProcess
004011D4|>68 27010000   push 0x127
004011D9|.68 40104000   push TempCrac.00401040
004011DE|.6A 00         push 0x0
004011E0|.FFD6          call esi
004011E2|.3D 84DC625E   cmp eax,0x5E62DC84
004011E7      74 07         je XTempCrac.004011F0
CRC检查还没完,之后创建线程对代码块,和Kernel32.dl模块进行断点检查,具体实现代码请见博客

004011F6|.6A 00         push 0x0                                 ; /pModule = NULL
004011F8|.FFD6          call esi                                 ; \GetModuleHandleW
004011FA|.50            push eax
004011FB|.E8 50FEFFFF   call TempCrac.00401050
00401200|.83C4 04       add esp,0x4
00401203|.68 60F45400   push TempCrac.0054F460                   ;UNICODE "kernel32.dll"
00401208|.FFD6          call esi
0040120A|.50            push eax
0040120B|.E8 40FEFFFF   call TempCrac.00401050
00401210|.83C4 04       add esp,0x4   全部nop 不进行CRC校验


进过分析00406257|.FF92 74010000 call dword ptr ds:就是通过RtlComputeCrc32函数对断点检查,我们直接可以将内部检查函数nop掉就好了

在这个过程中12fe60 保存的值一直都是窗口句柄值
之后让程序跑起来,发现12fe60让然没有改变看来只有爆破了




Ylca 发表于 2013-12-17 01:21

页: [1]
查看完整版本: 【吾爱2013CM大赛解答】--TempCrackme2013--Rookietp分析