Гигант мысли, отец русской демократии.От исключения что игра не запущена можно избавится через try catch
Можно и так:От исключения что игра не запущена можно избавится через try catch
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#: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 класса для работы с памятью
Мы будем использовать класс MemoryManager, так как в нем реализованы методы, которые позволяют нам без дополнительных усилий прочитать данные из памяти процесса.
- SimpleMemoryManager
- MemoryManager(Производный класс от SimpleMemoryManager)
3)Пишем код для присоединения к процессу игры
ВАЖНО!!!
Игра должна быть запущена раньше чита, иначе мы словим исключение, что такого процесса не существует!
В первой строчке кода мы указали, что нам нужен процесс с именем "CSGO".C#:Process process = Process.GetProcessesByName("csgo")[0]; MemoryManager memory = process.GetMemoryManager();
Во второй строчке кода мы указали, что нам нужно получить экземпляр MemoryManager для работы с виртуальной памятью процесса.
4)Следующим этапом нам нужно получить модули процесса, с которыми нам нужно работать, что бы прочитать нужные нам данные
5)Создаем бесконечный цикл для того, что бы наш чит постоянно читал данные из игры и мог так же в нее записывать.C#:IntPtr client = process.GetModule("client.dll").BaseAddress;
6)Теперь нам нужно получить локального игрока из игры. Для этого в цикле нам нужно написать вот такой кодC#:while(true) { }
Число 0xD3FC5C может меняться с каждым обновлением игры. Следить за обновлением оффсетов можно на GitHub по этой ссылке:C#:IntPtr localPlayer = memory.Read<IntPtr>(client + 0xD3FC5C);
Пожалуйста, авторизуйтесь для просмотра ссылки.
7)Мы получили локального игрока, теперь нам нужно получить его флаг. С помощью него мы будем понимать в прыжке он или нет
8)Для начала сделаем проверку на нажатие кнопки пробелаC#:int flag = memory.Read<int>(localPlayer + 0x104);
Этот код нужно добавить в любой из классов
А этот код в наш цикл после получения флагаC#:[DllImport("user32.dll")] static extern bool GetAsyncKeyState(int vKey);
9)Теперь нам нужно сделать проверку, находится игрок в воздухе или на земле. Для этого нужно добавить этот код в условие проверки нажатия клавиши пробелC#:if (GetAsyncKeyState(32)) { }
10)В этом условии нам нужно сделать запись в память игры, что бы делать прыжок, когда мы оказываемся на землеC#:if(flag == 256 || flag == 262) { }
На этом все. Мы написали такой маленький и легкий код, с помощью которого наш персонаж может прыгать без остановок.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); }
Ну если ты способен своими ручками обновить оффсеты, то актуальноАктуально? 2021
[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);
}
ILMerge? Ты из какой деревни?Здравствуйте. Если вы не недавно знакомы с C#, то c помощью IlRepack и старенкого ILMerge склеить exe с любой шарповской длл-кой(только IlMerge не дружит с библиотеками, имеющие ресурсы).
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);
}
}
Привет! Но WaitForSingleObject не выкидывает Win32Exception, он наоборот пошлет возвращаемый код ошибки, но никак не эксепшн. Поэтому твой код с try-finally является бесполезным, можно обойтись и без них. Если не прав, то пришли код, который вызовет подобное поведение. Может быть ты имел ввиду, что бы я сам отправил Exception пользователю как это было с нулевым хандлом потока?@D3l0ry
Дам микросовет.
Ты конечно, работаешь с неуправляемыми типами, хэндлами и блабла, но вот вопрос. Что будет если у тебя выползет эксепшн после создания, ну например потока в процессе?
Посмотреть вложение 233219
К примеру, вызов WaitForSingleObject завершится с Win32Exception?
Ты просто потеряешь хэндл потока.
Хватит говнокодить, делай хотя бы:
И нафига тебе иметь возвращаемый тип, если у тебя либо true, либо exception? False там никогда не будет.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); } }
ты в каком классе учишься, позер? открою тайну, но .net 6.0 вышел в 21 году, если что вдруг. да и опять же при чем тут .net 6.0 и ilmergeILMerge? Ты из какой деревни?
.Net6 уже давно Publish поддерживает =)
Позер? Это ты про себя, видимо.ты в каком классе учишься, позер? открою тайну, но .net 6.0 вышел в 21 году, если что вдруг. да и опять же при чем тут .net 6.0 и ilmerge
Посмотреть вложение 233952
подожди еще пару месяцев, а потом напиши про .net 8.0, думаю прям уместно будет.
да и кажется, что .net core поддерживает аналогичную функцию паблиШ)))
Ну тут зависит от античита, мануал мап и инжект можно и на шарпе сделать.А как заинжектить в игру с нормальным античитом? Я тему погрумил, вроде как надо драйвер ядра писать. Но на шарпах такую штуку мне кажется не сделать
чеcтно, хезе для кого ты старался, ибо мне в падлу читать от микрочела что-то, который ГОВОРИТ ПРО .NET 6.0, отвечая на коммент уже трехлетней давности(для особо одаренных 2020 год). даже на твоем скриншоте видно, что .net 6.0 вышел в 2022 году xd. что в первом комменте кринжа навалил, что в этом. удивлюсь, если ты не школьник. можешь еще раз че-нибудь пукнуть, сказать, что я слился и развести очередной оффтоп - мне без разницы. по факту тут, что твой первый бессмысленный тупой коммент нужно почистить, что все остальное, что никакой пользы не имеетПозер? Это ты про себя, видимо.
Причем тут срок выхода версии языка? Речь лишь о том, чтобы упаковать зависимости в главный файл.
Способы есть разные, а 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, но этот маразм когда должен закончиться
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz