好友
阅读权限30
听众
最后登录1970-1-1
|
h_one
发表于 2013-12-17 00:44
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
【文章标题】: 吾爱2013CM大赛解答--TempCrackme2013--Rookietp分析
【文章作者】:zxcfvasd
【作者主页】: 无
【操作平台】: win xp
【工具】 OD,IDA
【博客地址】http://honeblog.duapp.com/
ps:博客中有本Crackme,crc校验保护源码
详细分析:
此程序是MFC写的,所以对次下按钮事件断:
00402100 . 8379 20 7B cmp dword ptr ds:[ecx+0x20],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:[ecx+0x20],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:[ebp+0x10] ; |hInst
00406968 . FF15 B4575200 call dword ptr ds:[<&USER32.CreateDialog>; \CreateDialogIndirectParamW
0040623A |. FF75 08 push [arg.1] ; 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:[eax]
00406255 |. 8BC8 mov ecx,eax
00406257 |. FF92 74010000 call dword ptr ds:[edx+0x174]
关键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:[edx+0x174]就是通过RtlComputeCrc32函数对断点检查,我们直接可以将内部检查函数nop掉就好了
在这个过程中12fe60 保存的值一直都是窗口句柄值
之后让程序跑起来,发现12fe60让然没有改变看来只有爆破了
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|