|

提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).
本帖最后由 Cuzっ 于 2015-2-6 22:09 编辑
圣魔之血的消息处理函数对象指针反跟踪解决办法-带图
首先讲述一下这个问题,很多朋友找到圣魔的子程序(也就是call 我叫习惯了 ^ ^ 要不说是外行呢…)
然后向上跟上去后会发现一个mov ecx,dword ptr [XXXXXX]的指令,正在高兴终于找到基址的时候,重新登录后发现这条内存地址和指令地址居然神奇般的改变了
完整指令其实是类似这个样子的
Code1:
10E00FF8 59 pop ecx
10E00FF9 58 pop eax
10E00FFA 5A pop edx
10E00FFB 52 push edx
10E00FFC 50 push eax
10E00FFD 51 push ecx
10E00FFE 52 push edx
10E00FFF 50 push eax
10E01000 8B0D E82CD910 mov ecx, dword ptr [10D92CE8]
10E01006 FF15 4810E010 call dword ptr [10E01048] ; client.00557A30
10E0100C C2 0800 retn 8
是不是很眼熟,大多数都需要用到这条指令内的基地址,也就是类对象指针mov ecx, dword ptr [10D92CE8]
首先观察一下这段代码,发现了什么没有?对,它没有按规矩的在主程序代码段,有的朋友可能会想到了,是不是在其他DLL上面呢? 可以确定的告诉你,它实实在在的存在于主程序领空 ^ ^
那这是为什么呢? 其实很简单,唯一的可能就是程序自己申请了一块内存,然后自己组装的这段代码.
起初我的想法是截获申请内存函数,看看能不能抓到一些蛛丝马迹.
So就在VirtualAllocEx上下断点,为什么不断VirtualAlloc呢?
因为VirtualAlloc内部调用了VirtualAllocEx.So在VirtualAllocEx下断更准确
还有就是一般情况下 new等申请内存操作都会内部调用VirtualAllocEx.
起初我认为这个方法是可行的,结果断上以后,会有无数调用此处的地址 T T
(我分析可能是某些对象的构造函数或对象模版的插入等操作导致的吧,或许是游戏的反调戏手段呢 ^ ^ )
呵呵,所以暂时放弃了这个方法,看看有没有其他办法可以找到关键点.
(思考途中上了个厕所 ^ ^ )
厕所途中想到了一个办法,是源于因果的, 既然它这段代码是程序构造的,那它就肯定存放在某处,大家也想到是什么办法了吧 ^ ^
下面验证这个方法, 首先用PE编辑工具打开游戏主程序
我们提取出Code1处的字节码
59 58 5A 52 50 51 52 50 8B 0D
注意立即数部分不要提取
下面在PE编辑工具中查找这个序列(祈祷没有加密)
搜索到了 ^ ^ 如图所示:
记下这段数据的文件偏移为004F1A74
好了!可以关掉了
我们一样看看这个主程序的区段信息
如图:
正如我当初想的那样! 确实在数据段,看区段名为只读数据段(当然这个名字可以随便取,不能用作精确参考)
我们先计算出这个文件偏移在数据段内的段内偏移
004F1A74 – 004A1000 = 50A74
我们用OD附加上游戏 当然不需要登录
查看下游戏的模块信息
看到没 rdata段地址为008A1000
我们用这个地址加上段内偏移
008A1000 + 50A74 = 8F1A74
下面转到这个地址下内存访问断点^ ^
然后运行游戏登录游戏
7C812A65 FF15 0815807C call dword ptr [<&ntdll.RtlRaiseExcep>; ntdll.RtlRaiseException
遇到异常可以SHIFT+F9跳过
好了 正如所料断下了
7814500A . F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] 断在了这句
7814500C . FF2495 245114>jmp dword ptr [edx*4+78145124]
我们跟踪一下EDI的地址
然后F4到7814500C这句 EDI指向的地址就已经被拷贝完成了,为什么不用F8? 因为串拷贝的时候F8很可能会无响应
然后EDI的数据会变成这样
59 58 5A 52 50 51 52 50 8B 0D 00 00 00 00FF 15 00 00 00 00C2 08 00 90 90 90 90 90 90 90 90 90 00 00 00 00 00 00 00 00
我们对照一下code1的代码看到没,完全一样,只是立即数还没有被填充.
下面我们在FF15后面下内存写入断点(也就是红色立即数部分)
顺利断下^ ^
005CCB87 |. 6A 28 push 28 ; /n = 28 (40.)
005CCB89 |. 68 741A8F00 push 008F1A74 ; |src = client.008F1A74
005CCB8E |. 8B55 F0 mov edx, dword ptr [ebp-10] ; |
005CCB91 |. 52 push edx ; |dest
005CCB92 |. E8 71BD2800 call <jmp.&MSVCR80.memcpy> ; \memcpy
005CCB97 |. 83C4 0C add esp, 0C ; 拷贝字节码到申请的内存
005CCB9A |. 8B45 F0 mov eax, dword ptr [ebp-10]
005CCB9D |. 8B4D BC mov ecx, dword ptr [ebp-44]
005CCBA0 |. 8948 0A mov dword ptr [eax+A], ecx ; 写入此消息处理函数的对象指针
005CCBA3 |. 8B4D BC mov ecx, dword ptr [ebp-44]
005CCBA6 |. 83C1 1C add ecx, 1C
005CCBA9 |. E8 92002700 call 0083CC40
005CCBAE |. 8B55 F0 mov edx, dword ptr [ebp-10]
005CCBB1 |. 8942 10 mov dword ptr [edx+10], eax ; 写入消息处理函数的调用地址指针
005CCBB4 |. 8B45 F0 mov eax, dword ptr [ebp-10]
005CCBB7 |> 8BE5 mov esp, ebp
005CCBB9 |. 5D pop ebp
005CCBBA \. C2 0400 retn 4
看到了没,[edx+10]指向的就是消息函数调用地址, [eax+A]就是消息处理函数类对象指针^ ^
有的朋友又该问了,那如何知道获取的是我需要的那个消息处理函数呢?
其实很简单,比如技能处理函数来说吧
Code1里面的这句指向技能处理函数
10E01006 FF15 4810E010 call dword ptr [10E01048] ; client.00557A30
而下面这句就是技能处理函数的地址
00557A30 /. 55 push ebp ; 技能CALL 会经过2次
下面我们只需要在下面这句代码上面下条件断点
005CCBB1 |. 8942 10 mov dword ptr [edx+10], eax ; 写入消息处理函数的调用地址
Shift+F2下条件为[eax] == 00557A30
明白了吧
其实就是写入的这个函数地址的指针
下面只需要跟着这句向上走就可以找到地址了
005CCBA0 |. 8948 0A mov dword ptr [eax+A], ecx ; 写入此消息处理函数的对象指针
呵呵那就是各位看官的问题了^ ^
第一次发表这么长的文章,而且是图文的呵呵虽然图不多
以前经常在看雪潜水,初来广海,想找个人带一带,顺便大家多关照关照小弟(有喜欢和小弟交朋友的请发站内信^ ^)
联系我时,请说是在 挂海论坛 上看到的,谢谢! |
上一篇: Direct3D透视教程_教你做出属于自己的透视下一篇: 绿色征途,遍历周围玩家,及后台走路CALL_易语言源码
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。
|