选择一个人,得到ID。用CE搜索,得到一个地址。再用CE搜索这个地址,得到另一个地址。在新地址上选择“谁访问了这个地址”,CE记录下一个汇编语句。记一下这个汇编语句地址。然后关CE,打开OD,附加游戏。跳转到这个汇编语句,断点。然后分析。会得出以下结论:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | [php]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[/php] |
最后还是附上前辈编写,我修补的脚本。另外添加了坐标功能。找坐标不复杂,只需用OD数据窗口转到返回EAX值,把浏览方式改成浮点,然后往下翻一翻就有了。
文章评论
大师,能不能写一篇查找大航海时代书库地图的内存代码的文章,我用CE查,只会查到动态的地址。
你说的是找持有物品里的,读出来的图?
@king 是的,读出来的图,能不能留个QQ联系下啊!
求现在国服内侧多开方法啊....都不知道该怎么修改现在bin了
@Jimmy 国服目前我没什么好方法,尽请期待航海泡泡
经过我天天在贵站查资料...alexa都跃居71w了....不知道现在1.003能多开吗..求教啊