天龙八部查找怪数据数组的内存分布和地址(三)(转载)游戏:天龙八部,版本:0.16.0108,系统windowsxp,工具:CE5.2+OD1.10+C#2005目标:查找到内存中怪数据的数组格式和位置首先更正笔记1中的人物基址的查找方法,具体查找方法以下简单说明:1.CE中根据人物经验或血找到某唯一地址(实际中我是根据经验的)2.OD中对经验地址下内存写断点0044BC288B460CMOVEAX,DWORDPTRDS:[ESI+C]此处为写经验地址,得到第二个偏移值C和地址ESI的值0044BC2B89B8C0060000MOVDWORDPTRDS:[EAX+6C0],EDI此处为写经验,得到第一个偏移值6C0和地址EAX的值0044BC318B0DC4B75B00MOVECX,DWORDPTRDS:[5BB7C4]0044BC378B11MOVEDX,DWORDPTRDS:[ECX]0044BC396804755700PUSHGame.00577504;ASCII"player"0044BC3E6A1DPUSH1D0044BC40FF524CCALLDWORDPTRDS:[EDX+4C]3.OD中逆向分析004D82D055PUSHEBP……………………省略……………………………………………………………………………………004D82F6FF5244CALLDWORDPTRDS:[EDX+44]004D82F98BD8MOVEBX,EAX;ebx=eax004D82FB85DBTESTEBX,EBX004D82FD0F848F080000JEGame.004D8B92004D830333C0XOREAX,EAX004D83058A460CMOVAL,BYTEPTRDS:[ESI+C]004D830857PUSHEDI004D83098BBB2C020000MOVEDI,DWORDPTRDS:[EBX+22C];edi=ebx+22c,此处的ebx得到第三个偏移值22C和地址ebx值004D830F83E001ANDEAX,1……………………省略……………………………………………………………………………………004D838AE84137F7FFCALLGame.0044BAD0;调用经验获取函数4.发现此处ebx的值切换地图时不变,始终偏移三次后能取到经验(笔记一中认为这时的ebx已经是基地址,此处更正),对ebx的地址下内存写访问断点,得到下面代码片段005019578945F0MOVDWORDPTRSS:[EBP-10],EAX0050195AA188895B00MOVEAX,DWORDPTRDS:[5B8988];基地址5b58880050195F57PUSHEDI005019608BF9MOVEDI,ECX005019628B4844MOVECX,DWORDPTRDS:[EAX+44];第四个偏移值4400501965894F08MOVDWORDPTRDS:[EDI+8],ECX;写地址005019688B11MOVEDX,DWORDPTRDS:[ECX]0050196AFF523CCALLDWORDPTRDS:[EDX+3C]总结,人物数据地址=[[[5B8988]+44]+22C]+C,经验值=[人物数据地址+6C0]好了,接下来开始寻找怪数组了找内存地址这几天学下来已经比较熟练了,所以后面的步骤简写,只写方法和关键步骤第一步:CE中查找当前地图某个怪的名称(text)格式的,找出一堆地址来。切换怪区域,发现哪些地址有变化,结果有几个地址有变化,这几个地址特征是比较接近,猜测可能是数组中某几项,查看该内存区域,截取片段如下:028166600200000041F10F43\u0002A?C02816668000000003F575B42.?W[B028166700000000000000000..02816678B5C1C4B9D0A1D4F4盗墓小贼028166800000000000000000..02816688080000000F000000\u0008\u000F02816690F500000000000000?02816698000000002D231043.-#\u0010C028166A0000000008C9B8342.寷傿028166A80000000000000000..028166B0B5C1C4B9D0A1D4F4盗墓小贼028166B800B4B6FEB2E30000.炊?.028166C0080000000F000000\u0008\u000F028166C8EC00000000000000?028166D0000000006B8F1843.k?C028166D8000000004F402642.O@B028166E00000000000000000..028166E8B5C1C4B9D0A1D4F4盗墓小贼028166F000B4B6FEB2E30000.炊?.028166F8080000000F000000\u0008\u000F02816700E900000000000000?02816708000000002FDB1B43./?C02816710000000001EBA5242.\u001E篟B028167180000000000000000..经分析发现其中存了怪坐标,名称,编号,类型等数据第二步:OD中对自己认为最有把握的地址下内存写访问断点,得到代码如下:7C36434489448FE4MOVDWORDPTRDS:[EDI+ECX*4-1C],EAX7C3643488B448EE8MOVEAX,DWORDPTRDS:[ESI+ECX*4-18]7C36434C89448FE8MOVDWORDPTRDS:[EDI+ECX*4-18],EAX7C3643508B448EECMOVEAX,DWORDPTRDS:[ESI+ECX*4-14]7C36435489448FECMOVDWORDPTRDS:[EDI+ECX*4-14],EAX7C3643588B448EF0MOVEAX,DWORDPTRDS:[ESI+ECX*4-10]7C36435C89448FF0MOVDWORDPTRDS:[EDI+ECX*4-10],EAX7C3643608B448EF4MOVEAX,DWORDPTRDS:[ESI+ECX*4-C]7C36436489448FF4MOVDWORDPTRDS:[EDI+ECX*4-C],EAX7C3643688B448EF8MOVEAX,DWORDPTRDS:[ESI+ECX*4-8]7C36436C89448FF8MOVDWORDPTRDS:[EDI+ECX*4-8],EAX7C3643708B448EFCMOVEAX,DWORDPTRDS:[ESI+ECX*4-4]7C36437489448FFCMOVDWORDPTRDS:[EDI+ECX*4-4],EAX7C3643788D048D00000000LEAEAX,DWORDPTRDS:[ECX*4]第三步:中断后逆向分析代码退后几步代码如下:0050143E8B0D50895B00MOVECX,DWORDPTRDS:[5B8950];基地址005014448B11MOVEDX,DWORDPTRDS:[ECX]00501446FF5254CALLDWORDPTRDS:[EDX+54]如上红色部分为基地址,怪物数组的起始地址为[5B8950]+7C