简单百宝箱某工具解剖(剥离百宝箱)
本帖最后由 xiaobang 于 2012-5-17 12:06 编辑[ 破文标题 ] 简单百宝箱某工具解剖(剥离百宝箱)
[ 破文作者 ] Rookietp
[ 作者邮箱 ] Rookietp@cracklg.com
[ 作者主页 ] http://www.cracklg.com
[ 破解工具 ] OD
[ 破解平台 ] XP
[ 软件名称 ] 简单百宝箱
[ 软件大小 ] 9MB
[ 原版下载 ] 自行搜索下载
[ 保护方式 ] 无
[ 软件简介 ] 目前用户量最多的网游工具管家类产品。支持工具下载、工具管理等功能
[ 破解声明 ] 仅供技术交流,别无其他目的
这个工具是集成在简单百宝箱里面的,但是是一个单独的文件,如果不是在简单百宝箱里面运行,是无法运行的。
初探(看看简单百宝箱是怎样来打开它的):
004464D2 |. 6A 05 push 0x5
004464D4 |. 8D8D 7CFFFFFF lea ecx,
004464DA |. E8 6118FEFF call 简单百宝.00427D40
004464DF |. 50 push eax
004464E0 |. 6A 00 push 0x0
004464E2 |. 8B4D 0C mov ecx,
004464E5 |. 83C1 24 add ecx,0x24
004464E8 |. E8 5318FEFF call 简单百宝.00427D40
004464ED |. 50 push eax ; |FileName
004464EE |. 68 B0B55000 push 简单百宝.0050B5B0 ; |Operation = "open"
004464F3 |. 6A 00 push 0x0 ; |hWnd = NULL
004464F5 |. FF15 AC2E4E00 call dword ptr ds:[<&SHELL32.ShellExecut>; \ShellExecuteA很清楚的看到是通过ShellExecute这个API来运行的,抱着试一试的态度,随便写一个程序,调用ShellExecute来运行工具,发现是可以运行的。
于是乎,自己手动再次运行工具,发现还是可以运行的。
测验:将百宝箱关闭,手动运行game over,调用ShellExecute来运行,还是 game over 初步判定,工具是在找百宝箱这个人,没找到就不给运行。至于用什么方式在找,我们不得而知,那么就继续。。
在目录找到此工具,载入OD:
00401A90 >/$ 55 push ebp///vc++编译的程序
00401A91 |. 8BEC mov ebp,esp
00401A93 |. 6A FF push -0x1
00401A95 |. 68 50244000 push seting.00402450
00401A9A |. 68 161C4000 push <jmp.&MSVCRT._except_handler3> ; SE 处理程序安装
00401A9F |. 64:A1 0000000>mov eax,dword ptr fs:
00401AA5 |. 50 push eax下断:bp FindWindowA (查找窗口)
0012F390 00401126 /CALL 到 FindWindowA 来自 DNFMulti.00401120
0012F394 00000000 |Class = 0
0012F398 003A3908 \Title = "简单百宝箱"
0012F39C 0012FEF4 指向下一个 SEH 记录的指针
0012F3A0 00403F58 SE处理程序被断下,堆栈显示查找的标题是“简单百宝箱”,我们现在知道了它是通过查找百宝箱窗口是否存在来决定运行与否。
alt+k查看堆栈
调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0012F390 00401126 USER32.FindWindowA DNFMulti.00401120 0012F3A8
0012F394 00000000 Class = 0
0012F398 003A3908 Title = "简单百宝箱"
0012F3AC 004013FC ? DNFMulti.004010F0 DNFMulti.004013F7
0012FF04 73D3C1CF DNFMulti.00401350 MFC42.73D3C1CC 0012FF00
0012FF14 00403F01 ? <jmp.&MFC42.#1576> DNFMulti.00403EFC
0012FF28 00403E93 ? DNFMulti.00403EEC DNFMulti.<ModuleEntryPoint>+
0012F3AC 004013FC ? DNFMulti.004010F0 DNFMulti.004013F7 ///此处右键----显示调用
来到如下:
004013F7 |. E8 F4FCFFFF call DNFMulti.004010F0
004013FC |. 83C4 04 add esp,0x4
004013FF |. 84C0 test al,al
00401401 |. 74 66 je XDNFMulti.00401469
00401403 |. E8 08FEFFFF call DNFMulti.00401210
00401408 |. 85C0 test eax,eax
0040140A |. 75 05 jnz XDNFMulti.00401411
0040140C |. E8 3FFEFFFF call DNFMulti.00401250
00401411 |> 6A 00 push 0x0
00401413 |. 8D8D B8FCFFFF lea ecx,
00401419 |. E8 F2000000 call DNFMulti.00401510
0040141E |. 8D8D B8FCFFFF lea ecx,
00401424 |. C745 FC 00000>mov ,0x0
0040142B |. 894E 20 mov dword ptr ds:,ecx
0040142E |. 8D8D B8FCFFFF lea ecx,
00401434 |. E8 A3260000 call <jmp.&MFC42.#2514>
00401439 |. E8 D2FDFFFF call DNFMulti.00401210
0040143E |. 85C0 test eax,eax
00401440 |. 75 05 jnz XDNFMulti.00401447
00401442 |. E8 B9FEFFFF call DNFMulti.00401300
00401447 |> EB 0E jmp XDNFMulti.00401457
00401449 |. 56 4D 50 72 6>ascii "VMProtect end",0
00401457 |> 8D8D B8FCFFFF lea ecx,
0040145D |. C745 FC FFFFF>mov ,-0x1
00401464 |. E8 A70E0000 call DNFMulti.00402310
004013F7|.E8 F4FCFFFF call DNFMulti.004010F0///F7进入这个call
来到如下:
004010F0 /$ 55 push ebp
004010F1 |. 8BEC mov ebp,esp
004010F3 |. 64:A1 0000000>mov eax,dword ptr fs:
004010F9 |. 6A FF push -0x1
004010FB |. 68 583F4000 push DNFMulti.00403F58
00401100 |. 50 push eax
00401101 |. 64:8925 00000>mov dword ptr fs:,esp
00401108 |. EB 10 jmp XDNFMulti.0040111A
0040110A |. 56 4D 50 72 6>ascii "VMProtect begin",0
0040111A |> 8B45 08 mov eax,
0040111D |. 50 push eax ; /Title
0040111E |. 6A 00 push 0x0 ; |Class = 0
00401120 |. FF15 6C534000 call dword ptr ds:[<&USER32.FindWindowA>>; \FindWindowA
00401126 |. 85C0 test eax,eax
00401128 |. 75 4A jnz XDNFMulti.00401174
0040112A |. 8B4D 08 mov ecx,
0040112D |. 51 push ecx ; /MutexName
0040112E |. 50 push eax ; |Inheritable
0040112F |. 68 01001F00 push 0x1F0001 ; |Access = 1F0001
00401134 |. FF15 44504000 call dword ptr ds:[<&KERNEL32.OpenMutexA>; \OpenMutexA
0040113A |. 85C0 test eax,eax
0040113C |. 75 1F jnz XDNFMulti.0040115D
0040113E |. 8D4D 08 lea ecx,
00401141 |. C745 FC FFFFF>mov ,-0x1
00401148 |. E8 89290000 call <jmp.&MFC42.#800>
0040114D |. 32C0 xor al,al
0040114F |. 8B4D F4 mov ecx,
00401152 |. 64:890D 00000>mov dword ptr fs:,ecx
00401159 |. 8BE5 mov esp,ebp
0040115B |. 5D pop ebp
0040115C |. C3 retn
0040115D |> 50 push eax ; /hObject
0040115E |. FF15 64504000 call dword ptr ds:[<&KERNEL32.CloseHandl>; \CloseHandle
00401164 |. EB 0E jmp XDNFMulti.00401174
00401166 |. 56 4D 50 72 6>ascii "VMProtect end",0
00401174 |> 8D4D 08 lea ecx,
00401177 |. C745 FC FFFFF>mov ,-0x1
0040117E |. E8 53290000 call <jmp.&MFC42.#800>
00401183 |. 8B4D F4 mov ecx,
00401186 |. B0 01 mov al,0x1
00401188 |. 64:890D 00000>mov dword ptr fs:,ecx
0040118F |. 8BE5 mov esp,ebp
00401191 |. 5D pop ebp
00401192 \. C3 retn
0040111A |> \8B45 08 mov eax,
0040111D |. 50 push eax ; /Title
0040111E |. 6A 00 push 0x0 ; |Class = 0
00401120 |. FF15 6C534000 call dword ptr ds:[<&USER32.FindWindowA>>; \FindWindowA/////执行FindWindowA后
00401126 |. 85C0 test eax,eax ///进行判断
00401128 |. 75 4A jnz XDNFMulti.00401174 ////此跳转改为jmp00401128跳转实现来到:
00401174 |> \8D4D 08 lea ecx,
00401177 |. C745 FC FFFFF>mov ,-0x1
0040117E |. E8 53290000 call <jmp.&MFC42.#800>
00401183 |. 8B4D F4 mov ecx,
00401186 |. B0 01 mov al,0x1
00401188 |. 64:890D 00000>mov dword ptr fs:,ecx
0040118F |. 8BE5 mov esp,ebp
00401191 |. 5D pop ebp
00401192 \. C3 retn
00401186 |. B0 01 mov al,0x1 ///将AL赋值为1,为下面的判断做铺垫,其实到了此处就不需要继续分析了,因为程序此时已经可以正常运行了。
总结:非常简单,适合新手练手,小菜第二篇,欢迎各路大鸟指错。。
膜拜xiaobang大大 一样膜拜xiaobang大大 小菜鸟来学习了,感谢分享了 前来膜拜 果断前来支持bang大大,虽然我不用这个工具。
写得很详细,希望bang大大多出这样的分析 师傅又出教程了,又可以多学点知识了 太适合我等菜鸟了,思路是精华。 大牛,请教下,我看你的简单百宝箱某工具解剖(剥离百宝箱)帖子的时候,在 0012F3AC 004013FC ? DNFMulti.004010F0 DNFMulti.004013F7 ///此处右键----显示调用 这里我看不懂,我右键了,没有显示调用啊