挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运IOS签名/udid证书出售/送证书加群1040456405 ██【我要租此广告位】██
... .
查看: 3762|回复: 2
打印 上一主题 下一主题

[讨论交流] 圣魔之血的消息处理函数对象指针反跟踪解决办法-带图

[复制链接]
4中级会员
520/600

520

积分

223

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
297
海币
3998
交易币
0
跳转到指定楼层
楼主
发表于 2015-2-6 22:00:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


本帖最后由 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.SoVirtualAllocEx下断更准确  
   

还有就是一般情况下 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),本站将立即改正。

98

积分

58

主题

8

听众
已帮网友解决0 个问题
好评
0
贡献
40
海币
3476
交易币
50
沙发
发表于 2015-2-10 20:57:01 | 只看该作者
我了个去,顶了

23

积分

14

主题

3

听众
已帮网友解决0 个问题
好评
0
贡献
9
海币
449
交易币
0
板凳
发表于 2015-5-13 23:19:03 | 只看该作者
太强大了。佩服啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-5 03:00 , Processed in 0.085151 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表