好友
阅读权限10
听众
最后登录1970-1-1
|
炫火
发表于 2014-4-6 01:35
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
本帖最后由 炫火 于 2014-4-6 11:29 编辑
原CM地址:http://www.52pojie.cn/thread-249754-1-1.html
前天听lance大叔说 发思路有丰厚回报,这大半夜的刚过完清明闲着甚是蛋疼,于是乎就想起了Amaya° 大大的那个cm,说不定能混点cb,嘿嘿。。。
这个Amaya° 的新的cm里(指4月5号的cm)正常运行无状况,但是载入OD运行就会出现内存异常,貌似不少朋友用的是易语言的万能事件解决了,我觉得吧,这种万能断点能少用则少用的好,要不脱离了易语言很可能会突然觉得身心疲惫。
进入正题,首先看看这个cm的大致一个情况,大概就这么个样子。刚刚发现这东西还有禁止重复运行的神技。吓尿。
了解界面后就可以载入OD了,载入OD后发现是VC++的入口点,这样的话一般来说就是无壳程序
我们直接F9运行,发现内存错误了出现了这么一个东西。请仔细看图,我们看到了一个异常位移的数据,这个很有可能就是关键地方,
先把他记录下来:000070c3
于是乎,我们重载程序,把刚刚记录下来的位移加上基地址00400000得到004070c3,然后搜索这个地址,发现这么个地方
此时我们在代码的段首下个CC断点,然后F9运行,发现程序停在了这里(刚发现这antiod有时还不灵),这时我们看到堆栈
0012FB28 004072B8 RETURN to CM更新.004072B8 from CM更新.00407080
0012FB2C 0012FB50
0012FB30 00000003
0012FB34 0012FB64
0012FB38 00000000
0012FB3C 00000000
0012FB40 0041EDD1 RETURN to CM更新.0041EDD1
0012FB44 0012FB50
0012FB48 00000003
0012FB4C 0012FB64
0012FB50 00000000
0012FB54 00000000
0012FB58 00000000
0012FB5C 00404D23 RETURN to CM更新.00404D23 from CM更新.00406A7E
我们看见堆栈的这一条信息0012FB5C 00404D23 RETURN to CM更新.00404D23 from CM更新.00406A7E,经验告诉我们00404D23这个地址最接近antiod的代码段,于是我们搜索这个地址
来到这个地址后我们向上翻,会发现一大堆垃圾代码,不用理,一直找到段首(我算了下时间,这段首找了我两分钟)
00401CB4 $ 55 push ebp
00401CB5 . 8BEC mov ebp,esp
00401CB7 . 81EC 5C000000 sub esp,0x5C
00401CBD . 68 08000000 push 0x8
00401CC2 . E8 B14D0000 call 00406A78
00401CC7 . 83C4 04 add esp,0x4
00401CCA . 8945 FC mov dword ptr ss:[ebp-0x4],eax
00401CCD . 8BF8 mov edi,eax
00401CCF . BE 15ED4600 mov esi,0046ED15
00401CD4 . AD lods dword ptr ds:[esi]
00401CD5 . AB stos dword ptr es:[edi]
00401CD6 . AD lods dword ptr ds:[esi]
00401CD7 . AB stos dword ptr es:[edi]
00401CD8 . C745 F8 00000>mov dword ptr ss:[ebp-0x8],0x0
00401CDF . C745 F4 00000>mov dword ptr ss:[ebp-0xC],0x0
00401CE6 . C745 F0 00000>mov dword ptr ss:[ebp-0x10],0x0
00401CED . 68 00000000 push 0x0
00401CF2 . B8 01000000 mov eax,0x1
00401CF7 . BB 70D44400 mov ebx,0044D470
00401CFC . E8 954D0000 call 00406A96
这里就是段首了,大家可以考虑花时间翻一下,甚是坑。我们在00401CB4 $ 55 push ebp这里下CC断点后再次重载
再次F9运行后会发现断在00401CB4 $ 55 push ebp这里了,初步可以确定这里的就是ANTIOD的代码段,我们在这里尝试将其汇编为retn
然后运行,发现窗口被加载出来了,ANTI的部分就算解决了
接下来,我们在GetWindowTextA这个函数段首下断点,直接单击按钮,发现能断在断点上,我们返回程序领空,单步走几步后回到关键代码处(前面经过的大多数是易语言神一般的封装)
004014D1 . 83C4 10 add esp,0x10
004014D4 . 8945 FC mov dword ptr ss:[ebp-0x4],eax
004014D7 . 68 14ED4600 push 0046ED14
004014DC . FF75 FC push dword ptr ss:[ebp-0x4]
004014DF . E8 27FBFFFF call 0040100B
004014E4 . 83C4 08 add esp,0x8
004014E7 . 83F8 00 cmp eax,0x0
004014EA . B8 00000000 mov eax,0x0
004014EF . 0F94C0 sete al
004014F2 . 8945 F8 mov dword ptr ss:[ebp-0x8],eax
004014F5 . 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
004014F8 . 85DB test ebx,ebx
004014FA . 74 09 je short 00401505
004014FC . 53 push ebx
004014FD . E8 70550000 call 00406A72
00401502 . 83C4 04 add esp,0x4
00401505 > 837D F8 00 cmp dword ptr ss:[ebp-0x8],0x0
00401509 . 0F84 05000000 je 00401514
0040150F . E9 B4060000 jmp 00401BC8
00401514 > EB 07 jmp short 0040151D
我们单步到00401509 . 0F84 05000000 je 00401514这个跳转,发现跳转条件未实现,再看看0040150F . E9 B4060000 jmp 00401BC8这个跳转,发现他直接跳过了所有代码,初步断定这里检测了字符是否为空,于是就把00401509 . 0F84 05000000 je 00401514这里改成jmp
接着再次经过一大堆垃圾代码后,我们把目光停在这里
0040191C . 6A FF push -0x1
0040191E . 6A 08 push 0x8
00401920 . 68 02000116 push 0x16010002
00401925 . 68 01000152 push 0x52010001
0040192A . E8 5B510000 call 00406A8A
0040192F . 83C4 10 add esp,0x10
00401932 . 8945 FC mov dword ptr ss:[ebp-0x4],eax
00401935 . 68 02000080 push 0x80000002
0040193A . 6A 00 push 0x0
0040193C . 68 00000000 push 0x0
00401941 . 6A 00 push 0x0
00401943 . 6A 00 push 0x0
00401945 . 6A 00 push 0x0
00401947 . 68 04000080 push 0x80000004
0040194C . 6A 00 push 0x0
0040194E . 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00401951 . 85C0 test eax,eax
00401953 . 75 05 jnz short 0040195A
00401955 . B8 14ED4600 mov eax,0046ED14
0040195A > 50 push eax
0040195B . 68 04000080 push 0x80000004
00401960 . 6A 00 push 0x0
00401962 . A1 F8C14800 mov eax,dword ptr ds:[0x48C1F8]
00401967 . 85C0 test eax,eax
00401969 . 75 05 jnz short 00401970
0040196B . B8 14ED4600 mov eax,0046ED14
00401970 > 50 push eax
00401971 . 68 04000000 push 0x4
00401976 . BB 206E4000 mov ebx,00406E20
0040197B . E8 FE500000 call 00406A7E
00401980 . 83C4 34 add esp,0x34
00401983 . 8945 F8 mov dword ptr ss:[ebp-0x8],eax
00401986 . 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
00401989 . 85DB test ebx,ebx
0040198B . 74 09 je short 00401996
0040198D . 53 push ebx
0040198E . E8 DF500000 call 00406A72
00401993 . 83C4 04 add esp,0x4
00401996 > 8B45 F8 mov eax,dword ptr ss:[ebp-0x8]
00401999 . 33C9 xor ecx,ecx
0040199B . 50 push eax
0040199C . B8 FCC14800 mov eax,0048C1FC
004019A1 . 8BD8 mov ebx,eax
004019A3 . 58 pop eax
004019A4 > 41 inc ecx
004019A5 . 51 push ecx
004019A6 . 53 push ebx
004019A7 . 890B mov dword ptr ds:[ebx],ecx
004019A9 . 50 push eax
004019AA . 3BC8 cmp ecx,eax
004019AC . 0F8F 0F000000 jg 004019C1
004019B2 . E8 023C0000 call 004055B9
这里是一段相对正常的代码,我们重点注意一下这里
当单步走过00401967 . 85C0 test eax,eax这里时,发现eax弹出了AProtect的字眼,这会不会就是key呢,先不管
继续单步走,发现004019B2 . E8 023C0000 call 004055B9这个call并不是api函数,我们先标记一下,不去理会他。
后来我们会发现,我们跟完整段代码后都没有出现任何类似关键地方,这时我们就想到了之前的那个call
我们在断点窗口找到他,再次单击按钮,发现停在了这个call上,此时我们F7步入
进入这个call的入口后我们发现门口等着我们的是那个antiod的call,之前我们已经retn过了,所以这看门狗对我们已经无效
经过无数垃圾代码后,我们又看到了段正常代码
004057CB . 6A FF push -0x1
004057CD . 6A 08 push 0x8
004057CF . 68 02000116 push 0x16010002
004057D4 . 68 01000152 push 0x52010001
004057D9 . E8 AC120000 call 00406A8A
004057DE . 83C4 10 add esp,0x10
004057E1 . 8945 FC mov dword ptr ss:[ebp-0x4],eax
004057E4 . 68 14ED4600 push 0046ED14
004057E9 . FF75 FC push dword ptr ss:[ebp-0x4]
004057EC . E8 1AB8FFFF call 0040100B
004057F1 . 83C4 08 add esp,0x8
004057F4 . 83F8 00 cmp eax,0x0
004057F7 . B8 00000000 mov eax,0x0
004057FC . 0F94C0 sete al
004057FF . 8945 F8 mov dword ptr ss:[ebp-0x8],eax
00405802 . 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
00405805 . 85DB test ebx,ebx
00405807 . 74 09 je short 00405812
00405809 . 53 push ebx
0040580A . E8 63120000 call 00406A72
0040580F . 83C4 04 add esp,0x4
00405812 > 837D F8 00 cmp dword ptr ss:[ebp-0x8],0x0
00405816 . 0F84 05000000 je 00405821
0040581C . E9 CC060000 jmp 00405EED
00405821 > EB 07 jmp short 0040582A
又看见这种跳转了00405816 . /0F84 05000000 je 00405821,没有实现的,下面的jmp直接跳过代码的,我们应该jmp过去
继续单步,来到这段正常代码处
00405C29 . 6A FF push -0x1
00405C2B . 6A 08 push 0x8
00405C2D . 68 02000116 push 0x16010002
00405C32 . 68 01000152 push 0x52010001
00405C37 . E8 4E0E0000 call 00406A8A
00405C3C . 83C4 10 add esp,0x10
00405C3F . 8945 FC mov dword ptr ss:[ebp-0x4],eax
00405C42 . 68 02000080 push 0x80000002
00405C47 . 6A 00 push 0x0
00405C49 . 68 00000000 push 0x0
00405C4E . 6A 00 push 0x0
00405C50 . 6A 00 push 0x0
00405C52 . 6A 00 push 0x0
00405C54 . 68 04000080 push 0x80000004
00405C59 . 6A 00 push 0x0
00405C5B . 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00405C5E . 85C0 test eax,eax
00405C60 . 75 05 jnz short 00405C67
00405C62 . B8 14ED4600 mov eax,0046ED14
00405C67 > 50 push eax
00405C68 . 68 04000080 push 0x80000004
00405C6D . 6A 00 push 0x0
00405C6F . A1 F8C14800 mov eax,dword ptr ds:[0x48C1F8]
00405C74 . 85C0 test eax,eax
00405C76 . 75 05 jnz short 00405C7D
00405C78 . B8 14ED4600 mov eax,0046ED14
00405C7D > 50 push eax
00405C7E . 68 04000000 push 0x4
00405C83 . BB 206E4000 mov ebx,00406E20
00405C88 . E8 F10D0000 call 00406A7E
00405C8D . 83C4 34 add esp,0x34
00405C90 . 8945 F8 mov dword ptr ss:[ebp-0x8],eax
00405C93 . 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
00405C96 . 85DB test ebx,ebx
00405C98 . 74 09 je short 00405CA3
00405C9A . 53 push ebx
00405C9B . E8 D20D0000 call 00406A72
00405CA0 . 83C4 04 add esp,0x4
00405CA3 > 8B45 F8 mov eax,dword ptr ss:[ebp-0x8]
00405CA6 . 33C9 xor ecx,ecx
00405CA8 . 50 push eax
00405CA9 . B8 FCC14800 mov eax,0048C1FC
00405CAE . 8BD8 mov ebx,eax
00405CB0 . 58 pop eax
00405CB1 > 41 inc ecx
00405CB2 . 51 push ecx
00405CB3 . 53 push ebx
00405CB4 . 890B mov dword ptr ds:[ebx],ecx
00405CB6 . 50 push eax
00405CB7 . 3BC8 cmp ecx,eax
00405CB9 . 0F8F 27000000 jg 00405CE6
00405CBF . 6A 00 push 0x0
00405CC1 . 68 00000000 push 0x0
00405CC6 . 6A FF push -0x1
00405CC8 . 6A 05 push 0x5
00405CCA . 68 27000116 push 0x16010027
00405CCF . 68 01000152 push 0x52010001
00405CD4 . E8 AB0D0000 call 00406A84
00405CD9 . 83C4 18 add esp,0x18
这次的课题不是为了分析什么东西,所以我们直接把眼光定位在00405CB9 . 0F8F 27000000 jg 00405CE6这里,发现是一个相对大一点的跳转,我们可以大胆的猜想这就是关键的call
于是我们把他nop掉,再运行后,发现破解成功
此cm到这里算是结束了,我们回头看看刚刚发现的字符串AProtect,这个是不是key?我们可以用未破解的程序试一下,发现确实是的
这样这个cm就完美破解了,在这里我只是提供个人的思路,验证一下成果,也不知道思路是否清晰,也许会有很多人不喜欢,也许也会有人喜欢,作为一名菜鸟,我觉得应该把思路贡献出来让大伙们指点指点,所以心血来潮发了这个帖子,希望学习的路上能遇到更多贵人!
那个,,我一直潜水潜到现在好不容易有点勇气发个帖子。。。虽然这cm是简单,但我至少也分享了个人的想法还有这帖子写了挺久的了- -这大半夜的我也不容易。。所以求各位大大看见后请不要因为cm过于简单而喷我。。。希望各位大大高抬贵手。要是愿意来指点我这菜鸟还有跟我做朋友的话,在这里先多多感谢跟表示热烈欢迎啦~
壮哉大BRACK师傅,人工为大BRACK师傅置顶~!
|
免费评分
-
查看全部评分
|