(пишу просто так если ты вдруг не знал или если не тебе так мб другим пригодится. кр4 на будущее просто так к слову)
вместо того чтобы хукать "конструктор"(ну "создатель") нетчана, и потом из него доставать нетчан и уже потом хукать в нетчане, ты можешь сделать сигу на хреф на вмт нетчана(хрефы на вмт есть в конструкторе и деструкторе(ну кто-то же записывает вмт в [rcx+0] правильно? это конструктор делает. деструктор при деструкции тоже восстанавливает оригинальную вмт своей порции(у каждой наследованной порции свой конструктор и деструктор. их много) в случае классов с наследованием)), делаешь сигу на конструктор, из него из хрефа берешь вмт и потом сразу просто в самой вмт хукаешь. вовсе не нужна сама инстанция нетчана - нужна только сама вмт. для шедоу вмт(это подмена самой втейблы в инстанции(на свою собственную которая является копией оригинала и при этом содержит в себе вмт хуки). сама оригинальная вмт не модифицируется) уже нужна именно сама инстанция а не вмтшка. а для обычного вмт хука токо сама вмт нужна(которая с сиги берется)
этот приём очень удобно использовать в таких ситуациях когда инстанцию сложно раздобыть + ты не будешь зависеть от обстоятельств(бывает такое что инстанция тебе не сразу доступна. банально условно ты реинжектнешь свой чит внутри катки - и че откуда ты свой нетчан будешь брать если креейтнетчан уже не будет вызываться в ближайшее время? в катку придется перезаходить чтобы заинитить этот хук. вот иногда бывает удобнее в таких ситуациях если они частые просто с сиги вмт получать). ну то есть для вмт хука инстанция тебе нужна просто только для того чтобы из нее достать втейблу. так вот эту втейблу ты можешь достать из конструктора просто сделав сигу на конструктор(в нем инструкция типа mov [rcx], vftable_ptr)
сига кстати на конструктор нетчана довольно живучая
файл с сигой ласт модифаед Wednesday, December 15, 2021, 21:16:08
у меня дота от ~начала января этого года(не обновлял пока до современной но там скорее всего тоже эта сига жива) и эту сигу все еще находит успешно. конструктор/деструктор невероятно просто находятся если у тебя уже есть вмт нетчана(например с инстанции достал и логнул например). в дебагере/в иде просто хрефы ищешь на саму вмт и всё.
Посмотреть вложение 238866
//old example shitcode
class CNetworkChannel : public VClass
{
class Constructor : PatternParent < Constructor,
"networksystem.dll",
"CNetworkChannel::CNetworkChannel",
"40 53 56 57 41 56 48 83 ec ?? 45 33 f6 48 8d 71"
>
{
public:
static inline VFTable vmt{};
static void Initialize()
{
constexpr InstructionProperties lea{ 3,7 };
vmt = { GetAbsoluteAddress<lea, void*>(GetLocation<std::uintptr_t>() + 0x15) };
if (RTTIReader::Read<1>(vmt) != "CNetChan")
throw std::runtime_error{"CNetworkChannel::CNetworkChannel -> invalid vmt"};
}
};
...
static VMTHook InstallHooks()
{
return { Constructor::vmt, SendMessageHook{}, RecvMessageHook{} };
}