MONEY за подписку!Ничего делать не надо совсем, всего-то подписаться на тг одмена и нажать кнопку "Принять участие" в розыгрыше: https://t.me/govthing/7650
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
что конкретно объяснить?
есть конвар dota_camera_distance, у него есть коллбек на изменение который срабатывает когда ты в консоли меняешь значение(нет смысла его менять без вызова коллбека оно не будет работать), этот коллбек пишет в глобальную переменную, значение этой переменной каждый кадр копируется в камеру доты, и потом используется при построении вьюматрицы которая потом идет в вертекс шейдер. любое из этих мест подходит для достижения целей(правда естественно с разными усилиями). самое элементарное - та самая глобальная переменная(назовём ее g_flCameraDistance). находится спокойно в чит енджине просто меняя в консольке квар dota_camera_distance(зелёный адрес у нее будет).
далее через хвбп(hardware breakpoint - в чит енджине называется "Find out what accesses this address") находишь инструкции которые работают с этой переменной и делаешь на них сигу(чтобы при апдейтах не надо было руками обновлять всё) и потом находишь их в доте и достаешь из них операнд и делаешь из него абсолютный адрес и пишешь туда что хочешь
что конкретно объяснить?
есть конвар dota_camera_distance, у него есть коллбек на изменение который срабатывает когда ты в консоли меняешь значение(нет смысла его менять без вызова коллбека оно не будет работать), этот коллбек пишет в глобальную переменную, значение этой переменной каждый кадр копируется в камеру доты, и потом используется при построении вьюматрицы которая потом идет в вертекс шейдер. любое из этих мест подходит для достижения целей(правда естественно с разными усилиями). самое элементарное - та самая глобальная переменная(назовём ее g_flCameraDistance). находится спокойно в чит енджине просто меняя в консольке квар dota_camera_distance(зелёный адрес у нее будет). Посмотреть вложение 299845
далее через хвбп(hardware breakpoint - в чит енджине называется "Find out what accesses this address") находишь инструкции которые работают с этой переменной и делаешь на них сигу(чтобы при апдейтах не надо было руками обновлять всё) и потом находишь их в доте и достаешь из них операнд и делаешь из него абсолютный адрес и пишешь туда что хочешь
Спасибо, я это знал, но столкнулся с проблемой именно в визуал студио, также я не уточнил в самой теме, в чём собственно проблема
Можно ли какой-нибудь простенький пример для старта?
вылет - дебажь. а так конечно нечему тут вроде вылетать.
а какой там пример то... WriteProcessMemory(экстернал) да и всё... для теста для начала можешь через RVA адрес сделать
вылет - дебажь. а так конечно нечему тут вроде вылетать.
а какой там пример то... WriteProcessMemory(экстернал) да и всё... для теста для начала можешь через RVA адрес сделать
интернал еще проще - там чтение и запись напрямую происходят
че конкретно то ты найти не можешь. "не понимаю" это ничего не значит, это как к доктору приходить и говорить "ой у меня всё болит везде" он тебе не поможет пока ты ничего конкретного не скажешь. как искал что делал на каком шаге потерпел неудачу, блаблабла
интернал еще проще - там чтение и запись напрямую происходят
че конкретно то ты найти не можешь. "не понимаю" это ничего не значит, это как к доктору приходить и говорить "ой у меня всё болит везде" он тебе не поможет пока ты ничего конкретного не скажешь. как искал что делал на каком шаге потерпел неудачу, блаблабла
в интернале? в интернале работа с памятью осуществляется напрямую в соответствии с языком(с++).
если честно лень тебе объяснять как с++ работает... всё сложно я заебусь расписывать. почитай про указатели и ссылки. одна из основных концепций это "переменная". как следует из названия, ее значение неопределено(зависит от времени - сейчас оно одно а через 5 секунд может быть другое) и его нужно каждый раз заново смотреть, в отличии от заведомо известной константы(стоит различать константную переменную(которая один раз приняла значение и потом уже не будет меняться, но ее значение все равно заведомо неизвестно, все равно нужно его смотреть, оно просто меняться потом уже не будет; константная переменная особо ничем не отличается от обычной с технической точки зрения) и заведомо известные константы(то что уже заведомо известно еще на стадии компиляции программы; обычно они вхуяриваются напрямую в генерируемые компилятором инструкции как непосредственные значения)). любая переменная - это адрес, на котором лежит некое значение. соответственно узнать значение = прочитать с этого адреса данные, присвоить значение = записать по этому адресу данные. переменная и ее значение это разные вещи. для простоты (это не совсем так но) давай представим что работа с памятью возможна только через ссылки, а не через указатели(это одно и то же в техническом плане просто у них разные фичи с точки зрения языка). указатель превращается в ссылку через *, а ссылка в указатель через &. у ссылок нет арифметики, у указателей она есть(но она уебанская т.к. указатели это массивы неопределённой размерности и прибавление к ним это как индексация в массиве; там прибавляются элементы а не байты(например +1 для указателя на инт это будет +4 байта потому что один инт это четыре байта, +2 это будет +8 байт и т.д.)).
запись по ссылкам через =
C++:
char* client = (char*)GetModuleHandle("client.dll");//ASLR
float* g_flCameraDistance = (float*)(client + 0x51E2B70);//RVA
*g_flCameraDistance = 2000.0f;//указатель в ссылку и дальше вызов метода operator= который встроен в язык для примитивного типа float
само чтение происходит когда ссылка кастуется в свой подлежащий тип(int& в int, например)(компилятор сам это автоматически вставляет где надо), т.е. когда она из адреса "деградирует" до значения находящегося на этом адресе(это и есть считывание)
Код:
int A = 123;//еще раз, 123 это инт, A это не int это ссылка на инт(адрес где лежит наше 123)
...
int B = A;//ссылка A деградировала до 123(произошло чтение - мы же не знаем какое значение лежит в A, это же переменная - ее значение меняется, надо проверять каждый раз) и потом 123 записалось по ссылке B
указатель если что это просто число(4/8 байт на x86/x64), можно спокойно кастовать указатели в числа(std::uintptr_t) и обратно
в интернале? в интернале работа с памятью осуществляется напрямую в соответствии с языком(с++).
если честно лень тебе объяснять как с++ работает... всё сложно я заебусь расписывать. почитай про указатели и ссылки. одна из основных концепций это "переменная". как следует из названия, ее значение неопределено(зависит от времени - сейчас оно одно а через 5 секунд может быть другое) и его нужно каждый раз заново смотреть, в отличии от заведомо известной константы(стоит различать константную переменную(которая один раз приняла значение и потом уже не будет меняться, но ее значение все равно заведомо неизвестно, все равно нужно его смотреть, оно просто меняться потом уже не будет; константная переменная особо ничем не отличается от обычной с технической точки зрения) и заведомо известные константы(то что уже заведомо известно еще на стадии компиляции программы; обычно они вхуяриваются напрямую в генерируемые компилятором инструкции как непосредственные значения)). любая переменная - это адрес, на котором лежит некое значение. соответственно узнать значение = прочитать с этого адреса данные, присвоить значение = записать по этому адресу данные. переменная и ее значение это разные вещи. для простоты (это не совсем так но) давай представим что работа с памятью возможна только через ссылки, а не через указатели(это одно и то же в техническом плане просто у них разные фичи с точки зрения языка). указатель превращается в ссылку через *, а ссылка в указатель через &. у ссылок нет арифметики, у указателей она есть(но она уебанская т.к. указатели это массивы неопределённой размерности и прибавление к ним это как индексация в массиве; там прибавляются элементы а не байты(например +1 для указателя на инт это будет +4 байта потому что один инт это четыре байта, +2 это будет +8 байт и т.д.)).
запись по ссылкам через =
C++:
char* client = (char*)GetModuleHandle("client.dll");//ASLR
float* g_flCameraDistance = (float*)(client + 0x51E2B70);//RVA
*g_flCameraDistance = 2000.0f;//указатель в ссылку и дальше вызов метода operator= который встроен в язык для примитивного типа float
само чтение происходит когда ссылка кастуется в свой подлежащий тип(int& в int, например)(компилятор сам это автоматически вставляет где надо), т.е. когда она из адреса "деградирует" до значения находящегося на этом адресе(это и есть считывание)
Код:
int A = 123;//еще раз, 123 это инт, A это не int это ссылка на инт(адрес где лежит наше 123)
...
int B = A;//ссылка A деградировала до 123(произошло чтение - мы же не знаем какое значение лежит в A, это же переменная - ее значение меняется, надо проверять каждый раз) и потом 123 записалось по ссылке B
указатель если что это просто число(4/8 байт на x86/x64), можно спокойно кастовать указатели в числа(std::uintptr_t) и обратно
в интернале? в интернале работа с памятью осуществляется напрямую в соответствии с языком(с++).
если честно лень тебе объяснять как с++ работает... всё сложно я заебусь расписывать. почитай про указатели и ссылки. одна из основных концепций это "переменная". как следует из названия, ее значение неопределено(зависит от времени - сейчас оно одно а через 5 секунд может быть другое) и его нужно каждый раз заново смотреть, в отличии от заведомо известной константы(стоит различать константную переменную(которая один раз приняла значение и потом уже не будет меняться, но ее значение все равно заведомо неизвестно, все равно нужно его смотреть, оно просто меняться потом уже не будет; константная переменная особо ничем не отличается от обычной с технической точки зрения) и заведомо известные константы(то что уже заведомо известно еще на стадии компиляции программы; обычно они вхуяриваются напрямую в генерируемые компилятором инструкции как непосредственные значения)). любая переменная - это адрес, на котором лежит некое значение. соответственно узнать значение = прочитать с этого адреса данные, присвоить значение = записать по этому адресу данные. переменная и ее значение это разные вещи. для простоты (это не совсем так но) давай представим что работа с памятью возможна только через ссылки, а не через указатели(это одно и то же в техническом плане просто у них разные фичи с точки зрения языка). указатель превращается в ссылку через *, а ссылка в указатель через &. у ссылок нет арифметики, у указателей она есть(но она уебанская т.к. указатели это массивы неопределённой размерности и прибавление к ним это как индексация в массиве; там прибавляются элементы а не байты(например +1 для указателя на инт это будет +4 байта потому что один инт это четыре байта, +2 это будет +8 байт и т.д.)).
запись по ссылкам через =
C++:
char* client = (char*)GetModuleHandle("client.dll");//ASLR
float* g_flCameraDistance = (float*)(client + 0x51E2B70);//RVA
*g_flCameraDistance = 2000.0f;//указатель в ссылку и дальше вызов метода operator= который встроен в язык для примитивного типа float
само чтение происходит когда ссылка кастуется в свой подлежащий тип(int& в int, например)(компилятор сам это автоматически вставляет где надо), т.е. когда она из адреса "деградирует" до значения находящегося на этом адресе(это и есть считывание)
Код:
int A = 123;//еще раз, 123 это инт, A это не int это ссылка на инт(адрес где лежит наше 123)
...
int B = A;//ссылка A деградировала до 123(произошло чтение - мы же не знаем какое значение лежит в A, это же переменная - ее значение меняется, надо проверять каждый раз) и потом 123 записалось по ссылке B
указатель если что это просто число(4/8 байт на x86/x64), можно спокойно кастовать указатели в числа(std::uintptr_t) и обратно
братанчик, гугл и чат гпт существуют, тебе дали полный раскрытый ответ как сделать что ты хочешь, в интернете том же самом сотни примеров кода где меняют значение через writeprocessmemory, тебе просто нужно получить адресс камеры через тот же самый чит енжин и поставить его
братанчик, гугл и чат гпт существуют, тебе дали полный раскрытый ответ как сделать что ты хочешь, в интернете том же самом сотни примеров кода где меняют значение через writeprocessmemory, тебе просто нужно получить адресс камеры через тот же самый чит енжин и поставить его
это уебанское слово "разыменовывать" забудь его. указатели и ссылки - одно и то же просто с разными фичами в языке(указатели для арифметики(это массивы неограниченного размера по факту) и вызова функций, ссылки для работы с памятью(точнее вызова методов но не суть)), оба туда сюда переделываются, указатель через * перед ним переделывается в ссылку, ссылка через & перед ней переделывается в указатель. можно хоть
C++:
*&*&*&*&*&*&*&*&*&A
и это выражение будет полностью эквивалентно выражению A(при условии что A - ссылка, т.е. переменная, например)(т.е. ничего не произойдет)
надо прибавлять(арифметика) - юзай указатели(или еще в число их можно кастануть - std::uintptr_t, для какой-нибудь хуйни, например достать какой-то бит указателя или еще что-нибудь), нужно читать/писать в память/вызывать методы или операторы - юзай ссылки. туда сюда спокойно они все переделываются.
(из char* делается char&, потом делается float&, потом вызывается operator=)
эквивалентны(правда первый вариант гораздо более популярный и понятный/привычный для людей)
это уебанское слово "разыменовывать" забудь его. указатели и ссылки - одно и то же просто с разными фичами в языке(указатели для арифметики(это массивы неограниченного размера по факту) и вызова функций, ссылки для работы с памятью(точнее вызова методов но не суть)), оба туда сюда переделываются, указатель через * перед ним переделывается в ссылку, ссылка через & перед ней переделывается в указатель. можно хоть
C++:
*&*&*&*&*&*&*&*&*&A
и это выражение будет полностью эквивалентно выражению A(при условии что A - ссылка, т.е. переменная, например)(т.е. ничего не произойдет)
здесь память никак не трогается(ссылка * fn() никогда не "деградируется" до void*)
выдаст
надо прибавлять(арифметика) - юзай указатели(или еще в число их можно кастануть - std::uintptr_t, для какой-нибудь хуйни, например достать какой-то бит указателя или еще что-нибудь), нужно читать/писать в память/вызывать методы или операторы - юзай ссылки. туда сюда спокойно они все переделываются.
(из char* делается char&, потом делается float&, потом вызывается operator=)
эквивалентны(правда первый вариант гораздо более популярный и понятный/привычный для людей)
он автоматически компилятором меняется по мере добавления/удаления данных в секциях. и так будет практически с каждым апдейтом доты(клиент.длл часто меняется).