调用的代码地址在这里:
004BF823 |. 56 push esi ; /Arg2
004BF824 |. 50 push eax ; |Arg1
004BF825 |. E8 A6F60B00 call 0057EED0 ; /elementc.0057EED0
Arg2是喊话的内容
Arg1是喊话的类型
call 0057EED0 //这个就是CALL的地址
类型暂时找到如下(没灵犀暂时不试世界频道的类型了):
924100是当前频道
924102是组队频道
======================================================================
下面是用OD查找的过程:
用OD打开进程以后登录人物跑到一个空地,确保一切正常以后回OD下断(bp send)
测试了一下就算什么都不操作,OD也会每隔几秒断到一次send
乘这个基本固定时间中断的一次结束以后在聊天窗口里打句话发送,OD成功断下
断在007682A6(WS2_32.send)上面
(打bp send当然是断在send上面啦,然后层层退出去找我们要的)
敲一次ctrl+F9,地址转到了0058446E
00584459 |. 8B0D ACCB9000 mov ecx, dword ptr [90CBAC]
0058445F |. 6A 00 push 0 ; /Flags = 0
00584461 |. 6A 01 push 1 ; |DataSize = 1
00584463 |. 68 E8399000 push 009039E8 ; |Data = elementc.009039E8
00584468 |. 51 push ecx ; |Socket => FC
00584469 |. E8 383E1E00 call <jmp.&WS2_32.#19> ; /send
0058446E |. EB 07 jmp short 00584477 ; 第一次跳出来的地方,上面一行就是send的调用
4个参数OD都帮我们注释清楚了,还不明白可以找windows socket相关的文章来看看send的调用
再敲一次ctrl+F9,回到再上层调用地址
0057C6C5
再按ctrl+F9退一层,就到了004BF82A,而这行的上三行,就是最终找到的喊话call的调用
004BF823 |. 56 push esi ; /Arg2
004BF824 |. 50 push eax ; |Arg1
004BF825 |. E8 A6F60B00 call 0057EED0 ; /elementc.0057EED0
004BF82A |. 8D8D D0FAFFFF lea ecx, dword ptr [ebp-530]
怎么确定的? 部分是猜测,部分是参考了http://www.ghoffice.com/bbs/read.php?tid-37847-fpage-0-toread--page-2.html这个帖子里奇才贴的代码,事先知道了喊话call是2个参数的,省了不少麻烦。
地址换版本变了,不过还是找出来了。
取消send的断点,然后
在004BF825上按F2下断,验证一下.
聊天窗口里喊1234567,成功断在004BF825
此时寄存器里数据为:
EAX 00924100 elementc.00924100
ECX 033B1C68
EDX 0C3C6BFC UNICODE "123567"
EBX 066CF6E0
ESP 0012E6DC
EBP 0012F420
ESI 0C3C6BFC UNICODE "123567"
EDI 00000002
EIP 004BF825 elementc.004BF825
注意这2个
ESI 0C3C6BFC UNICODE "123567"
EAX 00924100 elementc.00924100
一切尽在不言中了。