大航海时代ol台服找Call记(十九)聊天框内容显示
前面已经找过说话call,聊天框内容的分析网上也有朋友分享过(wking's blog) https://wkings.blog/archives/98
偶然看到神导还是懒神的辅助输出信息居然直接显示在游戏里,这个方式还是蛮新奇有趣的。
在游戏里说一句话,直接搜索文本(utf-16),得到几个地址,找个看得顺眼的,浏览下内存数据。

在下一个存放说话内容的地址上下个定入断点(“data breakpoint”->”break on write”),游戏里说一句话后,中断下来,取消断点,返回2层,到了下面:
GVOnline.exe+1FFB1 - 83 C4 0C - add esp,0C { 12 }
GVOnline.exe+1FFB4 - EB 16 - jmp GVOnline.exe+1FFCC
GVOnline.exe+1FFB6 - 0FB6 46 01 - movzx eax,byte ptr [esi+01]
GVOnline.exe+1FFBA - 50 - push eax 参数4:固定0
GVOnline.exe+1FFBB - FF 76 0C - push [esi+0C] 参数3:说话内容 + 说话人 (具体格式见图)
GVOnline.exe+1FFBE - 0FB7 46 02 - movzx eax,word ptr [esi+02]
GVOnline.exe+1FFC2 - 50 - push eax 参数2:0x152 (信息ID,说话=152,技能消息=技能ID)
GVOnline.exe+1FFC3 - 57 - push edi 参数1:固定0
GVOnline.exe+1FFC4 - E8 177DFEFF - call GVOnline.exe+7CE0 - --------->显示说话内容
GVOnline.exe+1FFC9 - 83 C4 10 - add esp,10 { 16 } //------------> 返回二层到这里
GVOnline.exe+1FFCC - 68 90F84100 - push GVOnline.exe+1F890 { (-1947104426) }
GVOnline.exe+1FFD1 - FF 76 FC - push [esi-04]
再说下话,断下来看下堆栈:

4个参数就一目了然了,试着构造下参数,调用下这个call试试:
//用CE的 AutoAssemble 参照格式构造4个参数,调用call如下:
//-----------------------------------------------
alloc(newmem,2048)
newmem:
pushad
sub esp, 0x100 //堆栈里分配$100个字节
mov edx,esp
mov ebx,edx
mov [edx], 0xffffffff
mov [edx+4],0x00000000
add edx,08
mov [edx], 0x00000009 //不同的说话频道。(直观反应到显示颜色 颜色 03:绿 09 粉...)
mov [edx+4],0x00000003 //??
mov [edx+8],0x00000000
mov [edx+c],0x00000000
mov [edx+0x10],0x32003500 //文本内容。 中间以 0000 断开,则前面为发言,后面为发言人物,不断开则直接显示信息内容
mov [edx+0x14],0x00003100
mov [edx+0x18],0x97006b00
mov [edx+0x1c],0x69007200
mov [edx+0x20],0x65006c00
mov [edx+0x24],0x00000000
push 0
push ebx
push 0x152
push 00
call 00407CE0
add esp,10
add esp,0x100
popad
ret
createthread(newmem)

这样,辅助软件是不是就可以少用一个输出显示信息的memo了?
另外,这里也是游戏输出各类信息的地方,在此截取,就可以清楚地了解到游戏发生了什么事情。谁说了啥、谁跟随了谁、发现什么物品、使用什么技能、出现什么灾害状态....
浙公网安备 33010602011771号