[原创]大航海时代ol TAB ID代码分析 v5007

2012-03-2100:52:12 6 3,179点击

选择一个人,得到ID。用CE搜索,得到一个地址。再用CE搜索这个地址,得到另一个地址。在新地址上选择“谁访问了这个地址”,CE记录下一个汇编语句。记一下这个汇编语句地址。然后关CE,打开OD,附加游戏。跳转到这个汇编语句,断点。然后分析。会得出以下结论:

TAB ID场景的代码
通用计算CALL代码段
0052CBC0 /$ 56 push esi ;这里设置断点,此时EAX=ID,ECX=基址
0052CBC1 |. 8B7424 10 mov esi,dword ptr ss:[esp+0x10]
0052CBC5 |. 57 push edi
0052CBC6 |. 8B7C24 0C mov edi,dword ptr ss:[esp+0xC]
0052CBCA |. 8BC7 mov eax,edi
0052CBCC |. C1E8 04 shr eax,0x4 ; ID2=int(id/16)
0052CBCF |. 8906 mov dword ptr ds:[esi],eax
0052CBD1 |. 33D2 xor edx,edx
0052CBD3 |. F771 08 div dword ptr ds:[ecx+0x8] ; div [base+8]
0052CBD6 |. 8B4424 10 mov eax,dword ptr ss:[esp+0x10]
0052CBDA |. 8910 mov dword ptr ds:[eax],edx
0052CBDC |. 8B49 04 mov ecx,dword ptr ds:[ecx+0x4] ; ecx=[base+4]
0052CBDF |. 85C9 test ecx,ecx
0052CBE1 |. 74 1D je Xwow.0052CC00
0052CBE3 |. 8B0491 mov eax,dword ptr ds:[ecx+edx*4] ; eax=[ecx+edx*4]
0052CBE6 |. 85C0 test eax,eax
0052CBE8 |. 74 16 je Xwow.0052CC00
0052CBEA |. 8B36 mov esi,dword ptr ds:[esi] ; ID2
0052CBEC |. 8D6424 00 lea esp,dword ptr ss:[esp]
0052CBF0 |> 3970 0C /cmp dword ptr ds:[eax+0xC],esi ; ID2比较,不相等继续读下一个
0052CBF3 |. 75 04 |jnz Xwow.0052CBF9
0052CBF5 |. 3938 |cmp dword ptr ds:[eax],edi ; ID比较,不相等继续读下一个
0052CBF7 |. 74 09 |je Xwow.0052CC02
0052CBF9 |> 8B40 08 |mov eax,dword ptr ds:[eax+0x8]
0052CBFC |. 85C0 |test eax,eax
0052CBFE |.^ 75 F0 \jnz Xwow.0052CBF0
0052CC00 |> 33C0 xor eax,eax
0052CC02 |> 5F pop edi
0052CC03 |. 5E pop esi
0052CC04 \. C2 0C00 retn 0xC

 
00796090 /$ 51 push ecx
00796091 |. 8D4424 08 lea eax,dword ptr ss:[esp+0x8]
00796095 |. 50 push eax
00796096 |. 8B4424 0C mov eax,dword ptr ss:[esp+0xC]
0079609A |. 8D5424 04 lea edx,dword ptr ss:[esp+0x4]
0079609E |. 52 push edx
0079609F |. 50 push eax
007960A0 >|. E8 1B6BD9FF call wow.0052CBC0 ;计算CALL第一次调用,此时ECX=固定对象基址CB7C98-&H4,EAX=ID
007960A5 |. 85C0 test eax,eax
007960A7 |. 74 07 je Xwow.007960B0
007960A9 |. 8B40 04 mov eax,dword ptr ds:[eax+0x4] ;关键地址传送
007960AC |. 59 pop ecx
007960AD |. C2 0400 retn 0x4
0042B926 |. 5E pop esi ; 070FF0F8
0042B927 |. C3 retn
00527EBF |. 33FF xor edi,edi

不管了,过程太繁琐。直接按CTRL+F8。要找一下ID=EAX。

00432A3F |. E8 BC8EFFFF call wow.0042B900
 0042B921 |. E8 3AC20300 call wow.00467B60
 007960A0 >|. E8 1B6BD9FF call wow.0052CBC0 ;计算CALL第二次调用,根据ID和基址CB7C98,再次计算。返回EAX
00432A44 |. 8BF0 mov esi,eax
00432A53 |. 8BCE mov ecx,esi
0045F1A4 |. 8BF1 mov esi,ecx
0045F1BA |. 8B8E 74010000 mov ecx,dword ptr ds:[esi+0x174] ;ESI是二次计算得到的EAX值。会在第三次调用里使用。前两次ESI都是ID。但这里第三次使用的是第二次返回的值。
0045F1C5 |. 51 push ecx
0045F1C6 |. 8D88 28270000 lea ecx,dword ptr ds:[eax+0x2728]
0045F1CC |. E8 EFD90C00 call wow.0052CBC0 ;计算CALL第三次调用
0045F1D1 |. 85C0 test eax,eax
0045F1D3 |. 74 26 je Xwow.0045F1FB
0045F1D5 |. 8B70 04 mov esi,dword ptr ds:[eax+0x4]
0045F1D8 |. 85F6 test esi,esi
0045F1DA |. 74 1F je Xwow.0045F1FB
0045F1DC |. 8B46 18 mov eax,dword ptr ds:[esi+0x18]
0045F1DF |. 85C0 test eax,eax
0045F1E1 |. 7E 10 jle Xwow.0045F1F3
0045F1F3 |> \8B46 0C mov eax,dword ptr ds:[esi+0xC] ;最终结果指针
0045F1F6 |. 5E pop esi ; 04E3B910
0045F1F7 |. 83C4 08 add esp,0x8
0045F1FA |. C3 retn

最后还是附上前辈编写,我修补的脚本。另外添加了坐标功能。找坐标不复杂,只需用OD数据窗口转到返回EAX值,把浏览方式改成浮点,然后往下翻一翻就有了。

[原创]大航海时代ol TAB ID代码分析 v5007

  显示TAB_ID的名字.rar (1.1 KB, 167 次)

  TAB_ID.txt (4.1 KB, 151 次)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:6   其中:访客  4   博主  2

    • mattle mattle 1

      大师,能不能写一篇查找大航海时代书库地图的内存代码的文章,我用CE查,只会查到动态的地址。

      • king king Admin

        你说的是找持有物品里的,读出来的图?

          • mattle mattle 1

            @king 是的,读出来的图,能不能留个QQ联系下啊!

          • Jimmy Jimmy 1

            求现在国服内侧多开方法啊….都不知道该怎么修改现在bin了

              • king king Admin

                @Jimmy 国服目前我没什么好方法,尽请期待航海泡泡

              • Jimmy Jimmy 1

                经过我天天在贵站查资料…alexa都跃居71w了….不知道现在1.003能多开吗..求教啊