Гайд Как писать читы на C# (BunnyHop)

Monolith Development
Участник
Статус
Оффлайн
Регистрация
8 Мар 2018
Сообщения
544
Реакции[?]
195
Поинты[?]
31K
От исключения что игра не запущена можно избавится через try catch
 
вышел покурить
Пользователь
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
387
Реакции[?]
100
Поинты[?]
0
От исключения что игра не запущена можно избавится через try catch
Гигант мысли, отец русской демократии.
Можно думаю в принципе обходится без всяких условий и писать везде try catch.
 
Начинающий
Статус
Оффлайн
Регистрация
18 Янв 2019
Сообщения
50
Реакции[?]
7
Поинты[?]
0
От исключения что игра не запущена можно избавится через try catch
Можно и так:

C#:
            Process[] processList = Process.GetProcessesByName("csgo");
            Process[] procList = Process.GetProcesses();
            if (processList.Length > 0)
            {
                Process process = Process.GetProcessesByName("csgo")[0];
                MemoryManager memory = process.GetMemoryManager();

                IntPtr client = process.GetModule("client.dll").BaseAddress;


                while (true)
                {
                    IntPtr localPlayer = memory.Read<IntPtr>(client + 0xD3DD14);

                    int flag = memory.Read<int>(localPlayer + 0x104);


                    if (GetAsyncKeyState(32))
                    {
                        if (flag == 256 || flag == 262)
                        {
                            memory.Write(client + 0x51FBFA8, 4);
                        }
                        else
                        {
                            memory.Write(client + 0x51FBFA8, 5);
                        }
                    }

                    Thread.Sleep(1);
                }
            }
            else
            {
                Information3();
            }
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Можно и так:

C#:
            Process[] processList = Process.GetProcessesByName("csgo");
            Process[] procList = Process.GetProcesses();
            if (processList.Length > 0)
            {
                Process process = Process.GetProcessesByName("csgo")[0];
                MemoryManager memory = process.GetMemoryManager();

                IntPtr client = process.GetModule("client.dll").BaseAddress;


                while (true)
                {
                    IntPtr localPlayer = memory.Read<IntPtr>(client + 0xD3DD14);

                    int flag = memory.Read<int>(localPlayer + 0x104);


                    if (GetAsyncKeyState(32))
                    {
                        if (flag == 256 || flag == 262)
                        {
                            memory.Write(client + 0x51FBFA8, 4);
                        }
                        else
                        {
                            memory.Write(client + 0x51FBFA8, 5);
                        }
                    }

                    Thread.Sleep(1);
                }
            }
            else
            {
                Information3();
            }
Вообще, по-хорошему, нужно еще и делать проверку на наличие доступа к памяти процесса
 
Начинающий
Статус
Оффлайн
Регистрация
18 Янв 2019
Сообщения
50
Реакции[?]
7
Поинты[?]
0
Пользователь
Статус
Оффлайн
Регистрация
28 Июн 2020
Сообщения
366
Реакции[?]
56
Поинты[?]
1K
Всему YouGame привет! В этом гайде я решил показать, как писать читы на C#. Конечно же мы не будем с нуля писать методы для чтения и записи в память процесса, мы будем использовать библиотеку NativeManager, которая хранится в моем репозитории на GitHub. Ссылку на нее я оставлю ниже.
Ну давайте приступим)

Я не буду объяснять, как создавать проекты в VisualStudio и тому подобное, будем считать, что те, кто читают этот гайд, хотя бы немного разбираются в том, как создавать и работать с проектами в визуалке.

1)Первым делом нужно скачать библиотеку на GitHub:
Пожалуйста, авторизуйтесь для просмотра ссылки.

2)Скомпилируйте эту библиотеку у себя на компьютере
3)Создайте свой проект с будущим читом
4)Через ссылки добавьте NativeManager в свой проект
5)Приступаем к разработке!!!!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Чит мы будем создавать на примере игры CS:GO

1)После того как мы создали проект с читом, нам нужно добавить ссылки на пространства имен нашего NativeManager'a
using System.MemoryInteraction;

2)В NativeManager есть 2 класса для работы с памятью
  1. SimpleMemoryManager
  2. MemoryManager(Производный класс от SimpleMemoryManager)
Мы будем использовать класс MemoryManager, так как в нем реализованы методы, которые позволяют нам без дополнительных усилий прочитать данные из памяти процесса.

3)Пишем код для присоединения к процессу игры
ВАЖНО!!!
Игра должна быть запущена раньше чита, иначе мы словим исключение, что такого процесса не существует!
C#:
Process process = Process.GetProcessesByName("csgo")[0];
MemoryManager memory = process.GetMemoryManager();
В первой строчке кода мы указали, что нам нужен процесс с именем "CSGO".
Во второй строчке кода мы указали, что нам нужно получить экземпляр MemoryManager для работы с виртуальной памятью процесса.

4)Следующим этапом нам нужно получить модули процесса, с которыми нам нужно работать, что бы прочитать нужные нам данные
C#:
IntPtr client = process.GetModule("client.dll").BaseAddress;
5)Создаем бесконечный цикл для того, что бы наш чит постоянно читал данные из игры и мог так же в нее записывать.
C#:
while(true)
{

}
6)Теперь нам нужно получить локального игрока из игры. Для этого в цикле нам нужно написать вот такой код
C#:
IntPtr localPlayer = memory.Read<IntPtr>(client + 0xD3FC5C);
Число 0xD3FC5C может меняться с каждым обновлением игры. Следить за обновлением оффсетов можно на GitHub по этой ссылке:
Пожалуйста, авторизуйтесь для просмотра ссылки.


7)Мы получили локального игрока, теперь нам нужно получить его флаг. С помощью него мы будем понимать в прыжке он или нет
C#:
 int flag = memory.Read<int>(localPlayer + 0x104);
8)Для начала сделаем проверку на нажатие кнопки пробела
Этот код нужно добавить в любой из классов
C#:
[DllImport("user32.dll")]
static extern bool GetAsyncKeyState(int vKey);
А этот код в наш цикл после получения флага
C#:
if (GetAsyncKeyState(32))
{

}
9)Теперь нам нужно сделать проверку, находится игрок в воздухе или на земле. Для этого нужно добавить этот код в условие проверки нажатия клавиши пробел
C#:
if(flag == 256 || flag == 262)
{

}
10)В этом условии нам нужно сделать запись в память игры, что бы делать прыжок, когда мы оказываемся на земле
C#:
if (flag == 256 || flag == 262)
{
     memory.Write(client + 0x51FE22C, 4);
}
else
{
     memory.Write(client + 0x51FE22C, 5);
}
На этом все. Мы написали такой маленький и легкий код, с помощью которого наш персонаж может прыгать без остановок.
Надеюсь, я объяснил все доходчиво и понятно. Если будут какие то вопросы, то с удовольствием отвечу вам на них в комментариях.
А вот подарок тем, кто не хочет копировать код по частям.

C#:
            Process process = Process.GetProcessesByName("csgo")[0];
            MemoryManager memory = process.GetMemoryManager();

            IntPtr client = process.GetModule("client.dll").BaseAddress;

            while(true)
            {
                IntPtr localPlayer = memory.Read<IntPtr>(client + 0xD3FC5C);

                int flag = memory.Read<int>(localPlayer + 0x104);

                if (GetAsyncKeyState(32))
                {
                    if (flag == 256 || flag == 262)
                    {
                        memory.Write(client + 0x51FE22C, 4);
                    }
                    else
                    {
                        memory.Write(client + 0x51FE22C, 5);
                    }
                }

                Thread.Sleep(1);
            }
можно сделать в консольном виде?
 
Новичок
Статус
Оффлайн
Регистрация
17 Сен 2021
Сообщения
1
Реакции[?]
0
Поинты[?]
0
чел, можешь помочь с подключением всей этой бадяги?Просто я уже всё перепробовал:
System.BadImageFormatException: Could not load file or assembly 'NativeManager, Version=1.5.0.5, Culture=neutral, PublicKeyToken=null
 
Начинающий
Статус
Оффлайн
Регистрация
16 Мар 2021
Сообщения
9
Реакции[?]
1
Поинты[?]
0
Ну да а просто автокликер пробела в 10 строк работал бы лучше
 
Пользователь
Статус
Оффлайн
Регистрация
1 Апр 2020
Сообщения
91
Реакции[?]
105
Поинты[?]
0
[20.12.2022]

Обновление кода Bhop

C#:
[DllImport("user32.dll")]
static extern bool GetAsyncKeyState(int vKey);

IntPtr localPlayerOffset = (IntPtr)0xDEA964;
IntPtr forceJumpOffset = (IntPtr)0x52BBC9C;
int flagOffset = 0x104;

Process process = Process.GetProcessesByName("csgo")[0];
MemoryManager memory = process.GetMemoryManager();
ModuleManager client = process.GetModuleManager("client.dll");

while (true)
{
    IntPtr localPlayer = client.Read<IntPtr>(localPlayerOffset);
    int flag = memory.Read<int>(localPlayer + flagOffset);

    if (GetAsyncKeyState(32))
    {
        bool jumpFlag = !(flag == 256 || flag == 262);

        client.Write(forceJumpOffset, jumpFlag);
    }

    Thread.Sleep(1);
}
 
artifact.pw
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2017
Сообщения
77
Реакции[?]
67
Поинты[?]
1K
Здравствуйте. Если вы не недавно знакомы с C#, то c помощью IlRepack и старенкого ILMerge склеить exe с любой шарповской длл-кой(только IlMerge не дружит с библиотеками, имеющие ресурсы).
ILMerge? Ты из какой деревни?
.Net6 уже давно Publish поддерживает =)
 
artifact.pw
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2017
Сообщения
77
Реакции[?]
67
Поинты[?]
1K
@D3l0ry

Дам микросовет.
Ты конечно, работаешь с неуправляемыми типами, хэндлами и блабла, но вот вопрос. Что будет если у тебя выползет эксепшн после создания, ну например потока в процессе?
1672242426359.png
К примеру, вызов WaitForSingleObject завершится с Win32Exception?
Ты просто потеряешь хэндл потока.
Хватит говнокодить, делай хотя бы:
C#:
        public void Execute(IntPtr address, IntPtr args)
        {
            IntPtr thread = Kernel32.CreateRemoteThread(m_Process.Handle, IntPtr.Zero, 0, address, args, IntPtr.Zero, IntPtr.Zero);

            if (thread == IntPtr.Zero)
            {
                throw m_Process.ShowException<OverflowException>(address, "Не удалось создать новый поток внутри процесса");
            }
            try
            {
               Kernel32.WaitForSingleObject(thread, 0xFFFFFFFF);
            }
            finally
            {
               Kernel32.CloseHandle(thread);
            }
        }
И нафига тебе иметь возвращаемый тип, если у тебя либо true, либо exception? False там никогда не будет.
 
Пользователь
Статус
Оффлайн
Регистрация
1 Апр 2020
Сообщения
91
Реакции[?]
105
Поинты[?]
0
@D3l0ry

Дам микросовет.
Ты конечно, работаешь с неуправляемыми типами, хэндлами и блабла, но вот вопрос. Что будет если у тебя выползет эксепшн после создания, ну например потока в процессе?
Посмотреть вложение 233219
К примеру, вызов WaitForSingleObject завершится с Win32Exception?
Ты просто потеряешь хэндл потока.
Хватит говнокодить, делай хотя бы:
C#:
        public void Execute(IntPtr address, IntPtr args)
        {
            IntPtr thread = Kernel32.CreateRemoteThread(m_Process.Handle, IntPtr.Zero, 0, address, args, IntPtr.Zero, IntPtr.Zero);

            if (thread == IntPtr.Zero)
            {
                throw m_Process.ShowException<OverflowException>(address, "Не удалось создать новый поток внутри процесса");
            }
            try
            {
               Kernel32.WaitForSingleObject(thread, 0xFFFFFFFF);
            }
            finally
            {
               Kernel32.CloseHandle(thread);
            }
        }
И нафига тебе иметь возвращаемый тип, если у тебя либо true, либо exception? False там никогда не будет.
Привет! Но WaitForSingleObject не выкидывает Win32Exception, он наоборот пошлет возвращаемый код ошибки, но никак не эксепшн. Поэтому твой код с try-finally является бесполезным, можно обойтись и без них. Если не прав, то пришли код, который вызовет подобное поведение. Может быть ты имел ввиду, что бы я сам отправил Exception пользователю как это было с нулевым хандлом потока?
 
Последнее редактирование:
вышел покурить
Пользователь
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
387
Реакции[?]
100
Поинты[?]
0
ILMerge? Ты из какой деревни?
.Net6 уже давно Publish поддерживает =)
ты в каком классе учишься, позер? открою тайну, но .net 6.0 вышел в 21 году, если что вдруг. да и опять же при чем тут .net 6.0 и ilmerge
1672706655643.png
подожди еще пару месяцев, а потом напиши про .net 8.0, думаю прям уместно будет.
да и кажется, что .net core поддерживает аналогичную функцию паблиШ)))
 
Начинающий
Статус
Оффлайн
Регистрация
21 Фев 2021
Сообщения
16
Реакции[?]
1
Поинты[?]
1K
А как заинжектить в игру с нормальным античитом? Я тему погрумил, вроде как надо драйвер ядра писать. Но на шарпах такую штуку мне кажется не сделать
 
artifact.pw
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2017
Сообщения
77
Реакции[?]
67
Поинты[?]
1K
ты в каком классе учишься, позер? открою тайну, но .net 6.0 вышел в 21 году, если что вдруг. да и опять же при чем тут .net 6.0 и ilmerge
Посмотреть вложение 233952
подожди еще пару месяцев, а потом напиши про .net 8.0, думаю прям уместно будет.
да и кажется, что .net core поддерживает аналогичную функцию паблиШ)))
Позер? Это ты про себя, видимо.
Причем тут срок выхода версии языка? Речь лишь о том, чтобы упаковать зависимости в главный файл.
Способы есть разные, а publish лишь один из них, нативный, который поддерживается без использования древних эльфийских deprecated технологий уровня ILMerge.

1673276272678.png

Вот поэтому и древние.
Вот именно из-за таких как ты, у которых фундаментальные знания языка, да и всей платформы на уровне "Да и кажется" и наплодилось всяких разновидностей пастеров, которые не в состоянии сделать элементарный Single-File деплой.
Помимо слияния (Merge) существует ещё и внедрение(Embedded), а есть ещё упаковка (Package).
Результат один - методы разные.

Ты собираешься этим упаковывать свои .NET Standard костыли для поддержки умирающего фреймворка, когда .NET 6 вышел на LTS?

1673276951976.png

Вот тебе таблицы и фактическая информация, а не метание икры в стиле "Позер, какой класс".
Поэтому либо обосновывай свое мнение и дискутируй на уровне профи, а если познания или геном тебе не позволяют - то и зачем захламлять форум низкосортными и бессодержательными комментами.

Да, я рабухтелся, но сам посмотри что мы имеем в итоге: Куча всякого допотопного хлама на .Net Standard для якобы поддержки разработки из под какой-нибудь .NET Framework 8, когда софт выходит в 2022 году.
Куча говно-UI на WinForms из ютубовских мануалов индусов 2004 года выпуска, когда уже WPF обзавелся седой бородой и вышел WinUI 3. А про всякие авалоны даже речи не идет.

Я конечно, понимаю, что молодым пастерам тяжело двигаться дальше присвоения значений переменным, WinForms и WinApi, но этот маразм когда должен закончиться
 
Последнее редактирование:
artifact.pw
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2017
Сообщения
77
Реакции[?]
67
Поинты[?]
1K
А как заинжектить в игру с нормальным античитом? Я тему погрумил, вроде как надо драйвер ядра писать. Но на шарпах такую штуку мне кажется не сделать
Ну тут зависит от античита, мануал мап и инжект можно и на шарпе сделать.
Ты можешь даже сделать инжект управляемой библиотеки в неуправляемые процесс и сделать хук функций и вообще творить что вздумается,
но нужно запустить в целевом процессе CLR.

Делается это через CLRCreateInstance
Пожалуйста, авторизуйтесь для просмотра ссылки.


В целом ты можешь покурить исходный код EasyHook
Пожалуйста, авторизуйтесь для просмотра ссылки.


Там есть драйвер, но можно обойтись и без него.

Или есть ещё вариант написать простенький драйвер, который будет писать в память процесса, запускать там поток или использовать исполняемый с использованием CodeCave для инжекта, зависит от фантазии.
А взаимодействовать с драйвером уже через DeviceIOControl или FltSendMessage.
 
вышел покурить
Пользователь
Статус
Оффлайн
Регистрация
17 Май 2018
Сообщения
387
Реакции[?]
100
Поинты[?]
0
Позер? Это ты про себя, видимо.
Причем тут срок выхода версии языка? Речь лишь о том, чтобы упаковать зависимости в главный файл.
Способы есть разные, а publish лишь один из них, нативный, который поддерживается без использования древних эльфийских deprecated технологий уровня ILMerge.

Посмотреть вложение 234724

Вот поэтому и древние.
Вот именно из-за таких как ты, у которых фундаментальные знания языка, да и всей платформы на уровне "Да и кажется" и наплодилось всяких разновидностей пастеров, которые не в состоянии сделать элементарный Single-File деплой.
Помимо слияния (Merge) существует ещё и внедрение(Embedded), а есть ещё упаковка (Package).
Результат один - методы разные.

Ты собираешься этим упаковывать свои .NET Standard костыли для поддержки умирающего фреймворка, когда .NET 6 вышел на LTS?

Посмотреть вложение 234729

Вот тебе таблицы и фактическая информация, а не метание икры в стиле "Позер, какой класс".
Поэтому либо обосновывай свое мнение и дискутируй на уровне профи, а если познания или геном тебе не позволяют - то и зачем захламлять форум низкосортными и бессодержательными комментами.

Да, я рабухтелся, но сам посмотри что мы имеем в итоге: Куча всякого допотопного хлама на .Net Standard для якобы поддержки разработки из под какой-нибудь .NET Framework 8, когда софт выходит в 2022 году.
Куча говно-UI на WinForms из ютубовских мануалов индусов 2004 года выпуска, когда уже WPF обзавелся седой бородой и вышел WinUI 3. А про всякие авалоны даже речи не идет.

Я конечно, понимаю, что молодым пастерам тяжело двигаться дальше присвоения значений переменным, WinForms и WinApi, но этот маразм когда должен закончиться
чеcтно, хезе для кого ты старался, ибо мне в падлу читать от микрочела что-то, который ГОВОРИТ ПРО .NET 6.0, отвечая на коммент уже трехлетней давности(для особо одаренных 2020 год). даже на твоем скриншоте видно, что .net 6.0 вышел в 2022 году xd. что в первом комменте кринжа навалил, что в этом. удивлюсь, если ты не школьник. можешь еще раз че-нибудь пукнуть, сказать, что я слился и развести очередной оффтоп - мне без разницы. по факту тут, что твой первый бессмысленный тупой коммент нужно почистить, что все остальное, что никакой пользы не имеет
 
Сверху Снизу