我就是个菜逼 很菜的那种 就是做个记录 以后忘了可以复习下 也顺便分享下自己的学习思路方法
因为天龙八部人物信息是二叉树结构,所以通过CE没办法直接跟到基址,会进入一个循环,所以我们通过OD来跟踪
还是要先通过CE找到当前血地址
搜索当前血地址 发现只有3个选项 我们通过打坐改变血值 发现只有一个地址的值 在跟着变化
这样我们就省事了 直接在OD跟这个来源就行了

然后在OD里面 DD这个地址 下一个写入断点 也就是说当 这个地址被写入的时候就断下 然后我们跟踪来源

下断后 我们继续通过打坐 改变血值 这样就会断下
断下后 我们删除硬件断点 不然会一直断下

然后 点击删除 我们刚刚下的那个断点 然后按F9 或者点那个运行按钮 让游戏运行起来 断太久游戏可能会断开
断下后 我们要看断下的上一行代码 才是我们需要的地方

mov dword ptr ds:[ecx+0x2CF0],eax
吧eax 写到 [ecx+0x2CF0] 我们发现eax就是我们的血值 大家可以转成10进制看下
也就是说 [ecx+0x2CF0] 就是当前血 我们可以自己坐下标记 或者直接在OD中注释
这时候 我们就要找ECX的来源
往上翻 找ECX 在哪里被赋值
我们发现往上翻第三行发现 有这样一句代码
014B5658 8B4E 04 mov ecx,dword ptr ds:[esi+0x4] ;
也就是说 ECX来源[esi+0x4]
这时候 血地址是这样的 [esi+0x4]+0x2CF0
我们继续往上翻 到子程序头部

014B546A 8BF1 mov esi,ecx
发现 esi来源于ecx (一个小提示: ecx一般会来源一个全局变量,也就是说他不是在函数内部赋值的 ecx的赋值会在调用这个函数的地方)
这时候 血地址是这样的 [ecx+0x4]+0x2CF0
014B5440 55 push ebp 我们一直看到这行 也就是头部 也么有看到对ecx赋值的地方
正如上面所说 ecx来源于一个全局 或者 程序集变量 也就是说 他是在调用这个函数的地方赋值的
所以这时候 我们要在头部下断点 继续跟ECX的来源
014B5440 55 push ebp 也就是在这句代码处 下断 然后我们改变当前血 就会断下来

我们直接在反汇编窗口中跟随

我们看上一行 也就是
01777414 E8 27E0D3FF call Game.014B5440 这个地方是调用 刚刚那个函数
这个 014B5440 正是我们刚刚 那个头部地址
我们继续找ECX来源于哪里
发现 上面就有一句 01777412 8BCB mov ecx,ebx
他来源于ebx 这时候血地址就是 [ebx+0x4]+0x2CF0
我们就要继续找ebx的来源 往上看

发现这样一句代码
017773BC 8B9E B4010000 mov ebx,dword ptr ds:[esi+0x1B4] ;
这时候血地址就是 [[esi+0x1B4]+0x4]+0x2CF0

017773A8 FF50 48 call dword ptr ds:[eax+0x48]
017773AB 8BF0 mov esi,eax
我们发现esi来源eax
这时候我们的血地址就是 [[eax+0x1B4]+0x4]+0x2CF0
按照上面的套路 我们可能会往上看eax来源于哪里
但是这里不是这样的
需要注意的是 eax一般是函数的返回值 也就是call执行完的返回值 会赋值给eax
所以 这时候 我们要看他上面是否有执行call 如果有 我们要进call内部 找eax的来源
发现上面刚好有一句 call dword ptr ds:[eax+0x48] 但是这好像不是个固定地址
所以我们要下断 游戏断下后 然后F7进入call内部 找eax来源
其实这里call内部就是在遍历附近对象二叉树
而我们这里在这里调用二叉遍历 其实是在遍历周围环境 包括人物怪物Npc 箱子 采集物等 因为我们是在跟踪人物信息 我们自己其实也在这个二叉树结构内
这也就是为什么 我们会通过CE跟不到基址 进入一个循环
进入这个call内部

天龙的这个 就是标准的二叉树遍历
不懂的网上百度搜一下 我也不懂 百度随便看了下
给大家搜了个 通俗易懂的例子 但凡学过编程 且入门了
https://www.cnblogs.com/VectorZhang/p/5603358.html 应该是看得懂的
先到这里 下一节 分析二叉树结构
网友评论