wangbeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

大航海时代ol台服找Call记(十四) 酒馆吃饭数据分析

虽然现在的台服料理便宜,一般也不太会去酒馆吃饭喝酒,但总是想分析下数据,就当练习吧。
思考:搜索食物名称,通过名称,找到食物节点内容,再通过分析,得到酒馆食物列表的数据结构

image

image
搜索“契洽酒”,得2个地址,0x134FB640 0x134FB840
image
再搜索对应地址 0x134FB640,得地址0x058B4D90
对地址0x058B4D90 “find who access this address”,
中断在 00B92804 - 8B 46 0C - mov eax,[esi+0C]

image

GVOnline.exe+792660 - 55                    - push ebp
GVOnline.exe+792661 - 8B EC                 - mov ebp,esp
GVOnline.exe+792663 - 6A FF                 - push -01 { 255 }
GVOnline.exe+792665 - 68 27D0F100           - push GVOnline.exe+B1D027 { (184) }
GVOnline.exe+79266A - 64 A1 00000000        - mov eax,fs:[00000000] { 0 }
GVOnline.exe+792670 - 50                    - push eax
GVOnline.exe+792671 - 64 89 25 00000000     - mov fs:[00000000],esp { 0 }
GVOnline.exe+792678 - 83 EC 64              - sub esp,64 { 100 }
GVOnline.exe+79267B - 53                    - push ebx
GVOnline.exe+79267C - 56                    - push esi
GVOnline.exe+79267D - 8B 75 08              - mov esi,[ebp+08] {  =====> esi=[ebp+8] 来自上一层参数1
GVOnline.exe+792680 - 57                    - push edi
GVOnline.exe+792681 - 8B CE                 - mov ecx,esi { ecx=esi }
GVOnline.exe+792683 - E8 4863F1FF           - call GVOnline.exe+6A89D0 {===》 eax =[ecx+10] }
GVOnline.exe+792688 - 8B D8                 - mov ebx,eax { ebx=eax }
GVOnline.exe+79268A - 89 5D EC              - mov [ebp-14],ebx
GVOnline.exe+79268D - C7 45 A4 00000000     - mov [ebp-5C],00000000 { 0 }
GVOnline.exe+792694 - C7 45 A8 00000000     - mov [ebp-58],00000000 { 0 }
GVOnline.exe+79269B - C7 45 A0 00000000     - mov [ebp-60],00000000 { 0 }
GVOnline.exe+7926A2 - C7 45 9C 00000000     - mov [ebp-64],00000000 { 0 }
GVOnline.exe+7926A9 - C7 45 AC 00000000     - mov [ebp-54],00000000 { 0 }
GVOnline.exe+7926B0 - C7 45 B0 0A000000     - mov [ebp-50],0000000A { 10 }
GVOnline.exe+7926B7 - C7 45 98 6435FC00     - mov [ebp-68],GVOnline.exe+BC3564 { (00D89055) }
GVOnline.exe+7926BE - 8D 4D 90              - lea ecx,[ebp-70]
GVOnline.exe+7926C1 - C7 45 FC 00000000     - mov [ebp-04],00000000 { 0 }
GVOnline.exe+7926C8 - E8 C3E3DAFF           - call GVOnline.exe+540A90
GVOnline.exe+7926CD - 80 7B 10 00           - cmp byte ptr [ebx+10],00 { 0 }
GVOnline.exe+7926D1 - 89 45 E8              - mov [ebp-18],eax
GVOnline.exe+7926D4 - C7 45 E0 00000000     - mov [ebp-20],00000000 { 0 }
GVOnline.exe+7926DB - 0F86 43020000         - jbe GVOnline.exe+792924
GVOnline.exe+7926E1 - 8D 73 12              - lea esi,[ebx+12] { esi=ebx+12 }
GVOnline.exe+7926E4 - 89 75 F0              - mov [ebp-10],esi                      //此处往下就是通用call的算法,以ID通过运算,找到物品节点
GVOnline.exe+7926E7 - E8 949D9CFF           - call GVOnline.exe+15C480
GVOnline.exe+7926EC - 0FB7 3E               - movzx edi,word ptr [esi] { edi=[esi] }
GVOnline.exe+7926EF - 68 1DF30100           - push 0001F31D { 127773 }
GVOnline.exe+7926F4 - 57                    - push edi
GVOnline.exe+7926F5 - 8B D8                 - mov ebx,eax
GVOnline.exe+7926F7 - E8 02CD3000           - call GVOnline.exe+A9F3FE { eax = int(edi / 0001f31d) }
GVOnline.exe+7926FC - 69 C0 140B0000        - imul eax,eax,00000B14 { 2836 }
GVOnline.exe+792702 - 8B F2                 - mov esi,edx
GVOnline.exe+792704 - 69 F6 A7410000        - imul esi,esi,000041A7 { 16807 }
GVOnline.exe+79270A - 83 C4 08              - add esp,08 { 8 }
GVOnline.exe+79270D - 2B F0                 - sub esi,eax
GVOnline.exe+79270F - 79 06                 - jns GVOnline.exe+792717
GVOnline.exe+792711 - 81 C6 FFFFFF7F        - add esi,7FFFFFFF { 2147483647 }
GVOnline.exe+792717 - 33 D2                 - xor edx,edx
GVOnline.exe+792719 - 8B C6                 - mov eax,esi
GVOnline.exe+79271B - F7 B3 342D0000        - div [ebx+00002D34] { 余数  edx }
GVOnline.exe+792721 - 8B 83 302D0000        - mov eax,[ebx+00002D30] { eax,[ebx+00002D30] }
GVOnline.exe+792727 - 85 C0                 - test eax,eax
GVOnline.exe+792729 - 74 22                 - je GVOnline.exe+79274D
GVOnline.exe+79272B - 8B 04 90              - mov eax,[eax+edx*4] { eax,[eax+edx*4] }
GVOnline.exe+79272E - 85 C0                 - test eax,eax
GVOnline.exe+792730 - 74 1B                 - je GVOnline.exe+79274D
GVOnline.exe+792732 - 39 70 0C              - cmp [eax+0C],esi
GVOnline.exe+792735 - 75 0F                 - jne GVOnline.exe+792746
GVOnline.exe+792737 - 33 C9                 - xor ecx,ecx
GVOnline.exe+792739 - 39 38                 - cmp [eax],edi
GVOnline.exe+79273B - 0F94 C1               - sete cl
GVOnline.exe+79273E - 85 C9                 - test ecx,ecx
GVOnline.exe+792740 - 0F85 9E000000         - jne GVOnline.exe+7927E4 { 此处跳 }
GVOnline.exe+792746 - 8B 40 08              - mov eax,[eax+08]
GVOnline.exe+792749 - 85 C0                 - test eax,eax
GVOnline.exe+79274B - 75 E5                 - jne GVOnline.exe+792732
......
GVOnline.exe+7927DB - 8B 45 EC              - mov eax,[ebp-14]
GVOnline.exe+7927DE - F6 40 08 02           - test byte ptr [eax+08],02 { 2 }
GVOnline.exe+7927E2 - EB 2F                 - jmp GVOnline.exe+792813
GVOnline.exe+7927E4 - 8B 70 04              - mov esi,[eax+04] { esi=[eax+4] }
GVOnline.exe+7927E7 - 85 F6                 - test esi,esi
GVOnline.exe+7927E9 - 0F84 5EFFFFFF         - je GVOnline.exe+79274D
GVOnline.exe+7927EF - 83 7E 18 00           - cmp dword ptr [esi+18],00 {  ==》 与背包物品一样,判断[+18] == 0 ?没有,解密 }
GVOnline.exe+7927F3 - 7E 0F                 - jle GVOnline.exe+792804
GVOnline.exe+7927F5 - FF 76 04              - push [esi+04]
GVOnline.exe+7927F8 - 8D 46 08              - lea eax,[esi+08] { [esi+8] = ID }
GVOnline.exe+7927FB - 50                    - push eax
GVOnline.exe+7927FC - E8 2F891700           - call GVOnline.exe+90B130 { 通用解密call }
GVOnline.exe+792801 - 83 C4 08              - add esp,08 { 8 }
GVOnline.exe+792804 - 8B 46 0C              - mov eax,[esi+0C] { ------------------>断在此处
 }
GVOnline.exe+792807 - E9 46FFFFFF           - jmp GVOnline.exe+792752
GVOnline.exe+79280C - 8B 45 EC              - mov eax,[ebp-14]

image

可以看到断下来时,esi处为食物节点数据,包括:ID、中文名称地址


但一直往上追了好几层,都找不到酒馆食物的数组来源,数组的结构始终是在堆栈里,只要窗口一关闭,就消失了。开始还想着跟踪堆栈内的食物数据,看下最后存放到哪里去,但可能比较复杂了。

image

思考之后,明白了,酒馆的食物对游戏角色来说不是重要内容,每次都是临时从服务器上传送过来,临时存放下,吃完数据就没用了。
但是酒馆吃喝的窗口打开着,总会临时保存着这个结构。
观察后,考虑每次点击不同的食物,窗口上的价格会相应改变。想到,这个价格应该就是各个食物的单价相加的结果,那必然点击食物后,游戏会从食物数组里取相应的食物价格,进行计算。这应该可以是个切入点。


通过搜索这个价格,得到地址 0x1064ee00 , “find who access this address”,断在:00A6A740 - 89 73 70 - mov [ebx+70],esi

GVOnline.exe+66A727 - 56                    - push esi
GVOnline.exe+66A728 - 8B 75 08              - mov esi,[ebp+08] {   =====>   esi =[ebp+8] 上层参数1 }
GVOnline.exe+66A72B - 57                    - push edi
GVOnline.exe+66A72C - 8B D9                 - mov ebx,ecx
GVOnline.exe+66A72E - 56                    - push esi
GVOnline.exe+66A72F - 8D 7B 7C              - lea edi,[ebx+7C]
GVOnline.exe+66A732 - 57                    - push edi
GVOnline.exe+66A733 - E8 B8070000           - call GVOnline.exe+66AEF0
GVOnline.exe+66A738 - 8B 07                 - mov eax,[edi]
GVOnline.exe+66A73A - 8B 4B 78              - mov ecx,[ebx+78]
GVOnline.exe+66A73D - 83 C4 08              - add esp,08 { 8 }
GVOnline.exe+66A740 - 89 73 70              - mov [ebx+70],esi {  --------> 断在此处,esi=总价 }
//----------------返回上层-----------------
GVOnline.exe+641CB3 - FF 75 0C              - push [ebp+0C]
GVOnline.exe+641CB6 - FF 75 08              - push [ebp+08] { ==============>上层参数1 }
GVOnline.exe+641CB9 - E8 628A0200           - call GVOnline.exe+66A720
GVOnline.exe+641CBE - 8B 4D F4              - mov ecx,[ebp-0C] {----------------> 返回1 }
//----------------返回上层-----------------
GVOnline.exe+655B48 - 57                    - push edi
GVOnline.exe+655B49 - 8B 7D 0C              - mov edi,[ebp+0C] { edi=[ebp+0C]  ==============>上层第2个参数 }
GVOnline.exe+655B4C - BB 04000000           - mov ebx,00000004 { 4 }
GVOnline.exe+655B51 - 8B 47 04              - mov eax,[edi+04]
GVOnline.exe+655B54 - 85 C0                 - test eax,eax
......
GVOnline.exe+655C04 - FF 77 14              - push [edi+14]
GVOnline.exe+655C07 - 8B 0F                 - mov ecx,[edi] {=============>   ecx = [edi] }
GVOnline.exe+655C09 - FF 75 18              - push [ebp+18]
GVOnline.exe+655C0C - B8 00943577           - mov eax,ucrtbase.casinhf+100 { (1574524897) }
GVOnline.exe+655C11 - 3B C8                 - cmp ecx,eax
GVOnline.exe+655C13 - 0F4F C8               - cmovg ecx,eax
GVOnline.exe+655C16 - 8D 46 10              - lea eax,[esi+10]
GVOnline.exe+655C19 - 50                    - push eax
GVOnline.exe+655C1A - 8D 43 5C              - lea eax,[ebx+5C]
GVOnline.exe+655C1D - 50                    - push eax
GVOnline.exe+655C1E - 51                    - push ecx { =========================> 参数1 = ecx }
GVOnline.exe+655C1F - 8B 4D 08              - mov ecx,[ebp+08]
GVOnline.exe+655C22 - E8 29C0FEFF           - call GVOnline.exe+641C50 { ---------------->返回2 }
GVOnline.exe+655C27 - 8B 4F 08              - mov ecx,[edi+08]
//-------------------------返回-------------------
GVOnline.exe+655C86 - B9 04000000           - mov ecx,00000004 { 4 }
GVOnline.exe+655C8B - 56                    - push esi
GVOnline.exe+655C8C - 8B 75 0C              - mov esi,[ebp+0C] { =======> esi=[ebp+0C] 上层第2个参数 }
GVOnline.exe+655C8F - 8B 46 04              - mov eax,[esi+04]
GVOnline.exe+655C92 - 85 C0                 - test eax,eax
GVOnline.exe+655C94 - 74 3C                 - je GVOnline.exe+655CD2
GVOnline.exe+655C96 - 6A 00                 - push 00 { 0 }
........
GVOnline.exe+655CD8 - 83 C0 EC              - add eax,-14 { 236 }
GVOnline.exe+655CDB - 50                    - push eax
GVOnline.exe+655CDC - 8B 45 10              - mov eax,[ebp+10]
GVOnline.exe+655CDF - 2B C1                 - sub eax,ecx
GVOnline.exe+655CE1 - 83 E8 70              - sub eax,70 { 112 }
GVOnline.exe+655CE4 - 50                    - push eax
GVOnline.exe+655CE5 - 56                    - push esi { =======================>第2个参数 =esi }
GVOnline.exe+655CE6 - FF 75 08              - push [ebp+08]
GVOnline.exe+655CE9 - E8 52FEFFFF           - call GVOnline.exe+655B40 { ----------------->返回3 }
GVOnline.exe+655CEE - 83 C4 14              - add esp,14 { 20 }
//-------------------------返回-------------------
GVOnline.exe+3A15EB - 81 C6 B4000000        - add esi,000000B4 { 180 }
GVOnline.exe+3A15F1 - 4F                    - dec edi
GVOnline.exe+3A15F2 - 75 E4                 - jne GVOnline.exe+3A15D8
GVOnline.exe+3A15F4 - 8B 4D D8              - mov ecx,[ebp-28]
GVOnline.exe+3A15F7 - 33 C0                 - xor eax,eax
GVOnline.exe+3A15F9 - 8D 91 0C0A0000        - lea edx,[ecx+00000A0C] {============> edx=[ecx+00000A0C],edx为选中要吃的饮料食物的首地址 }
GVOnline.exe+3A15FF - 89 7D D4              - mov [ebp-2C],edi
GVOnline.exe+3A1602 - 89 45 C8              - mov [ebp-38],eax
GVOnline.exe+3A1605 - 89 55 B8              - mov [ebp-48],edx { =====》[ebp-48]=edx }
GVOnline.exe+3A1608 - 39 02                 - cmp [edx],eax
GVOnline.exe+3A160A - 74 11                 - je GVOnline.exe+3A161D
GVOnline.exe+3A160C - 39 81 100A0000        - cmp [ecx+00000A10],eax
......
GVOnline.exe+3A19BE - 89 BD 60FFFFFF        - mov [ebp-000000A0],edi
GVOnline.exe+3A19C4 - C7 85 70FFFFFF 01000000 - mov [ebp-00000090],00000001 { 1 }
GVOnline.exe+3A19CE - E8 4D1B2A00           - call GVOnline.exe+643520
GVOnline.exe+3A19D3 - 8B 7D B8              - mov edi,[ebp-48] { ============>   edi=[ebp-48]   [edi]=8d 点的食物地址}
GVOnline.exe+3A19D6 - C7 40 18 00000080     - mov [eax+18],80000000 { -2147483648 }
GVOnline.exe+3A19DD - 0F57 C0               - xorps xmm0,xmm0
GVOnline.exe+3A19E0 - C7 45 9C 00000000     - mov [ebp-64],00000000 { 0 }
GVOnline.exe+3A19E7 - C7 45 A0 00000000     - mov [ebp-60],00000000 { 0 }
GVOnline.exe+3A19EE - C7 45 A4 00000000     - mov [ebp-5C],00000000 { 0 }
GVOnline.exe+3A19F5 - C7 45 A8 00000000     - mov [ebp-58],00000000 { 0 }
GVOnline.exe+3A19FC - C7 45 AC FFFFFFFF     - mov [ebp-54],FFFFFFFF { -1 }
GVOnline.exe+3A1A03 - C7 45 B0 FFFFFFFF     - mov [ebp-50],FFFFFFFF { -1 }
GVOnline.exe+3A1A0A - 66 0F13 45 EC         - movlpd [ebp-14],xmm0
GVOnline.exe+3A1A0F - BB 02000000           - mov ebx,00000002 { 2 }
GVOnline.exe+3A1A14 - 8B 0F                 - mov ecx,[edi] {=============> edi = 点的2个餐的地址 }
GVOnline.exe+3A1A16 - 85 C9                 - test ecx,ecx
GVOnline.exe+3A1A18 - 74 14                 - je GVOnline.exe+3A1A2E
GVOnline.exe+3A1A1A - 8D 45 BC              - lea eax,[ebp-44]
GVOnline.exe+3A1A1D - 50                    - push eax
GVOnline.exe+3A1A1E - E8 1DF01900           - call GVOnline.exe+540A40 {=========> 返回[eax]取得第N个点的食物的价格 }
GVOnline.exe+3A1A23 - 8B 08                 - mov ecx,[eax]
GVOnline.exe+3A1A25 - 01 4D EC              - add [ebp-14],ecx {===========> 相加得到总价格存入[ebp-14] }
GVOnline.exe+3A1A28 - 8B 40 04              - mov eax,[eax+04]
GVOnline.exe+3A1A2B - 11 45 F0              - adc [ebp-10],eax
GVOnline.exe+3A1A2E - 83 C7 04              - add edi,04 { 4 }
GVOnline.exe+3A1A31 - 4B                    - dec ebx
GVOnline.exe+3A1A32 - 75 E0                 - jne GVOnline.exe+3A1A14
GVOnline.exe+3A1A34 - 8D 4D EC              - lea ecx,[ebp-14] {==========> [ecx] = [ebp-14] =总价 }
GVOnline.exe+3A1A37 - E8 540DD8FF           - call GVOnline.exe+122790 {=====> eax在这个call里变化 = [ecx] }
GVOnline.exe+3A1A3C - 68 94030000           - push 00000394 { 916 }
GVOnline.exe+3A1A41 - 89 45 9C              - mov [ebp-64],eax { =====> [ebp-64]=eax  eax=总价 存入参数中 }
GVOnline.exe+3A1A44 - E8 075ED7FF           - call GVOnline.exe+117850
GVOnline.exe+3A1A49 - 8B 7D B8              - mov edi,[ebp-48]
......
GVOnline.exe+3A1A9C - 6A 04                 - push 04 { 4 }
GVOnline.exe+3A1A9E - 68 34010000           - push 00000134 { 308 }
GVOnline.exe+3A1AA3 - 3B C7                 - cmp eax,edi
GVOnline.exe+3A1AA5 - 68 44020000           - push 00000244 { 580 }
GVOnline.exe+3A1AAA - 8D 45 9C              - lea eax,[ebp-64] { eax=ebp-64 }
GVOnline.exe+3A1AAD - BA 8080FFFF           - mov edx,FFFF8080 { -32640 }
GVOnline.exe+3A1AB2 - 50                    - push eax { =====================>第2个参数  eax }
GVOnline.exe+3A1AB3 - FF 75 DC              - push [ebp-24]
GVOnline.exe+3A1AB6 - 0F47 CA               - cmova ecx,edx
GVOnline.exe+3A1AB9 - 89 4D B0              - mov [ebp-50],ecx
GVOnline.exe+3A1ABC - E8 BF412B00           - call GVOnline.exe+655C80 { ---------------> 返回4 }
GVOnline.exe+3A1AC1 - 8B 7D D8              - mov edi,[ebp-28]
GVOnline.exe+3A1AC4 - 83 C4 14              - add esp,14 { 20 }

image

执行到GVOnline.exe+3A1A14 - 8B 0F - mov ecx,[edi] { edi = 点的2个餐的地址 } 时
可以看到,[edi] = 点的2个餐的地址 0x0147dd7c 0x0147dddc

image
image

在0x0147dd7c地址可以清晰地看到,有9个节点,对应酒馆提供的9种食物数组结构。
(第2张图为食物节点调整好首地址后的具体内容,地址非本次地址,仅供说明)

从GVOnline.exe+3A1A1E - E8 1DF01900 - call GVOnline.exe+540A40里可以知道价格是在节点的+08处,
因此,食物数组的首地址为0x0147dd7c -8 = 0x0147dd74
有了临时地址,就可以用pointer scan for this address,找出食物地址为:


image
image

[1291274]+1c]+198]+EC]+0]
[1291274]+1c]+198]+EC = 第1个食物地址 最后1个食物地址 食物总数


酒馆吃饭call:
gvonline.bin+4AB0C - 56                    - push esi
gvonline.bin+4AB0D - 8B 77 34              - mov esi,[edi+34]
gvonline.bin+4AB10 - E8 6B191100           - call gvonline.bin+15C480
gvonline.bin+4AB15 - FF 75 10              - push [ebp+10]       //???
gvonline.bin+4AB18 - 8D 88 A81A0000        - lea ecx,[eax+00001AA8]  //ecx=1217388
gvonline.bin+4AB1E - FF 75 0C              - push [ebp+0C]    //食物ID
gvonline.bin+4AB21 - FF 75 08              - push [ebp+08]    //饮料ID
gvonline.bin+4AB24 - 56                    - push esi        //NPC ID
gvonline.bin+4AB25 - FF 75 FC              - push [ebp-04]   //0  
gvonline.bin+4AB28 - FF 77 24              - push [edi+24]   //1
gvonline.bin+4AB2B - E8 304B6E00           - call gvonline.bin+72F660
堆栈
0019FDF0(esp+0)      - 00000001             - (dword)00000001(1)  
0019FDF4(esp+4)      - 00000000             - (dword)00000000(0)  
0019FDF8(esp+8)      - 01800227             - (pointer)01800227   
0019FDFC(esp+C)      - 0000008F             - (dword)0000008F(143)
0019FE00(esp+10)     - 00000093             - (dword)00000093(147)
0019FE04(esp+14)     - 0000029D             - (dword)0000029D(669)

image

posted on 2026-04-02 11:32  wangbeng  阅读(5)  评论(1)    收藏  举报