-
-
[旧帖] [原创]爆破CrackMe12.zip_255 0.00雪花
-
发表于: 2016-1-29 21:26 1619
-
CrackMe提供者:acafeel
原帖:http://bbs.pediy.com/showthread.php?t=8822
工具:od
平台:winxpsp3
这个程序有两层壳,手工脱壳费了些时间。其实也挺简单,主要是第一次接触两层壳,不熟悉,导致脱掉第一层壳之后一眼没看到代码,以为搞错了,其实不过是个障眼法。
直接运行刚脱壳的程序,发现闪退。显然程序有反调试代码。od载入,
0048FFF8 > 55 push ebp
0048FFF9 8BEC mov ebp, esp
0048FFFB 83C4 F4 add esp, -0C
0048FFFE B8 18FE4800 mov eax, 0048FE18
00490003 E8 6C65F7FF call 00406574
00490008 A1 6C234900 mov eax, dword ptr [49236C]
0049000D 8B00 mov eax, dword ptr [eax]
0049000F E8 D890FAFF call 004390EC
00490014 E8 FFFCFFFF call 0048FD18 ;反调试
00490019 84C0 test al, al ;测试
0049001B 74 0E je short 0049002B ;爆破点
0049001D A1 6C234900 mov eax, dword ptr [49236C]
00490022 8B00 mov eax, dword ptr [eax]
00490024 E8 0F92FAFF call 00439238
00490029 EB 24 jmp short 0049004F
0049002B 8B0D 6C244900 mov ecx, dword ptr [49246C] ; test.0049393C
00490031 A1 6C234900 mov eax, dword ptr [49236C]
00490036 8B00 mov eax, dword ptr [eax]
00490038 8B15 68F24800 mov edx, dword ptr [48F268] ; test.0048F2B4
0049003E E8 C190FAFF call 00439104
00490043 A1 6C234900 mov eax, dword ptr [49236C]
00490048 8B00 mov eax, dword ptr [eax]
0049004A E8 3591FAFF call 00439184
0049004F E8 5839F7FF call 004039AC
程序入口函数就这么简短,稍微测试一下就可以发现反调试爆破点。具体爆破看个人喜好了。下面寻找注册按钮响应函数,
0048FB37 55 push ebp
0048FB38 68 E5FB4800 push 0048FBE5
0048FB3D 64:FF30 push dword ptr fs:[eax]
0048FB40 64:8920 mov dword ptr fs:[eax], esp
0048FB43 8D55 FC lea edx, dword ptr [ebp-4]
0048FB46 A1 3C394900 mov eax, dword ptr [49393C]
0048FB4B 8B80 D8020000 mov eax, dword ptr [eax+2D8]
0048FB51 E8 9670FBFF call 00446BEC ;取输入的用户名
0048FB56 8B45 FC mov eax, dword ptr [ebp-4]
0048FB59 50 push eax
0048FB5A B9 F8FB4800 mov ecx, 0048FBF8 ; ASCII "name"
0048FB5F BA 08FC4800 mov edx, 0048FC08 ; ASCII "Reg"
0048FB64 A1 44394900 mov eax, dword ptr [493944]
0048FB69 E8 E2F5FFFF call 0048F150 ;保存输入的用户名到注册表
0048FB6E 8D55 F8 lea edx, dword ptr [ebp-8]
0048FB71 A1 3C394900 mov eax, dword ptr [49393C]
0048FB76 8B80 E0020000 mov eax, dword ptr [eax+2E0]
0048FB7C E8 6B70FBFF call 00446BEC ;取输入的注册码
0048FB81 8B45 F8 mov eax, dword ptr [ebp-8]
0048FB84 50 push eax
0048FB85 B9 14FC4800 mov ecx, 0048FC14 ; ASCII "code"
0048FB8A BA 08FC4800 mov edx, 0048FC08 ; ASCII "Reg"
0048FB8F A1 44394900 mov eax, dword ptr [493944]
0048FB94 E8 B7F5FFFF call 0048F150 ;保存输入的注册码到注册表
0048FB99 6A 01 push 1
0048FB9B 8D55 F4 lea edx, dword ptr [ebp-C]
0048FB9E A1 6C234900 mov eax, dword ptr [49236C]
0048FBA3 8B00 mov eax, dword ptr [eax]
0048FBA5 E8 A29AFAFF call 0043964C ;取应用程序路径
0048FBAA 8B45 F4 mov eax, dword ptr [ebp-C]
0048FBAD E8 7643F7FF call 00403F28
0048FBB2 50 push eax
0048FBB3 E8 386CF7FF call <jmp.&kernel32.WinExec> ;重启应用程序
我们发现该函数仅简单的保存了用户输入,然后就重启自身。其间并没有验证操作。重启的程序依然显示未注册。可以推测验证工作是在程序启动之后显示之前进行的。本文拖了很久是因为我一直没有找到一个普遍适用的方法定位该处理函数。我猜想作为框架中可供用户使用的该函数应该是一个可重载的虚函数。定位这类函数不知道有没有同道有可行的方法。最后还是使用特例找到了处理函数(在kernel32.CompareStringA上下断回推),
0048F941 8B45 EC mov eax, dword ptr [ebp-14] ;程序计算的注册码
0048F944 8B15 4C394900 mov edx, dword ptr [49394C] ;用户输入的注册码
0048F94A E8 B989F7FF call 00408308 ;比较
0048F94F 84C0 test al, al ;测试结果
0048F951 74 6D je short 0048F9C0 ;爆破点
程序中验证注册码有两处,如果仅处理上面一处,程序显示结果为“小心!破解版本”,另一处在下面
0048F9CD 8B45 E4 mov eax, dword ptr [ebp-1C]
0048F9D0 8B15 4C394900 mov edx, dword ptr [49394C]
0048F9D6 E8 2D89F7FF call 00408308
0048F9DB 84C0 test al, al
0048F9DD 75 57 jnz short 0048FA36
有更好的方法请回帖指教,谢谢!
原帖:http://bbs.pediy.com/showthread.php?t=8822
工具:od
平台:winxpsp3
这个程序有两层壳,手工脱壳费了些时间。其实也挺简单,主要是第一次接触两层壳,不熟悉,导致脱掉第一层壳之后一眼没看到代码,以为搞错了,其实不过是个障眼法。
直接运行刚脱壳的程序,发现闪退。显然程序有反调试代码。od载入,
0048FFF8 > 55 push ebp
0048FFF9 8BEC mov ebp, esp
0048FFFB 83C4 F4 add esp, -0C
0048FFFE B8 18FE4800 mov eax, 0048FE18
00490003 E8 6C65F7FF call 00406574
00490008 A1 6C234900 mov eax, dword ptr [49236C]
0049000D 8B00 mov eax, dword ptr [eax]
0049000F E8 D890FAFF call 004390EC
00490014 E8 FFFCFFFF call 0048FD18 ;反调试
00490019 84C0 test al, al ;测试
0049001B 74 0E je short 0049002B ;爆破点
0049001D A1 6C234900 mov eax, dword ptr [49236C]
00490022 8B00 mov eax, dword ptr [eax]
00490024 E8 0F92FAFF call 00439238
00490029 EB 24 jmp short 0049004F
0049002B 8B0D 6C244900 mov ecx, dword ptr [49246C] ; test.0049393C
00490031 A1 6C234900 mov eax, dword ptr [49236C]
00490036 8B00 mov eax, dword ptr [eax]
00490038 8B15 68F24800 mov edx, dword ptr [48F268] ; test.0048F2B4
0049003E E8 C190FAFF call 00439104
00490043 A1 6C234900 mov eax, dword ptr [49236C]
00490048 8B00 mov eax, dword ptr [eax]
0049004A E8 3591FAFF call 00439184
0049004F E8 5839F7FF call 004039AC
程序入口函数就这么简短,稍微测试一下就可以发现反调试爆破点。具体爆破看个人喜好了。下面寻找注册按钮响应函数,
0048FB37 55 push ebp
0048FB38 68 E5FB4800 push 0048FBE5
0048FB3D 64:FF30 push dword ptr fs:[eax]
0048FB40 64:8920 mov dword ptr fs:[eax], esp
0048FB43 8D55 FC lea edx, dword ptr [ebp-4]
0048FB46 A1 3C394900 mov eax, dword ptr [49393C]
0048FB4B 8B80 D8020000 mov eax, dword ptr [eax+2D8]
0048FB51 E8 9670FBFF call 00446BEC ;取输入的用户名
0048FB56 8B45 FC mov eax, dword ptr [ebp-4]
0048FB59 50 push eax
0048FB5A B9 F8FB4800 mov ecx, 0048FBF8 ; ASCII "name"
0048FB5F BA 08FC4800 mov edx, 0048FC08 ; ASCII "Reg"
0048FB64 A1 44394900 mov eax, dword ptr [493944]
0048FB69 E8 E2F5FFFF call 0048F150 ;保存输入的用户名到注册表
0048FB6E 8D55 F8 lea edx, dword ptr [ebp-8]
0048FB71 A1 3C394900 mov eax, dword ptr [49393C]
0048FB76 8B80 E0020000 mov eax, dword ptr [eax+2E0]
0048FB7C E8 6B70FBFF call 00446BEC ;取输入的注册码
0048FB81 8B45 F8 mov eax, dword ptr [ebp-8]
0048FB84 50 push eax
0048FB85 B9 14FC4800 mov ecx, 0048FC14 ; ASCII "code"
0048FB8A BA 08FC4800 mov edx, 0048FC08 ; ASCII "Reg"
0048FB8F A1 44394900 mov eax, dword ptr [493944]
0048FB94 E8 B7F5FFFF call 0048F150 ;保存输入的注册码到注册表
0048FB99 6A 01 push 1
0048FB9B 8D55 F4 lea edx, dword ptr [ebp-C]
0048FB9E A1 6C234900 mov eax, dword ptr [49236C]
0048FBA3 8B00 mov eax, dword ptr [eax]
0048FBA5 E8 A29AFAFF call 0043964C ;取应用程序路径
0048FBAA 8B45 F4 mov eax, dword ptr [ebp-C]
0048FBAD E8 7643F7FF call 00403F28
0048FBB2 50 push eax
0048FBB3 E8 386CF7FF call <jmp.&kernel32.WinExec> ;重启应用程序
我们发现该函数仅简单的保存了用户输入,然后就重启自身。其间并没有验证操作。重启的程序依然显示未注册。可以推测验证工作是在程序启动之后显示之前进行的。本文拖了很久是因为我一直没有找到一个普遍适用的方法定位该处理函数。我猜想作为框架中可供用户使用的该函数应该是一个可重载的虚函数。定位这类函数不知道有没有同道有可行的方法。最后还是使用特例找到了处理函数(在kernel32.CompareStringA上下断回推),
0048F941 8B45 EC mov eax, dword ptr [ebp-14] ;程序计算的注册码
0048F944 8B15 4C394900 mov edx, dword ptr [49394C] ;用户输入的注册码
0048F94A E8 B989F7FF call 00408308 ;比较
0048F94F 84C0 test al, al ;测试结果
0048F951 74 6D je short 0048F9C0 ;爆破点
程序中验证注册码有两处,如果仅处理上面一处,程序显示结果为“小心!破解版本”,另一处在下面
0048F9CD 8B45 E4 mov eax, dword ptr [ebp-1C]
0048F9D0 8B15 4C394900 mov edx, dword ptr [49394C]
0048F9D6 E8 2D89F7FF call 00408308
0048F9DB 84C0 test al, al
0048F9DD 75 57 jnz short 0048FA36
有更好的方法请回帖指教,谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
谁下载
看原图
赞赏
雪币:
留言: