Гайд Продолжение. вбе(партикли)

Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
CreateParticle это не виртуальный метод?
на мак ос раньше был невиртуальный. щас стал виртуальным, все просто. доверяй прежде всего дебагеру который тебе гласит call [xx+38h] где xx это вмт CDOTA_ParticleManager, а не старой библиотеке с символами которая к тому же еще и на мак ос а не на винде. дилиб это твой ориентир, который подсказывает где что и как найти, это не абсолют из которого можно напрямую копипастить
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Вот смотри, как мне найти какую функу именно надо в вмт? (CreateParticle), я брал адреса и ставил бп на функе, покупал какой нибудь абисал и кидал на врага, когда бп срабатывает то это тот самый CreateParticle, но у меня в двух функциях бп срабатывал, какая мне нужна? То что она с индексом 7 это понятно, но я хочу сам попробовать ее найти
 

Вложения

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Вот смотри, как мне найти какую функу именно надо в вмт? (CreateParticle), я брал адреса и ставил бп на функе, покупал какой нибудь абисал и кидал на врага, когда бп срабатывает то это тот самый CreateParticle, но у меня в двух функциях бп срабатывал, какая мне нужна? То что она с индексом 7 это понятно, но я хочу сам попробовать ее найти
находишь с хрефа "CreateParticle" джаваскриптовую функцию. чекаешь ее код.
1603046185663.png
бп ставишь на этот прыжок, вызываешь функцию несколько раз из джаваскрипта, благодаря бпшкам чекаешь какие прыжки выполняются/не выполняются, собираешь статистику и делаешь вывод например такой: первый прыжок всегда выполняется, второй выполняется когда параметр xx равен yy, третий никогда не выполняется и т.д., в общем динамически анализируешь что происходит - передаешь в функцию разные параметры по несколько раз и смотришь что происходит.
вот код после первого прыжка:
1603046390610.png
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 членов и для успешной работы один/несколько из членов которые ты не можешь понять что делают должны быть в нулину.
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
находишь с хрефа "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 членов и для успешной работы один/несколько из членов которые ты не можешь понять что делают должны быть в нулину.
Спасибо!
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
А как мне из джаваскрипта эту херню вызвать? Не могу найти тему с ним
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
А вот еще вопрос, зачем в 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]
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
А вот еще вопрос, зачем в 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 И после вызова увеличивать но как сделали так сделали, значит так надо было
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
чтобы создать с ним партикль. edx(rdx) это регистр fastcall'а, значит его содержимое должно быть связано с функцией(иначе если бы этот параметр не использовался в rdx не клалось бы ничего перед вызовом, а если и клалось бы то сразу же там бы еще до вызова и использовалось как-нибудь, а тут просто кладется и ничего с ним не делается, значит это параметр), туда не просто так значение кладется. этот хендл потом присваивается партикле и ты можешь ее там в этом DPM по этому хендлу найти(условно for each particle if particle.handle == my_handle return particle). и при этом заранее увеличивается MaxHandle, то есть MaxHandle это будущий хендл следующей партикли которую ты будешь создавать. впринципе вальвы могли бы MaxHandle И после вызова увеличивать но как сделали так сделали, значит так надо было
Спасибо!
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Там кста сига обновилась, ща смотреть буду, но это не точно, ибо она длинная у мя
\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 (старая сига)
Сегодня обнова просто была доты, мб как то связано
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Там кста сига обновилась, ща смотреть буду, но это не точно, ибо она длинная у мя
\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 (старая сига)
Сегодня обнова просто была доты, мб как то связано
хз только что доту обновил сига такая же оффсет такой же. мб ты сигу на другую функцию взял, там же несколько хрефов на CreateParticle там может несколько функций подходить под нужные нам цели, мы из сиги только берем указатель на DPM, а он есть в нескольких из хрефов, так что разницы нет какой юзать. можно ваще как фоллбек сделать 2 сиги:D
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
И че за магия, сига та же, на 2 байта укоротил и заработало все, тот же оффсет
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
И че за магия, сига та же, на 2 байта укоротил и заработало все, тот же оффсет
либо просто 2 байта вот в конце сиги изменились сами ввиду апдейта, либо раньше ты с дебагера сидел и ставил там где-то бп, а щас зашел без дебагера/вырубил бп. дебагер когда бп ставит байтпатчит инструкцию на int3(
Пожалуйста, авторизуйтесь для просмотра ссылки.
), и в итоге сигу не находит пока бп не вырубишь.
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
либо просто 2 байта вот в конце сиги изменились сами ввиду апдейта, либо раньше ты с дебагера сидел и ставил там где-то бп, а щас зашел без дебагера/вырубил бп. дебагер когда бп ставит байтпатчит инструкцию на int3(
Пожалуйста, авторизуйтесь для просмотра ссылки.
), и в итоге сигу не находит пока бп не вырубишь.
Да кстати, с дебагером всегда инжектил :))
И вот еще смотри вопрос, хэндл этот инт? Там просто два инта видимо, нужен первый или второй? первый инт 01 00 39 4F и второй 00 00 7F FC
 

Вложения

Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Тоесть получается хэндл вот
C++:
void setNewParticleHandle()
{
    Handle = (*(unsigned long long*)(CDOTA_ParticleManager + 0xA0) + 1);
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Да кстати, с дебагером всегда инжектил :))
И вот еще смотри вопрос, хэндл этот инт? Там просто два инта видимо, нужен первый или второй? первый инт 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у а уже потом своим глазам и реклассу
и не надо путать типы данных, зачем ты unsigned long long считываешь, тебе 4 байта нужно, int. это из инструкции следует mov x, DWORD:[y]
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
asm функции иди еще раз чекни там было
mov register, dword:[rcx+A0]
что значит считать 4 байта начиная с ячейки rcx+a0 и байтсвапнуть(mov автоматом байтсвапает поэтому не парься), что в с++ есть
*(int*)(DPM+0xa0).
то есть данный код сгенерит инструкцию
mov register, dword:[xxx+a0]
хэндл это инт, да. доверяй сначала asmу а уже потом своим глазам и реклассу
Спасибо!
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2018
Сообщения
146
Реакции[?]
9
Поинты[?]
0
Я понял, значит получается так :
C++:
#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
}
 
Сверху Снизу