好友
阅读权限40
听众
最后登录1970-1-1
|
Chief
发表于 2012-4-30 15:14
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
本帖最后由 Chief 于 2013-1-5 22:57 编辑
【文章标题】: 吾爱破解2012CM大赛破文-willJ
【文章作者】: Chief
【作者邮箱】: hi_Chief@163.com
【下载地址】: http://down.52pojie.cn/2012CM/%E6%98%93/willJ/
【作者声明】: 失误之处敬请诸位大侠赐教!
【难度】: 易
--------------------------------------------------------------------------------
【详细过程】
F9运行--输入假码--提示错误。
F12暂停-Alt+k----来到如下位置。
地址 堆栈 函数过程 / 参数 调用来自 结构
0012F930 77D19418 包含ntdll.KiFastSystemCallRet user32.77D19416 0012F964
0012F934 77D2770A user32.WaitMessage user32.77D27705 0012F964
0012F968 77D249C4 user32.77D2757B user32.77D249BF 0012F964
0012F990 77D24A06 user32.77D2490E user32.77D24A01 0012F98C
0012F9B0 77D3B190 user32.DialogBoxIndirectParamAorW user32.77D3B18B 0012F9AC
0012F9DC 00401327 user32.DialogBoxParamA willJ.00401321 0012F9D8
0012F9E0 00400000 hInst = 00400000
0012F9E4 00000079 pTemplate = 79
0012F9E8 000B07E0 hOwner = 000B07E0 ('吾爱2012CM大赛
0012F9EC 00401060 DlgProc = willJ.00401060
0012F9F0 00000000 lParam = NULL
0012FA84 77D18734 包含willJ.00401327 user32.77D18731
0012FAB0 77D23CE4 ? user32.77D1870C user32.77D23CDF
0012FB1C 77D23B30 ? user32.77D23C2F user32.77D23B2B 0012FB18
0012FB64 77D3E599 user32.77D23AB1 user32.77D3E594 0012FB60
0012FB80 77D18734 包含user32.77D3E599 user32.77D18731 0012FB7C
0012FBAC 77D18816 ? user32.77D1870C user32.77D18811 0012FBA8
0012FBB0 77D3E577 包含user32.77D18816 user32.77D3E571 0012FC10
地址:0012F9DC 右键-显示调用。
来到
004012E6 > \8D5424 28 lea edx,dword ptr ss:[esp+0x28]
004012EA . 52 push edx ; /String2
004012EB . 68 E4754000 push willJ.004075E4 ; |String1 = willJ.004075E4
004012F0 . FF15 00604000 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
004012F6 . 68 E8030000 push 0x3E8 ; /ControlID = 3E8 (1000.)
004012FB . 56 push esi ; |hWnd
004012FC . FF15 D4604000 call dword ptr ds:[<&USER32.GetDlgItem>] ; \GetDlgItem
00401302 > 50 push eax ; /hWnd
00401303 . FF15 BC604000 call dword ptr ds:[<&USER32.SetFocus>] ; \SetFocus
00401309 . 6A 00 push 0x0 ; /BeepType = MB_OK
0040130B . FF15 C0604000 call dword ptr ds:[<&USER32.MessageBeep>>; \MessageBeep
00401311 . A1 E0754000 mov eax,dword ptr ds:[0x4075E0]
00401316 . 6A 00 push 0x0 ; /lParam = NULL
00401318 . 68 60104000 push willJ.00401060 ; |DlgProc = willJ.00401060
0040131D . 56 push esi ; |hOwner
0040131E . 6A 79 push 0x79 ; |pTemplate = 79
00401320 . 50 push eax ; |hInst => 00400000
00401321 . FF15 E0604000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
00401327 . 5D pop ebp
00401328 . 5B pop ebx
00401329 . 5F pop edi
0040132A . B8 01000000 mov eax,0x1
0040132F . 5E pop esi
00401330 . 81C4 80000000 add esp,0x80
正常手法,往上找看看头没有跳转跳过这个错误.
我们发现这个
00401232 . 3D B80B0000 cmp eax,0xBB8
00401237 0F87 FC000000 ja willJ.00401339 -----------------这个能跳过那个CALL。
0040123D . 8B5424 10 mov edx,dword ptr ss:[esp+0x10]
00401241 . 8D4C24 40 lea ecx,dword ptr ss:[esp+0x40]
00401245 . 51 push ecx
00401246 . 50 push eax
00401247 . 8B4424 1C mov eax,dword ptr ss:[esp+0x1C]
0040124B . 53 push ebx
0040124C . 55 push ebp
0040124D . 52 push edx
-----------------------------------
00401237 0F87 FC000000 ja willJ.00401339
既然这个显示能跳过,我们来试下,F2下断---运行--输入假码--点确定---这时断下。
跳转没实现,ja修改为jmp无条件跳转试下。
F8单步,来到
00401339 > \8D4C24 28 lea ecx,dword ptr ss:[esp+0x28]
0040133D . 51 push ecx ; /String2
0040133E . 68 E4754000 push willJ.004075E4 ; |String1 = willJ.004075E4
00401343 . FF15 00604000 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00401349 . 68 E8030000 push 0x3E8 ; /ControlID = 3E8 (1000.)
0040134E . 56 push esi ; |hWnd
0040134F . FF15 D4604000 call dword ptr ds:[<&USER32.GetDlgItem>] ; \GetDlgItem
00401355 . 50 push eax ; /hWnd
00401356 . FF15 BC604000 call dword ptr ds:[<&USER32.SetFocus>] ; \SetFocus
0040135C . 6A 00 push 0x0 ; /BeepType = MB_OK
0040135E . FF15 C0604000 call dword ptr ds:[<&USER32.MessageBeep>>; \MessageBeep
00401364 . 8B15 E0754000 mov edx,dword ptr ds:[0x4075E0] ; willJ.00400000
0040136A . 6A 00 push 0x0 ; /lParam = NULL
0040136C . 68 60104000 push willJ.00401060 ; |DlgProc = willJ.00401060
00401371 . 56 push esi ; |hOwner
00401372 . 6A 79 push 0x79 ; |pTemplate = 79
00401374 . 52 push edx ; |hInst => 00400000
00401375 . FF15 E0604000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
0040137B . 5D pop ebp
0040137C . 5B pop ebx
0040137D . 5F pop edi
0040137E . B8 01000000 mov eax,0x1
00401383 . 5E pop esi
00401384 . 81C4 80000000 add esp,0x80
有没有发现这些代码有什么问题?没错跟上面的错误CALL同样的代码。----我们试试,继续单步。
额,到00401375 . FF15 E0604000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
就出错误CALL。
---------------------------------
看来这个跳转不是关键,别灰心,我们继续返回去找看看。
既然那个跳转不行,继续找。
来到这里。就是刚才那个ja的下面。
00401254 . 8B3D D4604000 mov edi,dword ptr ds:[<&USER32.GetDlgIte>; user32.GetDlgItem
0040125A . 83C4 18 add esp,0x18
0040125D . 85C0 test eax,eax
0040125F . 74 6B je XwillJ.004012CC
00401261 . 8D4C24 18 lea ecx,dword ptr ss:[esp+0x18]
00401265 . 51 push ecx ; /String2
00401266 . 68 E4754000 push willJ.004075E4 ; |String1 = willJ.004075E4
0040126B . FF15 00604000 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
00401271 . 6A 00 push 0x0 ; /Enable = FALSE
00401273 . 6A 6E push 0x6E ; |/ControlID = 6E (110.)
00401275 . 56 push esi ; ||hWnd
00401276 . FFD7 call edi ; |\GetDlgItem
00401278 . 8B1D B8604000 mov ebx,dword ptr ds:[<&USER32.EnableWin>; |user32.EnableWindow
0040127E . 50 push eax ; |hWnd
0040125F . 74 6B je XwillJ.004012CC--------这个跳转可疑,很大面积的跳转。
慢慢来,一个个来试。继续F2下断。运行--输入假码--确定---断下。
我们发现跳转实现,我们让他不跳试试。
nop掉。
F8单步往下走。
004012CA . /EB 36 jmp XwillJ.00401302
004012CC > |8D5424 28 lea edx,dword ptr ss:[esp+0x28]
004012D0 . |52 push edx ; /String2
004012D1 . |68 E4754000 push willJ.004075E4 ; |String1 = willJ.004075E4
004012D6 . |FF15 00604000 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
004012DC . |68 E8030000 push 0x3E8
004012E1 . |56 push esi
004012E2 . |FFD7 call edi
到这里,JMP 无条件跳转。
继续往下。
还是来到
004012E6 > \8D5424 28 lea edx,dword ptr ss:[esp+0x28]
004012EA . 52 push edx ; /String2
004012EB . 68 E4754000 push willJ.004075E4 ; |String1 = willJ.004075E4
004012F0 . FF15 00604000 call dword ptr ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA
004012F6 . 68 E8030000 push 0x3E8 ; /ControlID = 3E8 (1000.)
004012FB . 56 push esi ; |hWnd
004012FC . FF15 D4604000 call dword ptr ds:[<&USER32.GetDlgItem>] ; \GetDlgItem
00401302 > 50 push eax ; /hWnd
00401303 . FF15 BC604000 call dword ptr ds:[<&USER32.SetFocus>] ; \SetFocus
00401309 . 6A 00 push 0x0 ; /BeepType = MB_OK
0040130B . FF15 C0604000 call dword ptr ds:[<&USER32.MessageBeep>>; \MessageBeep
00401311 . A1 E0754000 mov eax,dword ptr ds:[0x4075E0]
00401316 . 6A 00 push 0x0 ; /lParam = NULL
00401318 . 68 60104000 push willJ.00401060 ; |DlgProc = willJ.00401060
0040131D . 56 push esi ; |hOwner
0040131E . 6A 79 push 0x79 ; |pTemplate = 79
00401320 . 50 push eax ; |hInst => 00400000
00401321 . FF15 E0604000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
00401327 . 5D pop ebp
00401328 . 5B pop ebx
00401329 . 5F pop edi
0040132A . B8 01000000 mov eax,0x1
0040132F . 5E pop esi
00401330 . 81C4 80000000 add esp,0x80
我们发现提示成功了。
错误+成功都调用这个CALL。
00401321 . FF15 E0604000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA
那毫无疑问
0040125F /74 6B je XwillJ.004012CC
就是这个CM的关键跳。
Ps:小菜哪里不对,还望指点,当然觉得还可以的,加分我是不会拒绝的。
还有 willJ的头像很强悍的。
附上录像一份,录像只是快速演示而已。
录像下载地址:http://dl.dbank.com/c041wmb2dp
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Chief, 转载可以随便改,只要对你们有帮助就好。
2012年04月30日 15:06:32
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|