武林人物包裹地址方法  
  1. 先用CE找到对应数值(比如物品的数量)的内存地址。
  2. 用CE的“谁改写了这个地址”功能找到哪条指令修改了该数值。记下该指令的地址。
    0048F0AB     mov     dword ptr [ecx+14], edx
  3. 用OD打开目标进程,Ctrl+G转到表达式0048F0AB
    可以看到这条指令是在一个函数中
  4. 0048F0A0 /$ 8B4424 04     mov     eax, dword ptr [esp+4]     //参数1 我们使用了这个物品(比如吃药)下断点
    0048F0A4 |. 8B51 14       mov     edx, dword ptr [ecx+14]    //参数2
    0048F0A7 |. 03D0          add     edx, eax
    0048F0A9 |. 8BC2          mov     eax, edx
    0048F0AB |. 8951 14       mov     dword ptr [ecx+14], edx    //此处是改写的指令地址 存放的当前物品的数量
    0048F0AE |. 85C0          test    eax, eax
    0048F0B0 |. 7D 07         jge     short 0048F0B9
    0048F0B2 |. C741 14 00000>mov     dword ptr [ecx+14], 0
    0048F0B9 |> 8B41 18       mov     eax, dword ptr [ecx+18]    //当前物品堆叠上限
    0048F0BC |. 8B51 14       mov     edx, dword ptr [ecx+14]    //存放的当前物品的数量
    0048F0BF |. 3BD0          cmp     edx, eax                    //比较 存放的当前物品的数量 和 当前物品堆叠上限
    0048F0C1 |. 7E 03         jle     short 0048F0C6           
    0048F0C3 |. 8941 14       mov     dword ptr [ecx+14], eax
    0048F0C6 |> 8B41 14       mov     eax, dword ptr [ecx+14]
    0048F0C9 /. C2 0400       retn     4
  5. 我们在开始的地方F2下断,F8单步步过看看每条指令都做了些什么...
    粗略的看一下,可以发现,当前CALL传入的参数1也就是[ESP+4]是-1,也就是我们使用了这个物品(比如吃药),[ECX+14]是存放的当前物品的数量,而[ECX+18]上存放的当前物品堆叠上限...(16进制的)
  6. 再看看程序流程,基本可以看出这个函数的功能是判断当前使用的物品是否超出1~99这个范围,也就是判断是否用完了或者是捡满了...
  7. 那么找包裹物品的地址,我们就要找出ECX的值是怎么来的!!!
    OK,Ctrl+F9执行到返回,我们来看看是哪条指令调用了这个CALL...
    返回到指令:
    0048908D |. E8 0E600000     call     0048F0A0
  8. 老习惯,我们上下拖动大致看看这段指令有多长...(其实主要是大概要回溯多长,因为我们要找ECX的值)
    00489060 /$ 53           push     ebx
    00489061 |. 8B5C24 08     mov     ebx, dword ptr [esp+8]
    00489065 |. 56           push     esi
    00489066 |. 57           push     edi
    00489067 |. 85DB         test     ebx, ebx   
    00489069 |. 8BF9         mov     edi, ecx                //ECX是由上一级函数传入的,
    0048906B |. 7C 3E         jl       short 004890AB
    0048906D |. 3B5F 10       cmp     ebx, dword ptr [edi+10]
    00489070 |. 7D 39         jge     short 004890AB
    00489072 |. 8B47 0C       mov     eax, dword ptr [edi+C]
    00489075 |. 8B3498       mov     esi, dword ptr [eax+ebx*4]    //下断点 发现EBX的值实际上就是我们点击包裹的格子序号
    00489078 |. 85F6         test     esi, esi
    0048907A |. 75 08         jnz     short 00489084
    0048907C |. 5F           pop     edi
    0048907D |. 5E           pop     esi
    0048907E |. B0 01         mov     al, 1
    00489080 |. 5B           pop     ebx
    00489081 |. C2 0800       retn     8
    00489084 |> 8B4C24 14     mov     ecx, dword ptr [esp+14]
    00489088 |. F7D9         neg     ecx
    0048908A |. 51           push     ecx
    0048908B |. 8BCE         mov     ecx, esi
    0048908D |. E8 0E600000     call     0048F0A0            //此处调用
  9. 先看看指令,发现ECX=ESI,往上ESI=[EAX+EBX*4],OK!!!我们在
    00489075 |. 8B3498       mov     esi, dword ptr [eax+ebx*4]
    处下断...
  10. 发现EBX的值实际上就是我们点击包裹的格子序号(当然,人家是从0开始计数的...)
    恩,有门...再就是找EAX的值是怎么来的了...
    往上看,EAX=[EDI+C],EDI=ECX...
    没办法,ECX是由上一级函数传入的,好吧,继续Ctrl+F9...
    转到指令
    00457724 |. E8 37190300     call     00489060
  11. 还是上下看看...有点长,中间还有好几个CALL,郁闷...
    004576B0 /$ 8B4424 04     mov     eax, dword ptr [esp+4]
    004576B4 |. 53           push     ebx
    004576B5 |. 55           push     ebp
    004576B6 |. 56           push     esi
    004576B7 |. 8B70 0C       mov     esi, dword ptr [eax+C]
    004576BA |. 8BD9         mov     ebx, ecx
    004576BC |. 33C9         xor     ecx, ecx
    004576BE |. 57           push     edi
    004576BF |. 8A0E         mov     cl, byte ptr [esi]
    004576C1 |. 51           push     ecx            //push ecx的时候ECX是0
    004576C2 |. 8BCB         mov     ecx, ebx         //这个EBX的值很熟,后来一想,这个值不就是人物属性地址[[8BCB44]+1C]+24的值么
    004576C4 |. E8 C7860000     call     0045FD90     //对于高级语言,编译器一般习惯于将返回值放如EAX中          
    004576C9 |. 8BE8         mov     ebp, eax        // 此时 eax = 上面函数的返回值。
    004576CB |. 85ED         test     ebp, ebp
    004576CD |. 0F84 AC000000 je       0045777F
    004576D3 |. 33D2         xor     edx, edx
    004576D5 |. 6A 00         push     0
    004576D7 |. 8A56 01       mov     dl, byte ptr [esi+1]
    004576DA |. 8BCD         mov     ecx, ebp
    004576DC |. 52           push     edx
    004576DD |. E8 EE0F0300     call     004886D0
    004576E2 |. 8BF8         mov     edi, eax
    004576E4 |. 85FF         test     edi, edi
    004576E6 |. 0F84 93000000 je       0045777F
    004576EC |. 8B46 02       mov     eax, dword ptr [esi+2]
    004576EF |. 8B4F 08       mov     ecx, dword ptr [edi+8]
    004576F2 |. 3BC8         cmp     ecx, eax
    004576F4 |. 0F85 85000000 jnz     0045777F
    004576FA |. 6A 00         push     0                       ; /Arg3 = 00000000
    004576FC |. 6A 00         push     0                       ; |Arg2 = 00000000
    004576FE |. 50           push     eax                       ; |Arg1
    004576FF |. 8BCB         mov     ecx, ebx                   ; |
    00457701 |. E8 9A4A0200     call     0047C1A0                   ; /elementc.0047C1A0
    00457706 |. 8B07         mov     eax, dword ptr [edi]
    00457708 |. 8BCF         mov     ecx, edi
    0045770A |. FF50 1C       call     dword ptr [eax+1C]
    0045770D |. 66:8B46 06     mov     ax, word ptr [esi+6]
    00457711 |. 66:85C0       test     ax, ax
    00457714 |. 74 3C         je       short 00457752
    00457716 |. 33C9         xor     ecx, ecx
    00457718 |. 25 FFFF0000     and     eax, 0FFFF
    0045771D |. 8A4E 01       mov     cl, byte ptr [esi+1]
    00457720 |. 50           push     eax
    00457721 |. 51           push     ecx
    00457722 |. 8BCD         mov     ecx, ebp
    00457724 |. E8 37190300     call     00489060
    打起精神,记住我们要找的是ECX的值...
    仔细看,就可以看出,ECX=EBP,而EBP=EAX
    004576DA |. 8BCD         mov     ecx, ebp
    004576C9 |. 8BE8         mov     ebp, eax
  12. 从函数开始下断,我们看看是什么指令修改了EAX的值...
    恩,mov ebp, eax上面有个CALL,大家都应该知道对于高级语言,编译器一般习惯于将返回值放如EAX中的吧...
  13. 二话不说,先进call 0045FD90里面看看是个什么情况...
    0045FD90 /$ 8B4424 04     mov     eax, dword ptr [esp+4]
    0045FD94 |. 83F8 04       cmp     eax, 4                     ; Switch (cases 0..4)
    0045FD97 |. 77 34         ja       short 0045FDCD
    0045FD99 |. FF2485 D4FD45>jmp     dword ptr [eax*4+45FDD4]
    0045FDA0 |> 8B81 3C080000 mov     eax, dword ptr [ecx+83C]         ; Case 0 of switch 0045FD94
    0045FDA6 |. C2 0400       retn     4
    0045FDA9 |> 8B81 40080000 mov     eax, dword ptr [ecx+840]         ; Case 1 of switch 0045FD94
    0045FDAF |. C2 0400       retn     4
    0045FDB2 |> 8B81 44080000 mov     eax, dword ptr [ecx+844]         ; Case 2 of switch 0045FD94
    0045FDB8 |. C2 0400       retn     4
    0045FDBB |> 8B81 78080000 mov     eax, dword ptr [ecx+878]         ; Case 3 of switch 0045FD94
    0045FDC1 |. C2 0400       retn     4
    0045FDC4 |> 8B81 7C080000 mov     eax, dword ptr [ecx+87C]         ; Case 4 of switch 0045FD94
    0045FDCA |. C2 0400       retn     4
    0045FDCD |> 33C0         xor     eax, eax                   ; Default case of switch 0045FD94
    0045FDCF /. C2 0400       retn     4
    0045FDD2       8BFF         mov     edi, edi
    0045FDD4     . A0FD4500       dd       elementc.0045FDA0             ; 分支表 被用于 0045FD99
    0045FDD8     . A9FD4500       dd       elementc.0045FDA9
    0045FDDC     . B2FD4500       dd       elementc.0045FDB2
    0045FDE0     . BBFD4500       dd       elementc.0045FDBB
    0045FDE4     . C4FD4500       dd       elementc.0045FDC4
  14. 发现是个分支处理的函数,至于吃药是怎么分支的,我们先出去看看这个参数[ESP+4]和ECX的值是怎么来的...
    004576BF |. 8A0E         mov     cl, byte ptr [esi]
    004576C1 |. 51           push     ecx
    004576C2 |. 8BCB         mov     ecx, ebx
    004576C4 |. E8 C7860000     call     0045FD90
  15. 下断,可以知道push ecx的时候ECX是0,而mov ecx,ebx的时候不知道大家看出来什么没有...
    当时我就觉得这个EBX的值很熟,后来一想,这个值不就是人物属性地址[[8BCB44]+1C]+24的值么...
    而且,吃药的时候,那个CALL要传入的参数始终是0...
  16. 至此,所有的我们需要的信息都找到了...那我们就可以总结了...
    1. [[[[8BCB44]+1C]+24]+83C]+10 的值是角色包裹最大容量...
    2. [[[[8BCB44]+1C]+24]+83C]+C 是角色包裹首地址...
    3. [[[[[8BCB44]+1C]+24]+83C]+C]+4*格子序号 是格子物品首地址...
    4. [[[[[[8BCB44]+1C]+24]+83C]+C]+4*格子序号]+14 是此格物品的数量...
    5. [[[[[[8BCB44]+1C]+24]+83C]+C]+4*格子序号]+18 是此格物品的堆叠上限...

查找游戏里数据存放的内存位置相关推荐

  1. 如何提高游戏后台数据查找效率

    在游戏后台中,内存的数据查找是一个很重要,也是关系到我们游戏的后台效率的问题. 在大量的数据中,我们如何让我们的的程序能够快速的查找到我们所想要的数据呢.那么我们就要使用相应的算法了. 首先,我们所有 ...

  2. 安卓游戏数据包 android文件夹将被替换 可以同意么,安卓游戏数据包放哪里位置?安卓游戏数据包安装的注意事项...

    安卓游戏数据包放哪里位置?安卓游戏数据包和安卓游戏本体虽然是两回事,但还是有一些大型游戏厂商将游戏数据包与本体APP集成在一起的,不过大部分大型安卓游戏需要用户自行下载数据包,且要放入指定位置. 安卓 ...

  3. mysql数据放在什么位置,mysql数据存放的位置在哪

    MySQL数据库存放位置: 1.MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm..MYD..MYI,默认存放位置是 C:\Documentsand Settings\AllUse ...

  4. MATLAB多个for循环嵌套的执行顺序、如何将生成的数据存放在一个向量或矩阵里?

    MATLAB中多个for循环嵌套的执行顺序: 当有两个for循环时,先执行一次外部for循环,再将内部循环全部执行. 当有三个for循环时,先执行一次最外部for循环,再执行一次第二层for循环,最后 ...

  5. 面向大数据的异构内存系统

    面向大数据的异构内存系统 王孝远, 廖小飞, 刘海坤, 金海 华中科技大学计算机学院,湖北 武汉 430074 摘要:受限于DRAM和新型非易失性存储器(non-volatile memory,NVM ...

  6. JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎的灵虚拷问,你能坚持到第几问?

    因为热爱所以坚持,因为热爱所以等待.熬过漫长无戏可演的日子,终于换来了人生的春天.他逐渐被人熟知,被人喜爱 三年前,在苏州园区某个国企面试,第一道题目便是:JVM是什么吗?然后就是拿着笔试题目被面试官 ...

  7. 把数据转换为在内存中Tree(树形结构)。_备战秋招:一文搞定数据库常见面试题...

    点击上方"蓝字",关注了解更多 1.数据库范式 第一范式:列不可分,eg:[联系人](姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF: 第 ...

  8. Intel GPU实现游戏与数据中心

    Intel GPU实现游戏与数据中心 在Intel Architecture Day上,Intel谈到了面向游戏玩家的Xe-HPG架构Alchemist GPU以及面向数据中心的Xe-HPC架构GPU ...

  9. opencv查找边界_数据边界:查找差距,孤岛等

    opencv查找边界 One of the more difficult challenges we face when analyzing data is to effectively identi ...

  10. 游戏服务器 数据同步方案

    游戏数据同步方案 首先我们介绍实时对战手游中最难解决的技术问题--弱网络下的数据同步问题. 通过对玩家的游戏数据进行观察,发现玩家的游戏环境存在很大差异,不同玩家会使用不同的2G/3G/4G/Wifi ...

最新文章

  1. 对实施运维的一点心得体会
  2. 六大赚钱定律,让你赚大钱
  3. React + TypeScript 实现泛型组件
  4. ubuntu如何杀死进程
  5. 持续定义Saas模式云数据仓库+BI
  6. 使用unity开发游戏时如觉得游戏声音太吵,点Mute Audio
  7. AngularJS-webapp($q)
  8. BC95(ML5515)连接TCP流程
  9. Labview 气体/温度检测系统
  10. 华硕笔记本显示服务器不可用,华硕笔记本电脑开不了热点咋办
  11. js Shadow DOM
  12. 《阵列信号处理及MATLAB实现》绪论、矩阵代数相关内容总结笔记
  13. 上传图片保存到mysql数据库并在网页上显示
  14. SVG动画解释-学习笔记
  15. 【云原生 | Kubernetes 系列】1个POD2个container实现Wordpress K8s部署
  16. java实现pdf文件下载
  17. WSN(1):第一章  绪论
  18. 单片机应用系统设计技术——基于51单片机篮球计时计分器的设计
  19. C基础第39课--程序中的三国天下--栈,堆,静态存储区
  20. 设备选型(选择交换机、选择路由器的技能指标)

热门文章

  1. 波哥让我总结学习中遇到的ES6新增特性
  2. java 生成分享图片(二维码,图片拼接,文字编辑)
  3. 语音合成api_语音合成API
  4. TIKZ画FJSP中的甘特图-Trans必备
  5. 微信发视频怎么不压缩画质?试试这几招
  6. 英语单词-2021.2.19
  7. 在网页中输入中文进行搜索,如何获取搜索后页面的URL(python urliib中quote的使用)
  8. mpc_local_planner安装及使用
  9. 北大2021年计算机分数分数线,2021年高考多少分能上北京大学?附北京大学全国各省录取分数线2020年...
  10. 原生Camera预览分辨率自定义修改