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

  • Автор темы Автор темы D3l0ry
  • Дата начала Дата начала
От исключения что игра не запущена можно избавится через try catch
 
От исключения что игра не запущена можно избавится через try catch
Гигант мысли, отец русской демократии.
Можно думаю в принципе обходится без всяких условий и писать везде try catch.
 
От исключения что игра не запущена можно избавится через try catch
Можно и так:

C#:
Expand Collapse Copy
            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();
            }
 
Можно и так:

C#:
Expand Collapse Copy
            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();
            }
Вообще, по-хорошему, нужно еще и делать проверку на наличие доступа к памяти процесса
 
Всему 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#:
Expand Collapse Copy
Process process = Process.GetProcessesByName("csgo")[0];
MemoryManager memory = process.GetMemoryManager();
В первой строчке кода мы указали, что нам нужен процесс с именем "CSGO".
Во второй строчке кода мы указали, что нам нужно получить экземпляр MemoryManager для работы с виртуальной памятью процесса.

4)Следующим этапом нам нужно получить модули процесса, с которыми нам нужно работать, что бы прочитать нужные нам данные
C#:
Expand Collapse Copy
IntPtr client = process.GetModule("client.dll").BaseAddress;

5)Создаем бесконечный цикл для того, что бы наш чит постоянно читал данные из игры и мог так же в нее записывать.
C#:
Expand Collapse Copy
while(true)
{

}

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


7)Мы получили локального игрока, теперь нам нужно получить его флаг. С помощью него мы будем понимать в прыжке он или нет
C#:
Expand Collapse Copy
 int flag = memory.Read<int>(localPlayer + 0x104);

8)Для начала сделаем проверку на нажатие кнопки пробела
Этот код нужно добавить в любой из классов
C#:
Expand Collapse Copy
[DllImport("user32.dll")]
static extern bool GetAsyncKeyState(int vKey);

А этот код в наш цикл после получения флага
C#:
Expand Collapse Copy
if (GetAsyncKeyState(32))
{

}

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

}

10)В этом условии нам нужно сделать запись в память игры, что бы делать прыжок, когда мы оказываемся на земле
C#:
Expand Collapse Copy
if (flag == 256 || flag == 262)
{
     memory.Write(client + 0x51FE22C, 4);
}
else
{
     memory.Write(client + 0x51FE22C, 5);
}

На этом все. Мы написали такой маленький и легкий код, с помощью которого наш персонаж может прыгать без остановок.
Надеюсь, я объяснил все доходчиво и понятно. Если будут какие то вопросы, то с удовольствием отвечу вам на них в комментариях.
А вот подарок тем, кто не хочет копировать код по частям.

C#:
Expand Collapse Copy
            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);
            }
можно сделать в консольном виде?
 
Актуально? 2021
 
чел, можешь помочь с подключением всей этой бадяги?Просто я уже всё перепробовал:
System.BadImageFormatException: Could not load file or assembly 'NativeManager, Version=1.5.0.5, Culture=neutral, PublicKeyToken=null
 
Здравствуйте, а как именно называется оффсет
 
Ну да а просто автокликер пробела в 10 строк работал бы лучше
 
[20.12.2022]

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

C#:
Expand Collapse Copy
[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);
}
 
Здравствуйте. Если вы не недавно знакомы с C#, то c помощью IlRepack и старенкого ILMerge склеить exe с любой шарповской длл-кой(только IlMerge не дружит с библиотеками, имеющие ресурсы).
ILMerge? Ты из какой деревни?
.Net6 уже давно Publish поддерживает =)
 
@D3l0ry

Дам микросовет.
Ты конечно, работаешь с неуправляемыми типами, хэндлами и блабла, но вот вопрос. Что будет если у тебя выползет эксепшн после создания, ну например потока в процессе?
1672242426359.png

К примеру, вызов WaitForSingleObject завершится с Win32Exception?
Ты просто потеряешь хэндл потока.
Хватит говнокодить, делай хотя бы:
C#:
Expand Collapse Copy
        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 там никогда не будет.
 
@D3l0ry

Дам микросовет.
Ты конечно, работаешь с неуправляемыми типами, хэндлами и блабла, но вот вопрос. Что будет если у тебя выползет эксепшн после создания, ну например потока в процессе?
Посмотреть вложение 233219
К примеру, вызов WaitForSingleObject завершится с Win32Exception?
Ты просто потеряешь хэндл потока.
Хватит говнокодить, делай хотя бы:
C#:
Expand Collapse Copy
        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 пользователю как это было с нулевым хандлом потока?
 
Последнее редактирование:
ILMerge? Ты из какой деревни?
.Net6 уже давно Publish поддерживает =)
ты в каком классе учишься, позер? открою тайну, но .net 6.0 вышел в 21 году, если что вдруг. да и опять же при чем тут .net 6.0 и ilmerge
1672706655643.png

подожди еще пару месяцев, а потом напиши про .net 8.0, думаю прям уместно будет.
да и кажется, что .net core поддерживает аналогичную функцию паблиШ)))
 
А как заинжектить в игру с нормальным античитом? Я тему погрумил, вроде как надо драйвер ядра писать. Но на шарпах такую штуку мне кажется не сделать
 
ты в каком классе учишься, позер? открою тайну, но .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, но этот маразм когда должен закончиться
 
Последнее редактирование:
А как заинжектить в игру с нормальным античитом? Я тему погрумил, вроде как надо драйвер ядра писать. Но на шарпах такую штуку мне кажется не сделать
Ну тут зависит от античита, мануал мап и инжект можно и на шарпе сделать.
Ты можешь даже сделать инжект управляемой библиотеки в неуправляемые процесс и сделать хук функций и вообще творить что вздумается,
но нужно запустить в целевом процессе CLR.

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


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


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

Или есть ещё вариант написать простенький драйвер, который будет писать в память процесса, запускать там поток или использовать исполняемый с использованием CodeCave для инжекта, зависит от фантазии.
А взаимодействовать с драйвером уже через DeviceIOControl или FltSendMessage.
 
Позер? Это ты про себя, видимо.
Причем тут срок выхода версии языка? Речь лишь о том, чтобы упаковать зависимости в главный файл.
Способы есть разные, а 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. что в первом комменте кринжа навалил, что в этом. удивлюсь, если ты не школьник. можешь еще раз че-нибудь пукнуть, сказать, что я слился и развести очередной оффтоп - мне без разницы. по факту тут, что твой первый бессмысленный тупой коммент нужно почистить, что все остальное, что никакой пользы не имеет
 
Назад
Сверху Снизу