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

🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
нет в экстернал это анрил найти, нужно хукать создание ее (интернал)
либо хукать нетчан(канал связи доты) там приходит евенет в протобафе (парсить его)
Это тебе челы из милонити сказали, что анрил экстернал? Что за мемы, ты пробовал? Ты искал? Или просто сказал, чтобы сказать?
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Это тебе челы из милонити сказали, что анрил экстернал? Что за мемы, ты пробовал? Ты искал? Или просто сказал, чтобы сказать?
нет это просто не имеет смысла, все возможно, но какой смысл, если чел до этого пишет, что за любой интернал улетаешь в бан и пометки ааа страшно, конкретно ему в ce это анрил найти, пиздец, как же мелонити вас байтит в статусе

почитай контекст, а не 1 сообщение в теме
 
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2022
Сообщения
63
Реакции[?]
23
Поинты[?]
3K
Это тебе челы из милонити сказали, что анрил экстернал? Что за мемы, ты пробовал? Ты искал? Или просто сказал, чтобы сказать?
Речь идёт про телпеорт. Это действие происходит нечасто, даже если можно как то умудриться сделать хук через постоянного чтения в цикле каких то значений, то это будет ужасно по перфу и не имеет никакого смысла в игре в которой нет античита.

Если прям хочется очень сильно экстэрнал это Winpcap/proxy и декодирование пакетов как в моём старом чите на PubgMobile.
Насколько знаю сериализация в сорсе попроще чем в анриале. Но придётся реверсить, т.к. меняли серилизацию после последних сливов.
Дальше протобафы читать входящие, исходящие протобафы с ордерами менять/отменять.
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
Речь идёт про телпеорт. Это действие происходит нечасто, даже если можно как то умудриться сделать хук через постоянного чтения в цикле каких то значений, то это будет ужасно по перфу и не имеет никакого смысла в игре в которой нет античита.

Если прям хочется очень сильно экстэрнал это Winpcap/proxy и декодирование пакетов как в моём старом чите на PubgMobile.
Насколько знаю сериализация в сорсе попроще чем в анриале. Но придётся реверсить, т.к. меняли серилизацию после последних сливов.
Дальше протобафы читать входящие, исходящие протобафы с ордерами менять/отменять.
я изначально это и имел ввиду

на og просто клоун сидит с зонта хуйню какую то выписывает по приказу короля < 3
 
Начинающий
Статус
Оффлайн
Регистрация
26 Ноя 2017
Сообщения
11
Реакции[?]
1
Поинты[?]
0
hell0hell0 Если ты это все реализовал, можешь показать где эта функция в памяти вызывается?
По типу [*.dll + смещения + указатель...+указатель].
Хотя бы у локального игрока. Почему такой легкий вопрос никто не может реализовать? Это же обычное чтение памяти.
такое ощущение, что тут все копипастят с одного источника и даже не понимают, что я спрашиваю.
Если уже есть эта функция там делов на 2 минуты, чтобы записать оффесты.
Не важно откуда это приходит, из сети или генерируется игрой, это все должно быть в памяти и это не сложно посмотреть, если уже вы это нашли.
как будто вся "база" программирования и основ пк мимо вас прошла и люди просто начали кодить без основ.
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
hell0hell0 Если ты это все реализовал, можешь показать где эта функция в памяти вызывается?
По типу [*.dll + смещения + указатель...+указатель].
Хотя бы у локального игрока. Почему такой легкий вопрос никто не может реализовать? Это же обычное чтение памяти.
такое ощущение, что тут все копипастят с одного источника и даже не понимают, что я спрашиваю.
Если уже есть эта функция там делов на 2 минуты, чтобы записать оффесты.
Не важно откуда это приходит, из сети или генерируется игрой, это все должно быть в памяти и это не сложно посмотреть, если уже вы это нашли.
как будто вся "база" программирования и основ пк мимо вас прошла и люди просто начали кодить без основ.
ты походу пиздец шиз открой дебагер найди функу поставь бряху да посмотри партикли это отдленая система в ентити нет инфы о ее партиклях

индекс мб устарел:
bool Hooks::CreateParticleCollection() {
    void* CreateParticleCollection = Memory::GetVFunc<void*>(vmt.particleMgr, 17);
    if (!Hook(CreateParticleCollection, hkCreateParticleCollection, &oCreateParticleCollection, "CreateParticleCollection"))
        return false;

    return true;
}
hell0hell0 Если ты это все реализовал, можешь показать где эта функция в памяти вызывается?
По типу [*.dll + смещения + указатель...+указатель].
Хотя бы у локального игрока. Почему такой легкий вопрос никто не может реализовать? Это же обычное чтение памяти.
бля мб тебе ваще сурс готового чита скинуть :CoolCat:

PS хотя я тут так подумал мы же все с хейка пастим пиздани свое чет ты же дохуя умный и безопасный один неповторимый такой пишешь читы на доту и единственный понимаешь как надо
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2022
Сообщения
63
Реакции[?]
23
Поинты[?]
3K
hell0hell0 Если ты это все реализовал, можешь показать где эта функция в памяти вызывается?
По типу [*.dll + смещения + указатель...+указатель].
Хотя бы у локального игрока. Почему такой легкий вопрос никто не может реализовать? Это же обычное чтение памяти.
такое ощущение, что тут все копипастят с одного источника и даже не понимают, что я спрашиваю.
Если уже есть эта функция там делов на 2 минуты, чтобы записать оффесты.
Не важно откуда это приходит, из сети или генерируется игрой, это все должно быть в памяти и это не сложно посмотреть, если уже вы это нашли.
как будто вся "база" программирования и основ пк мимо вас прошла и люди просто начали кодить без основ.
Здарова ты это тому ваще человеку писал? Что я реализовал? Складывается ощущение что ты сегодня на вечернюю раздачу пробников Альфа-Пвп попал на руторе, щас довольный сидишь - балдеешь.

Протобаф пришедший с сети может и не сейвиться в память после десериализации.(мне лень смотреть сейвится или нет) Чисто в rdx придёт в NetChannel и так же дальше по регистрам и передастся в последующие функции. А если и сейвится, то в стеке куда нибудь. На фрейм стека ты оффсет не найдешь статический.

Я хотел тебе предложить в бесконечном цикле дрочить стек нужного потока на наличие в нём фрейма onNetMessageReceived(protobuf_msg) а потом через NtGetContextThread просить регистры.
но это не будет работать. Потому что тебя вытеснит планировщик и ты не попадёшь в 99% таймингов прихода сообщения своим чеком на нужный фрейм.

WaitForDebugEvent вызываешь с нужным потоком, затем NtSetContextThread с hardware breakpoint на onNetMessageReceived. Ну и всё! Дальше уже через NtGetContextThread берёшь rdx. Смотришь нужное ли тебе там сообщение на создание партикли или нет и возвращаешь DBG_CONTINUE.

Но это не особо честно ибо через дебаг не тру экстернал.
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
А как оно выглядит в памяти? Мне бы вручную найти.
Для примера vbe. Я нахожу его вручную. Оно привязано к текущему герою и в памяти имеет вид 0 в случае если враг видит, а когда не видит, то там три байта постоянно меняются и если переводить во флоат, то они идут циклом от 0,1 до 0,9.
.
А что представляет из себя "Создание партикля в момент телепорта на тавер" ?
Это булевое значение или что это? Оно так же привязано к таверу? Его можно найти в памяти как я нахожу vbe ?
когда енеми тпхается с сервака прилетает "создай партикль телепорта" "обнови партикль телепорта: коорды, хендл_сущности"
хочешь экстерналом - ну так ищи какуюто таблицу/линкед лист партиклей или что-то вроде такого(ну должны же они както гдето храниться они же не магией рисуются). CreateParticle возвращает партиклю вот и ищи там где ее куда кто когда засовывает. потом тебе еще нужно будет контрол поинты получить с коордами и с айди сущности(реверси как там эти контрол поинты хранятся и где. net_showreliable 1 тебе будет показывать сообщения сетевые, в них коорды схендлы сущности и тд все есть можешь эти значения гденибудь искать в памяти). в общем заебешься ты искать вручную, но теоритически можешь если хочешь
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
когда енеми тпхается с сервака прилетает "создай партикль телепорта" "обнови партикль телепорта: коорды, хендл_сущности"
хочешь экстерналом - ну так ищи какуюто таблицу/линкед лист партиклей или что-то вроде такого(ну должны же они както гдето храниться они же не магией рисуются). CreateParticle возвращает партиклю вот и ищи там где ее куда кто когда засовывает. потом тебе еще нужно будет контрол поинты получить с коордами и с айди сущности(реверси как там эти контрол поинты хранятся и где. net_showreliable 1 тебе будет показывать сообщения сетевые, в них коорды схендлы сущности и тд все есть можешь эти значения гденибудь искать в памяти). в общем заебешься ты искать вручную, но теоритически можешь если хочешь
чел пишет обо всё что это просто типа еба вы лохи не можете чтоль найти хаха это же так просто почему вам там сложно.
но по факту ничего не знает и просит пасты чтобы подкинули.
@qellzXan никому оно не впёрлось реализовывать твои выкрутасы бесполезные для "обхода вак" копать всё из вне и потеть когда это просто не требуется в реалиях данной мобо залупы.
Хочешь извиваться как уж и каждый микроапдейт фиксить всё заново твоё дело. Не пойму зачем ты подбиваешь других если сам не в состоянии. Твои опасения по поводу бана доходят до мании. Тебе бы попить чего успокоительного.
 
Начинающий
Статус
Оффлайн
Регистрация
26 Ноя 2017
Сообщения
11
Реакции[?]
1
Поинты[?]
0
чел пишет обо всё что это просто типа еба вы лохи не можете чтоль найти хаха это же так просто почему вам там сложно.
1. Это действительно не сложно. Если кодеры привыкли ctrl+c ооп код, то я не заставляю их смотреть вручную на память, им достаточно в своем ооп сделать вставку print и показать память. Что я и прошу, а не ооп код. Я ниразу не написал : " Скиньте мне ооп код". А в ответ только код вижу.

2. Это не "выкрутасы".Условная функция "Vbe" выполняется в одном месте, а ее переменная находится возле статической переменной хп игрока, что позволяет мне писать самые обычные RPM в 2 строчки кода.

3. External не бесполезен. Тот код что мне постоянно скидывают, я еще в 2010-ом году на всех форумах по cs source видел. Эти "Ооп хуки" уже давно детект ваком. Я не только не хочу бана от старого детект способа, я ищу другие пути поиска и кода.

4. У нас разные понятия кода. Я привык каждый год менять стиль программирования и подстраиватся под новые реалии, изучая что-то новое, а не
" Хочешь извиваться как уж и каждый микроапдейт фиксить всё заново твоё дело".
Меня Не устраивает написаный однажды код писать 100 раз.

5. "Твои опасения по поводу бана доходят до мании" - дело не только в "не получении бана". Если ты программист, а не кодер, который ворует код, то придет время когда ты захочешь создавать что-то уникальное и красивое. Никого не устроит написаная за 5 минут дрысня, которую при первом же детекте занесут в базу и она станет обычным набором текста.

6. Твой текст в общении написан на быструю руку, так ты оцениваешь своего собеседника? Словно мусор, которому можно уделить лишь 1 минуту своего времени.

7. Я пишу код для доты не потому что мне нужен рейтинг. Не потому что я хочу унизить противника. Я просто хотел узнать что-то новое, а не ооп код из 2006 года.

Но я понял сликшом поздно, что тут только 1 способ для читов.
 
midnight.im
Администратор
Статус
Оффлайн
Регистрация
1 Июл 2015
Сообщения
1,650
Реакции[?]
2,173
Поинты[?]
162K
3. External не бесполезен. Тот код что мне постоянно скидывают, я еще в 2010-ом году на всех форумах по cs source видел. Эти "Ооп хуки" уже давно детект ваком. Я не только не хочу бана от старого детект способа, я ищу другие пути поиска и кода.
ты для начала узнай как вак работает, а потом уже говори, что метод детект или нет...
 
https://qweme.dev
Пользователь
Статус
Оффлайн
Регистрация
25 Май 2022
Сообщения
165
Реакции[?]
87
Поинты[?]
21K
1. Это действительно не сложно. Если кодеры привыкли ctrl+c ооп код, то я не заставляю их смотреть вручную на память, им достаточно в своем ооп сделать вставку print и показать память. Что я и прошу, а не ооп код. Я ниразу не написал : " Скиньте мне ооп код". А в ответ только код вижу.

2. Это не "выкрутасы".Условная функция "Vbe" выполняется в одном месте, а ее переменная находится возле статической переменной хп игрока, что позволяет мне писать самые обычные RPM в 2 строчки кода.

3. External не бесполезен. Тот код что мне постоянно скидывают, я еще в 2010-ом году на всех форумах по cs source видел. Эти "Ооп хуки" уже давно детект ваком. Я не только не хочу бана от старого детект способа, я ищу другие пути поиска и кода.

4. У нас разные понятия кода. Я привык каждый год менять стиль программирования и подстраиватся под новые реалии, изучая что-то новое, а не
" Хочешь извиваться как уж и каждый микроапдейт фиксить всё заново твоё дело".
Меня Не устраивает написаный однажды код писать 100 раз.

5. "Твои опасения по поводу бана доходят до мании" - дело не только в "не получении бана". Если ты программист, а не кодер, который ворует код, то придет время когда ты захочешь создавать что-то уникальное и красивое. Никого не устроит написаная за 5 минут дрысня, которую при первом же детекте занесут в базу и она станет обычным набором текста.

6. Твой текст в общении написан на быструю руку, так ты оцениваешь своего собеседника? Словно мусор, которому можно уделить лишь 1 минуту своего времени.

7. Я пишу код для доты не потому что мне нужен рейтинг. Не потому что я хочу унизить противника. Я просто хотел узнать что-то новое, а не ооп код из 2006 года.

Но я понял сликшом поздно, что тут только 1 способ для читов.
бля пиздец мужик перестань юзать ты так помрешь скоро от передоза

какой нахуй ооп код ты блять бредишь чтоли тебе бестолочи 3 человека говорят что нету в ентити нетвара на тп партикли это не entity + 0x123 это отдельная система от ентити систем называется партикл менджр там нужен просто хук на функцию то что ты пишешь дырявый экстернал никого не ебет и никто тебе тут готовый код не будет кидать тебе вроде объяснили что делать это через экстернал не имеет смысла ибо игра не стоит свеч ты же продолжаешь выписывать какую то полную хуйню

блять сначало было смешно с твоих сообщений про детект методы и про безопасность ну так чисто знаешь в цирк пришел на фрика посмотреть но счас уже чет ваще нихуя не смешно ты либо реально не выкупаешь либо на солях либо это мегатролинг который тут пока что не выкупили иного обьяснение этим сообщениям я не вижу
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
6. Твой текст в общении написан на быструю руку, так ты оцениваешь своего собеседника? Словно мусор, которому можно уделить лишь 1 минуту своего времени.
6. Да. Ибо выдающегося ты ничего пока не выдал.
Способов перехвата не 1 и не 2. Есть еще порядка 3-4 способов перехватить что либо и на эти способы вак уже не рассчитан явно. Не говоря уже о выходе в кернел откуда можно сотворить много чего интересного и вак тебя не выудит никак и нигде. А пилить ограниченный софт даже для "саморазвития" - является деградацией в большей степени чем развитием.
Если уж ты как то там разграничиваешь кто есть кодер кто программист то из двух ты кодер. Получается ты попался на свой крючок - червячок.
Рассказываешь про 10 год и получается за 13 лет развился на целых 0 пунктов. К чему что ты написал рассказал хрен пойми. Всё то что ты хочешь найти находится либо в партиклях либо в пакетах сети. Ищи гляди может нароешь что желаешь. Как таковых офсетов для этого нет. Вбе это исключение. До недавнего времени этот способ был забыт многими ибо был другой альтернативный и более удобный, но после обновления его вытулили.
 
Последнее редактирование:
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Но я понял сликшом поздно, что тут только 1 способ для читов.
Если хочешь обсудить как делать экстернал на дотку, то я помогал одному человеку писать, oask, он многое сделал и софт был довольным хорошим.
Попробуй с ним списаться. А тут в темах, как ты видишь оч много 🤡, поэтому я и перестал особо сидеть тут и отвечать.
Всего два человека в дота разделе к которым у меня есть уважение и они понимают, о чем речь.

Ну а на счет детектов. В текущих реалиях, в доте нету вак модулей которые ты помнишь из ксс, когда втейблы ебанули в 2013, но я вполне согласен с тобой. Тут весь рынок можно накрыть вернув один этот модуль, не говоря про другие модули. Поэтому все и идут делать интерналы, но как ты помнишь, до опр. времени и в ксс были онли интерналы. А потом пошли уже всякие обширные мультихаки экстернальные. В общем, каждый делает как он хочет. Гл в разработке.
 
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2022
Сообщения
63
Реакции[?]
23
Поинты[?]
3K
Если хочешь обсудить как делать экстернал на дотку, то я помогал одному человеку писать, oask, он многое сделал и софт был довольным хорошим.
Попробуй с ним списаться. А тут в темах, как ты видишь оч много 🤡, поэтому я и перестал особо сидеть тут и отвечать.
Всего два человека в дота разделе к которым у меня есть уважение и они понимают, о чем речь.

Ну а на счет детектов. В текущих реалиях, в доте нету вак модулей которые ты помнишь из ксс, когда втейблы ебанули в 2013, но я вполне согласен с тобой. Тут весь рынок можно накрыть вернув один этот модуль, не говоря про другие модули. Поэтому все и идут делать интерналы, но как ты помнишь, до опр. времени и в ксс были онли интерналы. А потом пошли уже всякие обширные мультихаки экстернальные. В общем, каждый делает как он хочет. Гл в разработке.
Не особо за рынок кс шарю, правильно ли я понял - всё что делает стандартный валв античит в кс го в отличии от доты это смотрит не меняешь ли ты в VMT адреса функций? И всё что нужно делать нормально скопировать функции к себе - помяняв vtable pointer в объекте виртуалки которого хочешь хукать ? Я так по дефолту делаю в доте. Да даже у LWSS так сделано. Странно что это кого то остановить могло.
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
Что-то я с партиклами не понимаю. Я уже даже GameRules нашёл пока искал, но всё равно не понимаю, что именно я должен найти. lea r9 там уже нет(хотя в других JS-функциях видел), соответственно в какое направление думать — не понимаю
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Что-то я с партиклами не понимаю. Я уже даже GameRules нашёл пока искал, но всё равно не понимаю, что именно я должен найти. lea r9 там уже нет(хотя в других JS-функциях видел), соответственно в какое направление думать — не понимаю
регистр поменялся прост. сверху над pParticleName хреф на функу
1674757154656.png
внутри нее есть функа которая возвращает партиклмгр
1674757231591.png
1674757288675.png
дальше там идёт вызов функи которая вызывает виртуальный метод с индексом 7 внутри партикльменеджера(это креейтпартикл)

там у креейтпартикл
первый арг скрытый this(партикль менеджер)
второй арг - инт - текущий хендл в партикльменеджере(он на 0x98 оффсете лежит)
третйи арг - указатель на структуру с инфой о партикле - она имеет вид чтото вроде такого:
const char* particle_name; //путь к файлу vpcf партикли
int attach_type; //енум ParticleAttachment_t в animationsystem.dll, есть в шеме
C_BaseEntity* entity; //ентити к которой прилепляться будет партикль
void* unk1; //ставишь в 0
void* unk2; //ставишь в 0
void* unk3; //ставишь в 0
void* unk4; //ставишь в 0
void* unk5; //ставишь в 0
ну это так бегло я так почекал просто глазиками. по факту сам протестишь - бпшку поставишь на этот вирутальный метод №7(берешь партикльменеджер, берешь его вмт, прибавляешь 7*8(8 это размер указателя на х64) и там будет указатель на функу)
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
регистр поменялся прост. сверху над pParticleName хреф на функу
Посмотреть вложение 236532
внутри нее есть функа которая возвращает партиклмгр
Посмотреть вложение 236533
Посмотреть вложение 236534
дальше там идёт вызов функи которая вызывает виртуальный метод с индексом 7 внутри партикльменеджера(это креейтпартикл)

там у креейтпартикл
первый арг скрытый this(партикль менеджер)
второй арг - инт - текущий хендл в партикльменеджере(он на 0x98 оффсете лежит)
третйи арг - указатель на структуру с инфой о партикле - она имеет вид чтото вроде такого:
const char* particle_name; //путь к файлу vpcf партикли
int attach_type; //енум ParticleAttachment_t в animationsystem.dll, есть в шеме
C_BaseEntity* entity; //ентити к которой прилепляться будет партикль
void* unk1; //ставишь в 0
void* unk2; //ставишь в 0
void* unk3; //ставишь в 0
void* unk4; //ставишь в 0
void* unk5; //ставишь в 0
ну это так бегло я так почекал просто глазиками. по факту сам протестишь - бпшку поставишь на этот вирутальный метод №7(берешь партикльменеджер, берешь его вмт, прибавляешь 7*8(8 это размер указателя на х64) и там будет указатель на функу)
Спасибо большое, теперь я понял. Насчёт GetParticleManager я тоже в дилибах подумал, что её и надо искать, но опять же когда не знаешь, куда и почему, то и не понятно
берешь партикльменеджер, берешь его вмт, прибавляешь 7*8(8 это размер указателя на х64
Не волнуйтесь, я непосредственно у вас украл VClass, Function и прочие шедевры мировой индустрии
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Спасибо большое, теперь я понял. Насчёт GetParticleManager я тоже в дилибах подумал, что её и надо искать, но опять же когда не знаешь, куда и почему, то и не понятно

Не волнуйтесь, я непосредственно у вас украл VClass, Function и прочие шедевры мировой индустрии
C++:
export
class NormalClass
{
public:
    template<class T>
    auto& Member(std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
    
    template<class T>
    auto& Member(std::ptrdiff_t offset) const noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
};
export
class VFTable {
    void* VTablePtr{ nullptr };
public:
    VFTable() = default;
    explicit VFTable(void* vmt) noexcept
        :
        VTablePtr{ vmt }
    {}

    VFTable(const VFTable&) = default;
    VFTable& operator=(const VFTable&) = default;

    VFTable(VFTable&& other) noexcept
        :
        VTablePtr{ other.VTablePtr }
    {
        other.VTablePtr = nullptr;
    }
    VFTable& operator=(VFTable&& other) noexcept
    {
        VTablePtr = other.VTablePtr;
        other.VTablePtr = nullptr;
        return *this;
    }
    ~VFTable() = default;

public:
    bool IsValid() const noexcept
    {
        return VTablePtr != nullptr;
    }

    void*& GetFunctionAt(std::size_t index) noexcept
    {
        return *(static_cast<void**>(VTablePtr) + index);
    }
    
    const void*& GetFunctionAt(std::size_t index) const noexcept
    {
        return *(static_cast<const void**>(VTablePtr) + index);
    }

    operator void*() noexcept
    {
        return VTablePtr;
    }

    template<typename ReturnType = decltype(VTablePtr)>
    ReturnType GetPtr() const noexcept
    {
        return SmartCast<ReturnType>(VTablePtr);
    }
};
export
class VClass : public NormalClass
{
    VFTable VirtualMethodsTable{};
public:
    VClass() = default;

    explicit VClass(const VFTable& vftable) noexcept : VirtualMethodsTable{ vftable } {}

    template<std::size_t FunctionIndex, typename ReturnType = std::uintptr_t, typename ... ArgTypes>
    ReturnType CallVFunc(ArgTypes... Args) const
    {
        const auto func = VirtualMethodsTable.GetFunctionAt(FunctionIndex);
        if (!func)
            throw std::runtime_error{"CallVFunc -> Func at index is nullptr!"};
        return (static_cast<ReturnType(__thiscall*)(const VClass*, ArgTypes...)>(func))(this, Args...);
    }

    const VFTable& GetVMT() const noexcept
    {
        return VirtualMethodsTable;
    }
};
с CallVFunc аккуратно надо действовать(т.к. она без прототипа позволяет вызывать и на лету прототип делает сама из того что ей передаешь. и при некоторых обстоятельствах компилятор будет передавать по референсу(указателем) то что ты хочешь передать по значению)
в частности там перфект форварда не должно быть в самой CallVFunc(у меня и нету) чтобы она всегда по значению передавала аргументы
и т.к. перфект форварда нету не надо референсы передавать никогда в эту функу(т.к. по значению передается всё. то есть у тебя на низком уровне вместо указателя передастся сам объект в случае передачи референса. если это сознательно по твоей задумке ты так хочешь то конечно почему бы и нет) - передавай указатели просто(в плане асма указатель и референс одно и то же - оба просто указатель обычный. просто компилятор с референсами по-особенному работает и часто делает не совсем то что ты от него хотел).
кр4 аккуратно с темплейт параметр паками(в частности с референсами которые в них летят) и низким уровнем
то есть пример как надо и не надо делать:
C++:
void my_shit_hook_get_screen_size(CEngineClient* rcx, int& w, int& h)
{
    blablablbla;
    !!!rcx->CallVFunc<original_index_blablabla>(w, h);// нельзя нахуй.
    //функция игровая ожидает два указателя, а мы передаем два референса, которые
    //наша функция CallVFunc (намеренно) обрезает до значений. в итоге передастся
    //два инта вместо двух указателей на инты, и игровая функция ахуевает
    
    rcx->CallVFunc<original_index_blablabla>(&w, &h);//можно и нужно - передаем сразу указатели
}
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
C++:
export
class NormalClass
{
public:
    template<class T>
    auto& Member(std::ptrdiff_t offset) noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }

    template<class T>
    auto& Member(std::ptrdiff_t offset) const noexcept
    {
        return *reinterpret_cast<T*>(reinterpret_cast<std::uintptr_t>(this) + offset);
    }
};
export
class VFTable {
    void* VTablePtr{ nullptr };
public:
    VFTable() = default;
    explicit VFTable(void* vmt) noexcept
        :
        VTablePtr{ vmt }
    {}

    VFTable(const VFTable&) = default;
    VFTable& operator=(const VFTable&) = default;

    VFTable(VFTable&& other) noexcept
        :
        VTablePtr{ other.VTablePtr }
    {
        other.VTablePtr = nullptr;
    }
    VFTable& operator=(VFTable&& other) noexcept
    {
        VTablePtr = other.VTablePtr;
        other.VTablePtr = nullptr;
        return *this;
    }
    ~VFTable() = default;

public:
    bool IsValid() const noexcept
    {
        return VTablePtr != nullptr;
    }

    void*& GetFunctionAt(std::size_t index) noexcept
    {
        return *(static_cast<void**>(VTablePtr) + index);
    }

    const void*& GetFunctionAt(std::size_t index) const noexcept
    {
        return *(static_cast<const void**>(VTablePtr) + index);
    }

    operator void*() noexcept
    {
        return VTablePtr;
    }

    template<typename ReturnType = decltype(VTablePtr)>
    ReturnType GetPtr() const noexcept
    {
        return SmartCast<ReturnType>(VTablePtr);
    }
};
export
class VClass : public NormalClass
{
    VFTable VirtualMethodsTable{};
public:
    VClass() = default;

    explicit VClass(const VFTable& vftable) noexcept : VirtualMethodsTable{ vftable } {}

    template<std::size_t FunctionIndex, typename ReturnType = std::uintptr_t, typename ... ArgTypes>
    ReturnType CallVFunc(ArgTypes... Args) const
    {
        const auto func = VirtualMethodsTable.GetFunctionAt(FunctionIndex);
        if (!func)
            throw std::runtime_error{"CallVFunc -> Func at index is nullptr!"};
        return (static_cast<ReturnType(__thiscall*)(const VClass*, ArgTypes...)>(func))(this, Args...);
    }

    const VFTable& GetVMT() const noexcept
    {
        return VirtualMethodsTable;
    }
};
с CallVFunc аккуратно надо действовать(т.к. она без прототипа позволяет вызывать и на лету прототип делает сама из того что ей передаешь. и при некоторых обстоятельствах компилятор будет передавать по референсу(указателем) то что ты хочешь передать по значению)
в частности там перфект форварда не должно быть в самой CallVFunc(у меня и нету) чтобы она всегда по значению передавала аргументы
и т.к. перфект форварда нету не надо референсы передавать никогда в эту функу(т.к. по значению передается всё. то есть у тебя на низком уровне вместо указателя передастся сам объект в случае передачи референса. если это сознательно по твоей задумке ты так хочешь то конечно почему бы и нет) - передавай указатели просто(в плане асма указатель и референс одно и то же - оба просто указатель обычный. просто компилятор с референсами по-особенному работает и часто делает не совсем то что ты от него хотел).
кр4 аккуратно с темплейт параметр паками(в частности с референсами которые в них летят) и низким уровнем
то есть пример как надо и не надо делать:
C++:
void my_shit_hook_get_screen_size(CEngineClient* rcx, int& w, int& h)
{
    blablablbla;
    !!!rcx->CallVFunc<original_index_blablabla>(w, h);// нельзя нахуй.
    //функция игровая ожидает два указателя, а мы передаем два референса, которые
    //наша функция CallVFunc (намеренно) обрезает до значений. в итоге передастся
    //два инта вместо двух указателей на инты, и игровая функция ахуевает

    rcx->CallVFunc<original_index_blablabla>(&w, &h);//можно и нужно - передаем сразу указатели
}
Я, кстати, тоже догадался, что с референсами в функциях типа WorldToScreen будет нечисто

По поводу партиклменеджера наревёрсил вчера:
Код:
class CDOTAParticleManager : public VClass {

public:
    enum class ParticleAttachment_t : int {
        PATTACH_INVALID = -1,
        PATTACH_ABSORIGIN = 0,
        PATTACH_ABSORIGIN_FOLLOW = 1,
        PATTACH_CUSTOMORIGIN = 2,
        PATTACH_CUSTOMORIGIN_FOLLOW = 3,
        PATTACH_POINT = 4,
        PATTACH_POINT_FOLLOW = 5,
        PATTACH_EYES_FOLLOW = 6,
        PATTACH_OVERHEAD_FOLLOW = 7,
        PATTACH_WORLDORIGIN = 8,
        PATTACH_ROOTBONE_FOLLOW = 9,
        PATTACH_RENDERORIGIN_FOLLOW = 10,
        PATTACH_MAIN_VIEW = 11,
        PATTACH_WATERWAKE = 12,
        PATTACH_CENTER_FOLLOW = 13,
        PATTACH_CUSTOM_GAME_STATE_1 = 14,
        PATTACH_HEALTHBAR = 15,
        MAX_PATTACH_TYPES = 16,
    };
    struct ParticleInfo {
        const char* particleName;
        ParticleAttachment_t attachmentType;
        BaseEntity* ent;
    private:
        void* unk0 = nullptr;
        void* unk1 = nullptr;
        void* unk2 = nullptr;
        void* unk3 = nullptr;
        void* unk4 = nullptr;
    };

    class Particle : public VClass {
    public:
        VClass* GetParticleCollection() {
            return Member<VClass*>(0x20);
        }
        void SetControlPoint(int idx, Vector3* pos) {
            auto coll = GetParticleCollection();
            coll->GetVFunc(0x80 / 8)(coll, idx, pos);
        }
    };
    struct ParticleContainer {
        Particle* GetParticle() {
            return *(Particle**)((uintptr_t)this + 0x10);
        }
    };
 
    int GetParticleCount() {
        return Member<uint32_t>(0x80);
    }
    ParticleContainer** GetParticleArray() {
        return Member<ParticleContainer**>(0x88);
    }

    uint32_t GetHandle() {
        return Member<uint32_t>(0x98);
    }
    void IncHandle() {
        *(uint32_t*)((uintptr_t)this + 0x98) = GetHandle() + 1;
    }

    Particle* CreateParticle(ParticleInfo info) {
        IncHandle();
        GetVFunc(7)(this, GetHandle(), info);
        return GetParticleArray()[GetParticleCount() - 1]->GetParticle();
    }
};
Код:
// да, знаю, на криэйтпартикл надо нормальную обёртку написать
CDOTAParticleManager::ParticleInfo info{};
                info.attachmentType = CDOTAParticleManager::ParticleAttachment_t::PATTACH_ABSORIGIN_FOLLOW;
                info.particleName = "particles/ui_mouseactions/selected_ring.vpcf";
                info.ent = (BaseEntity*)assignedHero;

                Vector3 color{ 255,0,255 };
                Vector3 radius{ 1200, 255, 0 };
                auto particle = Globals::ParticleManager->CreateParticle(info);
                particle->SetControlPoint(1, &color);
                particle->SetControlPoint(2, &radius);
Screenshot_358.png
Ещё вопрос по поводу самых ходовых партиклей. Хотелось бы подобие selection_ring.vpcf, но со свечением(как когда рендж атаки вышки показывает), в мелонити VBE такое вроде бы у друга видел
Screenshot_359.png
 
Последнее редактирование:
Сверху Снизу