wangbeng

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

光通传奇3 永恒传奇3(GSR版本) (二) 地面物品

地面物品搜索:
在地面丢1个金币,搜索“金币(1)

image

得地址 2B67E440,browse this memory region,可以观察到 2B67E440-10 为坐标X ,考虑到坐标地址比较好跟踪,2B67E440-10地址上 find who access this address 得
image


在第一行上 show assembler,函数比较复杂


Mir3Game.exe+116D0 - 55                    - push ebp
Mir3Game.exe+116D1 - 8B EC                 - mov ebp,esp
Mir3Game.exe+116D3 - 83 E4 F8              - and esp,-08 { 248 }
Mir3Game.exe+116D6 - 81 EC 54010000        - sub esp,00000154 { 340 }
Mir3Game.exe+116DC - 33 C0                 - xor eax,eax
Mir3Game.exe+116DE - 53                    - push ebx
Mir3Game.exe+116DF - 8B 5D 08              - mov ebx,[ebp+08]
Mir3Game.exe+116E2 - 0FBF 8B 06FF8300      - movsx ecx,word ptr [ebx+Mir3Game.exe+43FF06]
Mir3Game.exe+116E9 - 56                    - push esi
Mir3Game.exe+116EA - 8B B3 EC324D00        - mov esi,[ebx+Mir3Game.exe+D32EC]
Mir3Game.exe+116F0 - 89 83 94558400        - mov [ebx+Mir3Game.exe+445594],eax
Mir3Game.exe+116F6 - 89 83 88573600        - mov [ebx+00365788],eax
Mir3Game.exe+116FC - 89 83 84573600        - mov [ebx+00365784],eax
Mir3Game.exe+11702 - 88 44 24 0B           - mov [esp+0B],al
Mir3Game.exe+11706 - 8B 83 E8324D00        - mov eax,[ebx+Mir3Game.exe+D32E8]
Mir3Game.exe+1170C - 57                    - push edi
Mir3Game.exe+1170D - 0FBF BB 08FF8300      - movsx edi,word ptr [ebx+Mir3Game.exe+43FF08]
Mir3Game.exe+11714 - 8B D0                 - mov edx,eax
Mir3Game.exe+11716 - 2B D1                 - sub edx,ecx
Mir3Game.exe+11718 - 8B CE                 - mov ecx,esi
Mir3Game.exe+1171A - 2B CF                 - sub ecx,edi
Mir3Game.exe+1171C - 80 BB A9460000 00     - cmp byte ptr [ebx+000046A9],00 { 0 }
Mir3Game.exe+11723 - 89 54 24 28           - mov [esp+28],edx
Mir3Game.exe+11727 - 89 4C 24 2C           - mov [esp+2C],ecx
Mir3Game.exe+1172B - 74 1E                 - je Mir3Game.exe+1174B
Mir3Game.exe+1172D - 0FBF 93 A4334D00      - movsx edx,word ptr [ebx+Mir3Game.exe+D33A4]
Mir3Game.exe+11734 - 2B C2                 - sub eax,edx
Mir3Game.exe+11736 - 8B D0                 - mov edx,eax
Mir3Game.exe+11738 - 0FBF 83 A6334D00      - movsx eax,word ptr [ebx+Mir3Game.exe+D33A6]
Mir3Game.exe+1173F - 2B F0                 - sub esi,eax
Mir3Game.exe+11741 - 8B CE                 - mov ecx,esi
Mir3Game.exe+11743 - 89 54 24 28           - mov [esp+28],edx
Mir3Game.exe+11747 - 89 4C 24 2C           - mov [esp+2C],ecx
Mir3Game.exe+1174B - 0FBF B3 E6324D00      - movsx esi,word ptr [ebx+Mir3Game.exe+D32E6]
Mir3Game.exe+11752 - 0FBF 83 E4324D00      - movsx eax,word ptr [ebx+Mir3Game.exe+D32E4]
Mir3Game.exe+11759 - 83 EE 04              - sub esi,04 { 4 }
Mir3Game.exe+1175C - 89 74 24 24           - mov [esp+24],esi                     ' <------ e24 = [ebx+Mir3Game.exe+D32E6] - 4'
Mir3Game.exe+11760 - 8B 35 C42D5700        - mov esi,[Mir3Game.exe+172DC4] { (800) }
Mir3Game.exe+11766 - 81 C6 90000000        - add esi,00000090 { 144 }
Mir3Game.exe+1176C - 0FB7 FE               - movzx edi,si
Mir3Game.exe+1176F - 8B 35 C82D5700        - mov esi,[Mir3Game.exe+172DC8] { (600) }
Mir3Game.exe+11775 - 81 C6 80020000        - add esi,00000280 { 640 }
Mir3Game.exe+1177B - 0FB7 F6               - movzx esi,si
Mir3Game.exe+1177E - 0FBF F6               - movsx esi,si
Mir3Game.exe+11781 - 83 E8 04              - sub eax,04  
Mir3Game.exe+11784 - 89 44 24 20           - mov [esp+20],eax                     ' <------ e20 = [ebx+Mir3Game.exe+D32E4] - 4     ebx = 0x00668330 (物品、怪物共同基址)'    
Mir3Game.exe+11788 - 89 54 24 54           - mov [esp+54],edx
Mir3Game.exe+1178C - C6 83 C2324D00 00     - mov byte ptr [ebx+Mir3Game.exe+D32C2],00 { 0 }
Mir3Game.exe+11793 - C7 83 A04A8A00 00000000 - mov [ebx+Mir3Game.exe+4A4AA0],00000000 { 0 }
Mir3Game.exe+1179D - 89 74 24 50           - mov [esp+50],esi
Mir3Game.exe+117A1 - 3B CE                 - cmp ecx,esi
Mir3Game.exe+117A3 - 0F8D B3090000         - jnl Mir3Game.exe+1215C
Mir3Game.exe+117A9 - 0FBF F7               - movsx esi,di
Mir3Game.exe+117AC - 89 74 24 48           - mov [esp+48],esi
Mir3Game.exe+117B0 - 3B 54 24 48           - cmp edx,[esp+48]                ' <-----第1层循环 Mir3Game.exe+12156 跳回此处'
Mir3Game.exe+117B4 - 0F8D 77090000         - jnl Mir3Game.exe+12131
Mir3Game.exe+117BA - EB 08                 - jmp Mir3Game.exe+117C4
Mir3Game.exe+117BC - 8D 64 24 00           - lea esp,[esp+00]
Mir3Game.exe+117C0 - 8B 44 24 20           - mov eax,[esp+20]                  ' <------第2层循环  Mir3Game.exe+1212B 跳回此处'
Mir3Game.exe+117C4 - 83 7C 24 24 00        - cmp dword ptr [esp+24],00 { 0 }
Mir3Game.exe+117C9 - 0F8C 62090000         - jl Mir3Game.exe+12131
Mir3Game.exe+117CF - 8D 51 20              - lea edx,[ecx+20]
Mir3Game.exe+117D2 - 85 D2                 - test edx,edx
Mir3Game.exe+117D4 - 0F88 57090000         - js Mir3Game.exe+12131
Mir3Game.exe+117DA - 85 C0                 - test eax,eax
Mir3Game.exe+117DC - 0F88 32090000         - js Mir3Game.exe+12114
Mir3Game.exe+117E2 - 8B 44 24 28           - mov eax,[esp+28]
Mir3Game.exe+117E6 - 83 C0 30              - add eax,30 { 48 }
Mir3Game.exe+117E9 - 0F88 25090000         - js Mir3Game.exe+12114
Mir3Game.exe+117EF - 8B 4C 24 28           - mov ecx,[esp+28]
Mir3Game.exe+117F3 - 8B 74 24 20           - mov esi,[esp+20]                                    ' <-- esi = e20'
Mir3Game.exe+117F7 - 3B 0D C42D5700        - cmp ecx,[Mir3Game.exe+172DC4] { (800) }
Mir3Game.exe+117FD - 7D 36                 - jnl Mir3Game.exe+11835
Mir3Game.exe+117FF - 0FBF 93 D9324D00      - movsx edx,word ptr [ebx+Mir3Game.exe+D32D9]
Mir3Game.exe+11806 - 3B F2                 - cmp esi,edx
Mir3Game.exe+11808 - 7D 2B                 - jnl Mir3Game.exe+11835
Mir3Game.exe+1180A - 0FBF 8B DB324D00      - movsx ecx,word ptr [ebx+Mir3Game.exe+D32DB]
Mir3Game.exe+11811 - 8B 44 24 24           - mov eax,[esp+24]
Mir3Game.exe+11815 - 3B C1                 - cmp eax,ecx
Mir3Game.exe+11817 - 7D 1C                 - jnl Mir3Game.exe+11835
Mir3Game.exe+11819 - 8D 55 0C              - lea edx,[ebp+0C]
Mir3Game.exe+1181C - 52                    - push edx
Mir3Game.exe+1181D - 8D 4C 24 30           - lea ecx,[esp+30]
Mir3Game.exe+11821 - 51                    - push ecx
Mir3Game.exe+11822 - 8D 54 24 30           - lea edx,[esp+30]
Mir3Game.exe+11826 - 52                    - push edx
Mir3Game.exe+11827 - 8D 8B B4324D00        - lea ecx,[ebx+Mir3Game.exe+D32B4]
Mir3Game.exe+1182D - 51                    - push ecx
Mir3Game.exe+1182E - 8B D6                 - mov edx,esi
Mir3Game.exe+11830 - E8 7BD30800           - call Mir3Game.exe+9EBB0
Mir3Game.exe+11835 - 0FBF 93 E4324D00      - movsx edx,word ptr [ebx+Mir3Game.exe+D32E4]   // edx =e0
Mir3Game.exe+1183C - 8B 4C 24 24           - mov ecx,[esp+24]                                 ecx = e24
Mir3Game.exe+11840 - 8B C6                 - mov eax,esi
Mir3Game.exe+11842 - 2B C2                 - sub eax,edx                                      e20 - e0
Mir3Game.exe+11844 - 0FBF 93 E6324D00      - movsx edx,word ptr [ebx+Mir3Game.exe+D32E6]      edx = e2
Mir3Game.exe+1184B - 2B CA                 - sub ecx,edx                                      e24-e2
Mir3Game.exe+1184D - 83 C0 03              - add eax,03 { 3 }                                 e20 - e0 +3
Mir3Game.exe+11850 - 83 C1 03              - add ecx,03 { 3 }                                 e24-e2 +3
Mir3Game.exe+11853 - 89 44 24 18           - mov [esp+18],eax                                 e18 = e20 - e0 +3
Mir3Game.exe+11857 - 89 4C 24 14           - mov [esp+14],ecx                                 e14 = e24-e2 +3
Mir3Game.exe+1185B - 85 C0                 - test eax,eax
Mir3Game.exe+1185D - 0F88 B1080000         - js Mir3Game.exe+12114
Mir3Game.exe+11863 - 85 C9                 - test ecx,ecx
Mir3Game.exe+11865 - 0F8C A9080000         - jl Mir3Game.exe+12114
Mir3Game.exe+1186B - 83 F8 5A              - cmp eax,5A { 90 }
Mir3Game.exe+1186E - 0F8D A0080000         - jnl Mir3Game.exe+12114
Mir3Game.exe+11874 - 83 F9 50              - cmp ecx,50 { 80 }
Mir3Game.exe+11877 - 0F8D 97080000         - jnl Mir3Game.exe+12114
Mir3Game.exe+1187D - 33 F6                 - xor esi,esi
Mir3Game.exe+1187F - 89 74 24 1C           - mov [esp+1C],esi
Mir3Game.exe+11883 - 89 74 24 10           - mov [esp+10],esi
Mir3Game.exe+11887 - EB 0B                 - jmp Mir3Game.exe+11894
Mir3Game.exe+11889 - 8D A4 24 00000000     - lea esp,[esp+00000000]
Mir3Game.exe+11890 - 8B 74 24 10           - mov esi,[esp+10]
Mir3Game.exe+11894 - 8B 93 8C558400        - mov edx,[ebx+Mir3Game.exe+44558C]       '<----地面物品标志'
Mir3Game.exe+1189A - 85 D2                 - test edx,edx
Mir3Game.exe+1189C - 0F84 72030000         - je Mir3Game.exe+11C14
Mir3Game.exe+118A2 - 8B 44 24 14           - mov eax,[esp+14]               -- '<------   e14  (一层循环变量)'
Mir3Game.exe+118A6 - 8B 4C 24 18           - mov ecx,[esp+18]                '<------  e18   (二层循环变量)   '
Mir3Game.exe+118AA - 6B C0 5A              - imul eax,eax,5A
Mir3Game.exe+118AD - 03 C8                 - add ecx,eax
Mir3Game.exe+118AF - 8B C1                 - mov eax,ecx
Mir3Game.exe+118B1 - C1 E0 04              - shl eax,04 { 4 }
Mir3Game.exe+118B4 - 2B C1                 - sub eax,ecx
Mir3Game.exe+118B6 - 03 C0                 - add eax,eax
Mir3Game.exe+118B8 - 03 C0                 - add eax,eax
Mir3Game.exe+118BA - 03 C0                 - add eax,eax                        '   <-------- eax =  ( e14*0x5a+e18)*0xf*8'
Mir3Game.exe+118BC - 89 4C 24 34           - mov [esp+34],ecx
Mir3Game.exe+118C0 - 8D 0C 30              - lea ecx,[eax+esi]
Mir3Game.exe+118C3 - 39 94 8B 944B0000     - cmp [ebx+ecx*4+00004B94],edx           ' <---与地面物品标志一样,则为物品不跳转'
Mir3Game.exe+118CA - 0F85 44030000         - jne Mir3Game.exe+11C14
Mir3Game.exe+118D0 - 03 C6                 - add eax,esi
Mir3Game.exe+118D2 - 8B BC 83 CC4A0000     - mov edi,[ebx+eax*4+00004ACC]            ' <----------  物品基址 = [ebx+eax*4+00004ACC] '
Mir3Game.exe+118D9 - 85 FF                 - test edi,edi
Mir3Game.exe+118DB - 0F84 21030000         - je Mir3Game.exe+11C02
Mir3Game.exe+118E1 - 0FBF 47 18            - movsx eax,word ptr [edi+18]                ' <----------   断在这儿,edi = 地面物品的地址'  
Mir3Game.exe+118E5 - 0FBF 93 E4324D00      - movsx edx,word ptr [ebx+Mir3Game.exe+D32E4]

...(循环距离比较远,省略部分代码...)

Mir3Game.exe+120F3 - 8B 57 0C              - mov edx,[edi+0C]
Mir3Game.exe+120F6 - 89 72 04              - mov [edx+04],esi
Mir3Game.exe+120F9 - 89 77 0C              - mov [edi+0C],esi
Mir3Game.exe+120FC - 89 7E 08              - mov [esi+08],edi
Mir3Game.exe+120FF - FF 47 18              - inc [edi+18]
Mir3Game.exe+12102 - 8B 44 24 10           - mov eax,[esp+10]
Mir3Game.exe+12106 - 40                    - inc eax
Mir3Game.exe+12107 - 89 44 24 10           - mov [esp+10],eax
Mir3Game.exe+1210B - 83 F8 0A              - cmp eax,0A { 10 }
Mir3Game.exe+1210E - 0F8C 3CFEFFFF         - jl Mir3Game.exe+11F50
Mir3Game.exe+12114 - 8B 44 24 28           - mov eax,[esp+28]
Mir3Game.exe+12118 - FF 44 24 20           - inc [esp+20]                  '   e20++'
Mir3Game.exe+1211C - 8B 4C 24 2C           - mov ecx,[esp+2C]
Mir3Game.exe+12120 - 83 C0 30              - add eax,30 { 48 }
Mir3Game.exe+12123 - 89 44 24 28           - mov [esp+28],eax
Mir3Game.exe+12127 - 3B 44 24 48           - cmp eax,[esp+48]
Mir3Game.exe+1212B - 0F8C 8FF6FFFF         - jl Mir3Game.exe+117C0          ' <----------跳回第二层循环'
Mir3Game.exe+12131 - 0FBF 83 E4324D00      - movsx eax,word ptr [ebx+Mir3Game.exe+D32E4]           '  e0'
Mir3Game.exe+12138 - FF 44 24 24           - inc [esp+24]                    ' e24++'
Mir3Game.exe+1213C - 8B 54 24 54           - mov edx,[esp+54]
Mir3Game.exe+12140 - 83 C1 20              - add ecx,20 { 32 }
Mir3Game.exe+12143 - 83 E8 04              - sub eax,04 { 4 }
Mir3Game.exe+12146 - 89 4C 24 2C           - mov [esp+2C],ecx
Mir3Game.exe+1214A - 89 54 24 28           - mov [esp+28],edx
Mir3Game.exe+1214E - 89 44 24 20           - mov [esp+20],eax                  '初始化   e20 = e0'
Mir3Game.exe+12152 - 3B 4C 24 50           - cmp ecx,[esp+50]
Mir3Game.exe+12156 - 0F8C 54F6FFFF         - jl Mir3Game.exe+117B0        ' <--------跳回第一层循环'
Mir3Game.exe+1215C - 8B 83 CC460000        - mov eax,[ebx+000046CC]
Mir3Game.exe+12162 - 85 C0                 - test eax,eax


周边地面物品的函数有点复杂,整理如下:

=====CE lua script 函数 ===========================================
function findGoods() 
  local gds={}
  local goodsBase = addrGoodsMonsBase--0x00668330 此基址与周围边人物、NPC的基址一样
  e2 =readSmallInteger(goodsBase+0x004D32E4) - 4
  e24=e2
  e0 = readSmallInteger (goodsBase+0x004D32E6) -4
  e20=e0
  goodsF =readInteger(goodsBase+0x0084558c)
  for i=0,0x11 do
    for j=0 ,0x16 do
      e18 = e20- e0 +3
      e14 =e24-e2+3
      tmp2 =  ( e14*0x5a+e18)*0xf*8
      goodsHave =readInteger(goodsBase+tmp2*4+0x004b90)
      if (goodsHave == goodsF) then
        local base1 =readInteger(goodsBase+tmp2*4+0x004AC8)
        if base1==0 then
           return gds
        end
        goodbytes = readBytes(base1,0x78,true)  --获取物品数据0x78个字节,用于分析物品属性
        s= "tmp2:"..tmp2.."   bytes:"
        for i, v in ipairs(goodbytes) do
          s=s..string.format("%02x",v).." "
        end
        --log(s)
        local addr1 = readString(base1+0x25)
        local x =readSmallInteger(base1+0x15)
        local y =readSmallInteger(base1+0x17)
        local id = readSmallInteger(base1+0x11)
        local  addr2 = ansiToUtf8(addr1)

        local good={}
        good["x"] =x
        good["y"]=y
        good["name"]=addr2
        good["id"] = id
        table.insert(gds,good)
        s = string.format("%s[id:%d][%d,%d] - ",addr2,id,x,y)..s
        logF(s)
      end
     e20 = e20+1
   end
   e20=e0
   e24 = e24+1
  end
  return gds
end
posted on 2026-06-11 10:25  wangbeng  阅读(12)  评论(0)    收藏  举报