Начинающий
Спасибо |
Спасибо |
на мак ос раньше был невиртуальный. щас стал виртуальным, все просто. доверяй прежде всего дебагеру который тебе гласит call [xx+38h] где xx это вмт CDOTA_ParticleManager, а не старой библиотеке с символами которая к тому же еще и на мак ос а не на винде. дилиб это твой ориентир, который подсказывает где что и как найти, это не абсолют из которого можно напрямую копипаститьCreateParticle это не виртуальный метод?
находишь с хрефа "CreateParticle" джаваскриптовую функцию. чекаешь ее код.Вот смотри, как мне найти какую функу именно надо в вмт? (CreateParticle), я брал адреса и ставил бп на функе, покупал какой нибудь абисал и кидал на врага, когда бп срабатывает то это тот самый CreateParticle, но у меня в двух функциях бп срабатывал, какая мне нужна? То что она с индексом 7 это понятно, но я хочу сам попробовать ее найти
Спасибо!находишь с хрефа "CreateParticle" джаваскриптовую функцию. чекаешь ее код.
Посмотреть вложение 106535
бп ставишь на этот прыжок, вызываешь функцию несколько раз из джаваскрипта, благодаря бпшкам чекаешь какие прыжки выполняются/не выполняются, собираешь статистику и делаешь вывод например такой: первый прыжок всегда выполняется, второй выполняется когда параметр xx равен yy, третий никогда не выполняется и т.д., в общем динамически анализируешь что происходит - передаешь в функцию разные параметры по несколько раз и смотришь что происходит.
вот код после первого прыжка:
Посмотреть вложение 106536
mov rcx, CDOTA_ParticleManager*
mov r9, [rcx]
lea r8, [указатель_на_какую-то_структуру_которая_находится_в_стеке]
mov ebx, [rcx+MaxHandle_offset]
lea edx, [rbx+1]
mov [rcx+MaxHandle_offset], edx
mov edx,ebx
call [r9+38h]
вот и все что тебе нужно.
int handle = CDOTA_ParticleManager->MaxHandle();
CDOTA_ParticleManager->SetHandle(handle+1);
CDOTA_ParticleManager->VirtualCall<0x38/8(будет 7)>(CDOTA_ParticleManager(то есть this), &MyStruct, handle);
единственный вопрос который у тебя тут может возникнуть это что же именно за структура находится в стеке. кликаешь на нее в дампе(rsp+20) и видишь что там лежит имя партикли блаблабла еще какаято хрень. делаешь себе такую же структуру
struct {const char* a; int b; entity* c} MyStruct = {"",ParticleAttachment_t::XXX,Entity}
и пытаешься вызвать. и партикля у тебя не создастся.
поэтому расширяешь структуру
struct {const char* a; int b; entity* c; char pad[200];} MyStruct = {"",ParticleAttachment_t::XXX,Entity}//остальное автоматом в 0 ставится
тем самым добавив еще 200 байтов(200 перебор но работает и мне пох) нулей в структуру чтобы наверняка.
и теперь все работает. делаешь вывод что структура состоит из более чем 3 членов и для успешной работы один/несколько из членов которые ты не можешь понять что делают должны быть в нулину.
А как мне из джаваскрипта эту херню вызвать? Не могу найти тему с ним
чтобы создать с ним партикль. edx(rdx) это регистр fastcall'а, значит его содержимое должно быть связано с функцией(иначе если бы этот параметр не использовался в rdx не клалось бы ничего перед вызовом, а если и клалось бы то сразу же там бы еще до вызова и использовалось как-нибудь, а тут просто кладется и ничего с ним не делается, значит это параметр), туда не просто так значение кладется. этот хендл потом присваивается партикле и ты можешь ее там в этом DPM по этому хендлу найти(условно for each particle if particle.handle == my_handle return particle). и при этом заранее увеличивается MaxHandle, то есть MaxHandle это будущий хендл следующей партикли которую ты будешь создавать. впринципе вальвы могли бы MaxHandle И после вызова увеличивать но как сделали так сделали, значит так надо былоА вот еще вопрос, зачем в edx пихается старый maxhandle?
mov rcx, CDOTA_ParticleManager*
mov r9, [rcx]
lea r8, [указатель_на_какую-то_структуру_которая_находится_в_стеке]
mov ebx, [rcx+MaxHandle_offset]
lea edx, [rbx+1]
mov [rcx+MaxHandle_offset], edx
mov edx,ebx
call [r9+38h]
Спасибо!чтобы создать с ним партикль. edx(rdx) это регистр fastcall'а, значит его содержимое должно быть связано с функцией(иначе если бы этот параметр не использовался в rdx не клалось бы ничего перед вызовом, а если и клалось бы то сразу же там бы еще до вызова и использовалось как-нибудь, а тут просто кладется и ничего с ним не делается, значит это параметр), туда не просто так значение кладется. этот хендл потом присваивается партикле и ты можешь ее там в этом DPM по этому хендлу найти(условно for each particle if particle.handle == my_handle return particle). и при этом заранее увеличивается MaxHandle, то есть MaxHandle это будущий хендл следующей партикли которую ты будешь создавать. впринципе вальвы могли бы MaxHandle И после вызова увеличивать но как сделали так сделали, значит так надо было
хз только что доту обновил сига такая же оффсет такой же. мб ты сигу на другую функцию взял, там же несколько хрефов на CreateParticle там может несколько функций подходить под нужные нам цели, мы из сиги только берем указатель на DPM, а он есть в нескольких из хрефов, так что разницы нет какой юзать. можно ваще как фоллбек сделать 2 сиги:DТам кста сига обновилась, ща смотреть буду, но это не точно, ибо она длинная у мя
\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x50\x33\xC0\x41\x8B\xD8\x48\x8B\xFA\x41\x83\xF9\xFF\x74\x5C\x48\x8B\x05\x49\xCD\x40\x02\x48\x85\xC0\x74\x2B\x48\x63\x48\x70\x00\x00\x00\x00\x00\x00\x00\x83\xF9\x0A\x77\x1B\x48\x8B\xC1 (старая сига)
Сегодня обнова просто была доты, мб как то связано
либо просто 2 байта вот в конце сиги изменились сами ввиду апдейта, либо раньше ты с дебагера сидел и ставил там где-то бп, а щас зашел без дебагера/вырубил бп. дебагер когда бп ставит байтпатчит инструкцию на int3(И че за магия, сига та же, на 2 байта укоротил и заработало все, тот же оффсет
Да кстати, с дебагером всегда инжектил :))либо просто 2 байта вот в конце сиги изменились сами ввиду апдейта, либо раньше ты с дебагера сидел и ставил там где-то бп, а щас зашел без дебагера/вырубил бп. дебагер когда бп ставит байтпатчит инструкцию на int3(Пожалуйста, авторизуйтесь для просмотра ссылки.), и в итоге сигу не находит пока бп не вырубишь.
asm функции иди еще раз чекни там былоДа кстати, с дебагером всегда инжектил :))
И вот еще смотри вопрос, хэндл этот инт? Там просто два инта видимо, нужен первый или второй? первый инт 01 00 39 4F и второй 00 00 7F FC
Спасибо!asm функции иди еще раз чекни там было
mov register, dword:[rcx+A0]
что значит считать 4 байта начиная с ячейки rcx+a0 и байтсвапнуть(mov автоматом байтсвапает поэтому не парься), что в с++ есть
*(int*)(DPM+0xa0).
то есть данный код сгенерит инструкцию
mov register, dword:[xxx+a0]
хэндл это инт, да. доверяй сначала asmу а уже потом своим глазам и реклассу
#pragma once
unsigned long long particle_pattern = 0;
unsigned long long CDOTA_ParticleManager = 0;
struct ParticleStruct
{
// Структура из стэка
} Particle;
void CreateParticle()
{
int CurrentHandle = *(int*)(CDOTA_ParticleManager + 0xA0); // Получаем хэндл
unsigned long long CDOTA_ParticleManagerVMT = *(unsigned long long*)CDOTA_ParticleManager; // Виртуальная таблица
unsigned long long CreateParticleFunc = *(unsigned long long*)(CDOTA_ParticleManager + 7 * 8); // Функа CreateParticle из таблицы
((void(__fastcall*)(unsigned long long _CDOTA_ParticleManager, int _CurrentHandle, ParticleStruct*))CreateParticleFunc)(CDOTA_ParticleManager, CurrentHandle, &Particle); // Ее вызов
*(int*)(CDOTA_ParticleManager + 0xA0) = CurrentHandle + 1; // Инкремент CurrentHandle
}
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz