Скрытое содержимое
Например, как вы поняли что этот код, точно GetLocalPlayer? по ассемблерному коду ну ни как не понять что это тоже самое что и в старой либе 2016 года. Единственное что в глаза бросается это FFFFFFFF
Просто мне интересен сам принцип того, как это находится, а не сам взлом доки2
я еще раз говорю хватит смотреть на древнюю 2016 года версию, там уже многое поменялось, смотри на то что было недавно и работало у людей
тем не менее;
ты смотришь на дилибы, а там другие конвенции вызова
вот функция из длл от 25 января 2016 года
прошу заметить
mov rbx, rdx
...
mov dword [rbx], blablabla
mov rax, rbx
по конвенции майкрософт, именно так структуры передаются по значению из связанных методов(аргумент в rdx - адрес caller-allocated места под структуру, в rax после вызова лежит этот же самый адрес)
следовательно мы имеем функцию в стиле
struct PlayerID_t
{
int value;
}
...
PlayerID_t GetLocalPlayer(CSplitScreenSlot)
мы видим что в функции 2024 - такая же малина со структурой
и такая же малина с интом -1(0xFFFFFFFF) в случае фейла
а еще если ты посмотришь на функцию на 0xC8(25 index) у NetworkClient(найди его вмт в Names вкладке в дилибе, `vtable for'CNetworkClientService) ты увидишь что там лежит CNetworkClientService::GetIGameClient(void)
т.е. мы получаем CNetworkGameClient и дальше ему делегируем на его 0x100(32 index) функцию, которая выглядит так:
сплитскринслот умножается на 32(shl rax, 5 - 32 это два в степени пять. сдвиг(левый/правый) в системе счисления это умножение/деление(соответственно) на степень основания(в нашем случае двоичная система основание 2)). в современном коде там умножается на 24(lea rcx [rax + rax*2] это как rcx = rax * 3; далее rcx * 8 умножается, т.е. rax * 24)
ну и оффсет незначительно поменялся был D4 в 2016 стал F8 щас
так вот в нашей функции современной
тоже используется CNetworkGameClient
ну и ты всегда можешь поставить бп и посмотреть кто вызывает, идентифицировать это место(например по хрефам на строки вокруг) и сопоставить с дилибом(поискав там этот хреф)
например в современной доте среди вызывателей есть в client.dll функция с хрефом "CL: client listens to event ',27h,'%s',27h,' unknown by server."(ну там ничего интересного) и есть еще одна с "snd_soundmixer".
ищем в libclient.dylib "snd_soundmixer" находим C_BasePlayer::CheckForLocalPlayer(C_BasePlayer *) и видим в нем вызов
следовательно мы нашли что надо(раз саундмиксер хуйня эта в современной доте вызывает именно эту функцию, прямо как 8 лет назад)