一些无主函数相关定位 - cngege/Mod GitHub Wiki

  • 本地环境接受消息

函数:特征码定位太长
1.19.50.02:Minecraft.Windows.exe+3993D0
上一个调用者处:E8 ? ? ? ? 48 81 46 ? ? ? ? ? EB ? 4C 8B C5 48 8B D0

该函数接受一个参数,像是一个结构或类
01 00 00 00 0-3这是前四个字节 01:收到聊天消息,03:玩家进退房提示
? ? ? ? 4-7 这四个字节 作用未知
? - ? 8-63 聊天消息内容
?-? 64-95 发生消息的玩家名称

怎么看这个结构?
在CE中定位到 这个函数的调用处 Call的上一行 mov rcx,rax
断点看 rax 是一个指针
内存中看这个指针
就能看到相关结构了

  • 矿物透视

》》StructureManager::loadPlacementQueue 》》 被优化 》》
首先在 Actor虚表里面找到 Actor::onEffectAdded 方法
(至于是否必须是Actor::onEffectAdded 方法,答案是否定的)
我们在ida中看 Actor::getDimensionConst 的调用者 我们只需要能够定位到 Actor::getDimensionConst 的其中一个调用者即可 因为我们先要定位到 Actor::getDimensionConst 方法

在 IDA中打开WIN10版的 符号库文件 i64
在 ida中定位到 Actor::onEffectAdded 这个方法
对比 两个版本的ida pro 找到 Actor::getDimensionConst 函数
(这里可以找到 Dimension::sendPacketForEntity 函数 以及 MobEffectPacket::MobEffectPacket 构造函数的实现方法 ) 通过上面得到的函数
获取一个维度并且获取它的虚表
通过虚表 获取Dimension::init 这个方法的地址
通过两个ida对比 找到 StructureManager::loadPlacementQueue 这个方法
进入这个方法再对比两个ida就能看到BlockLegacy::getRenderLayer的调用处
然后通过对比你就会发现 狗日的 BlockLegacy::getRenderLayer 被优化了

通过 Diamension 虚表 找到 Dimension::Tick
这个tick里面能找到:
Weather::tick
Seasons::tick
VillageManager::tick
StructureManager::tick

对比ida找到StructureManager::tick
进入后
然后在这个tick中找到 StructureManager::_savePlacementQueueItem
狗日的 这里面的调用也被优化了

方法N
//8B 81 B4 00 00 00 C3 CC CC CC CC CC CC CC CC CC
//8B 81 B4 00 00 00 C3 CC CC CC CC CC CC CC CC CC F3 0F 10 81
首先找到 基岩版服务器的 ida中的 BlockLegacy::getRenderLayer 方法,看这个方法开始第三个字节往后的四个字节是什么 (比如上面的注释中的字节就是 B4 00 00 00)
替换上面注释中的对应四个字节
然后搜索这个特征码
一般能搜到
然后看看 这个特征码最后的CC 后面的几个字节是什么
比如是 F3 0F 10 81
我们把这四个字节补到 CC 后面
然后 把第三个到第六个共四个字节替换为 ? ? ? ?
最终得到类似下面的特征码:
//8B 81 ? ? ? ? C3 CC CC CC CC CC CC CC CC CC F3 0F 10 81
然后我们尝试搜索这个特征码
看看是不是搜索到同一个地址

  • PlayerInventory:: 系列非虚表函数

首先从玩家背包类中找到一个没有被优化的函数
或者说是不易被优化的函数(函数的内容较多)
这里找的是 PlayerInventory::clearVanishEnchantedItemsOnDeath 函数
调用处在 ServerPlayer::clearVanishEnchantedItemsOnDeath
该函数刚好在 ServerPlayer的虚表中能找到 大概在333的位置
(PlayerInventory::clearVanishEnchantedItemsOnDeath 在1.19.51.01中是 sub_1418EB0D0)
在 两个ida中找到这个函数
内容不多,对比找到 PlayerInventory::clearVanishEnchantedItemsOnDeath 函数
进入 鼠标点击函数名 然后按下 tab
在汇编中对比上下的函数,函数参数, 就知道这些函数是什么名字了
FillingContainer::FillingContainer 构造函数被找到 sub_1417B00F0 1.19.51
而且里面含有 Container 构造函数
通过对比能找到以下的函数:

PlayerInventory::dropAllOnDeath(A,B) char __fastcall sub_1418EB2A0(__int64, unsigned __int8)
1.19.51定位函数下的 第二个 函数 (这个函数同样在 Player::die 被调用 未被优化)
另外 该函数的源码中 第一个调用的函数 的参数就是this+24(24个指针(8字节)) 也就是192字节 192的16进制即C0, 汇编代码中可以看到 从函数开头偏移29字节后即是该C0值的所在位置

PlayerInventory::createTransactionContext
__int64 __fastcall sub_1418EB370(__int64 a1, __int64 a2, __int64 a3)
1.19.51 .。。。 第三个。。。