【吾爱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让然没有改变看来只有爆破了
页:
[1]