Гость BZK_GH Опубликовано 22 октября, 2011 Поделиться Опубликовано 22 октября, 2011 Всем привет, решил делать трейнер на языке Visual C# пока простой, нашёл в сети коды но на том форуме где брал коды трейнера там мертвый форум ни кто не отвечает на тему, вот простой изменяет значение денег и можно редактировать значение денег когда статичный адрес:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace Trainer{ public partial class Form1 : Form { VAMemory VAM; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { VAM = new VAMemory("Need for Speed Underground 2"); //Имя процесса, без .exe! label2.Text = (Convert.ToString(VAM.ReadByte((IntPtr)0x00861E74))); //label2 принимает значение по адрессу 00861E74 } private void button2_Click(object sender, EventArgs e) { VAM = new VAMemory("Need for Speed Underground 2"); // Имя процесса, без .exe! VAM.WriteByte((IntPtr)0x00861E74, Byte.Parse(textBox1.Text.ToString())); // Изменяем значение по адресу 00861E74 }}}Тут такой вопрос как сделать чтоб можно было значение денег больше 255, я так понял тут указываем тип как Байт оно от 0 до 255 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 октября, 2011 Поделиться Опубликовано 22 октября, 2011 Класс VAMemory должен иметь методы чтения не только ReadByte, но и других. Соответственно Byte заменить на нужный тип.По аналогии Byte.Parse, так нужно заменить на нужный тип. Да и почти все ответы можно найти в MSDN. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость BZK_GH Опубликовано 22 октября, 2011 Поделиться Опубликовано 22 октября, 2011 Тип ULong. { VAM = new VAMemory("Need for Speed Underground 2"); label2.Text = (Convert.ToString(VAM.ReadULong((IntPtr)0x00861E74))); } private void button2_Click(object sender, EventArgs e) { VAM = new VAMemory("Need for Speed Underground 2"); VAM.WriteULong((IntPtr)0x00861E74, ulong.Parse(textBox1.Text.ToString()));Спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Kvazimado Опубликовано 23 октября, 2011 Поделиться Опубликовано 23 октября, 2011 Я сам перенес тренер, если конечно не возражаешь.Теперь ты сам можешь постить туда свои тренеры, ибо перевели тебя в группу разрабов. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 октября, 2011 Поделиться Опубликовано 23 октября, 2011 В группу добавлен.При публикация нужно писать версию игры.На счёт трейнера. Я рекомендую использовать MasterGHLuaTrainerSource_V1.lua и использовать Cheat Engine6.2 в качестве исполняемой программы для скриптов .CETRAINER. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 Адреса лучше вынести в const, VAM - тоже, инициализируя его в конструкторе (зачем каждый раз новый объект создавать?), а то не очень удобно стороннему разработчику будет в коде разбираться. А так - неплохо. PS: Обработчик исключений тоже не помешал бы. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 1) Да исключения хорошо было бы обрабатывать, если они возникают хотя бы два: нет процесса, нет доступа к адресу.2) По поводу вновь создаваемого VAM = new VAMemory("Need for Speed Underground 2");Так можно писать и возможно даже нужно в данном случае, т.к. нет кода поиска процесса или его запуска и подразумевается, что трейнер будет работать, если игра будет открыта и закрыта несколько раз (типа подстраховки, чтобы не запускать трейнер вновь). Помним, что сборщик мусора следит за "мусором в памяти" и можно писать new в случаях, когда он не очень часто применяется. 3) Ну и наконец неплохо бы использовать такой метод как инкапсуляция и по возможности не писать код в одну строчку.using System;using System.Collections.Generic;using System.ComponentModel;using System.Text;using System.Windows.Forms;namespace Trainer{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label2.Text = GameNFS.GetMoney(); } private void button2_Click(object sender, EventArgs e) { var newMoneyValue = textBox1.Text.ToString(); GameNFS.SetMoney(newMoneyValue); } } public static class GameNFS { const _processName = "Need for Speed Underground 2"; const _addressMoney = 0x00861E74; public static string GetMoney() { var VAM = new VAMemory(_processName); var moneyValue = VAM.ReadUlong((IntPtr)_addressMoney); return Convert.ToString(moneyValue); } public string void SetMoney(string newMoneyValue) { var VAM = new VAMemory(_processName); var uintMoneyValue = uint.Parse(newMoneyValue) VAM.WriteByte((IntPtr)0x00861E74, uintMoneyValue); } }}На ошибки я не проверял... Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 Делать трейнер на VS C# это круто, скачал трейнер от BZK_GH прям неплохо, но у меня не работает версия совпадает игра NfSU2 Такая ошибкаРешил так скачал VAMemory.dll трейнер работает тока в присутствии файл VAMemory.dll. Получается файл должен быть вместе с трейнером? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 VAMemory.dll как один из вариантов должна быть рядом. Второй вариант включить в ресурсы и извлекать из них. Третий вариант, написать свою обвёртку по работе Api Windows. Есть и другие.Делать трейнеры на C# как и на любом другом языке программирования круто до поры до времени. Потом можно понять, что придётся прикручивать что-то типа автоассемблера из Cheat Engine, потом в конце поймёшь зачем прикручивать, когда можно пользоваться CE и когда последний периодически обновляется с новыми идеями и возможностями. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 Что можете сказать об этом коде. Я так понял что тут ни какой VAMemory.dll. не нужен. Тут больше комментарии что к чему надо разобраться.using System;using System.Windows.Forms;using System.Diagnostics;using System.Runtime.InteropServices;namespace MMOhaxCsharpTrainerBase{ public partial class Trainer : Form { public Trainer() { InitializeComponent(); } // imports from WinAPI, for more information see http://www.pinvoke.net/ and http://msdn.microsoft.com/ // http://www.pinvoke.net/default.aspx/kernel32/WriteProcessMemory.html // WriteProcessMemory writes memory to a specific address in the target process memory space [DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")] private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, [Out] int lpNumberOfBytesWritten); // http://www.pinvoke.net/default.aspx/kernel32/ReadProcessMemory.html // ReadProcessMemory reads memory from a specified address in the target process memory space [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")] private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, [Out] int lpNumberOfBytesRead); [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")] private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] IntPtr lpBuffer, int dwSize, [Out] int lpNumberOfBytesRead); // http://www.pinvoke.net/default.aspx/kernel32/OpenProcess.html // OpenProcess is used to open the process (obviously) [DllImport("kernel32.dll", EntryPoint = "OpenProcess")] private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); private static int ProcessID = -1; // will hold ID of the game process private static IntPtr ProcessHandle = IntPtr.Zero; // will hold handle to the game process // Connect function will open the game process private bool Connect() { Process.EnterDebugMode(); // gain debug privileges // GetProcessesByName gets all running processes with the specified name Process[] processes = Process.GetProcessesByName("winmine"); // winmine.exe is Windows XP Minesweeper ProcessID = processes[0].Id; // assume the first found process is the correct one, because otherwise 2 instances of the game would be running if (ProcessID == 0) { // game process not found Process.LeaveDebugMode(); return false; } // open process and save the handle of it // we start looking up OpenProcess at MSDN http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx // "The access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights." // click the link to "process access rights", http://msdn.microsoft.com/en-us/library/ms684880(v=VS.85).aspx // PROCESS_ALL_ACCESS - All possible access rights for a process object. // yeah, we might aswell use that // if we look at http://www.pinvoke.net/default.aspx/kernel32/OpenProcess.html // we see that All = 0x001F0FFF ProcessHandle = OpenProcess(0x001F0FFF/*PROCESS_ALL_ACCESS*/, false, ProcessID); return true; } // Disconnect function will close the game process & clean up private void Disconnect() { Process.LeaveDebugMode(); // no need to still have debug privileges } private uint adrTime = 0x0100579C; // this is the address where time-variable is located in Windows XP Minesweeper, get this with Cheat Engine private uint freezeTime = 0; private void checkBox_CheckedChanged(object sender, EventArgs e) { if (Connect() == false) { return; } byte[] buffer = new byte[4]; ReadProcessMemory(ProcessHandle, (IntPtr)adrTime, buffer, buffer.Length, 0); freezeTime = BitConverter.ToUInt32(buffer, 0); Disconnect(); } private void timer_Tick(object sender, EventArgs e) { if (Connect() == false) { return; } if (checkBox.Checked == true) // if the "freeze value" checkbox is ticked, make sure the value is same as when frozen { WriteProcessMemory(ProcessHandle, (IntPtr)adrTime, BitConverter.GetBytes(freezeTime), 4/*an int is 4 bytes in size*/, 0); } byte[] buffer = new byte[4]; ReadProcessMemory(ProcessHandle, (IntPtr)adrTime, buffer, buffer.Length, 0); uint Time = BitConverter.ToUInt32(buffer, 0); textBox.Text = Time.ToString(); Disconnect(); } private void button_Click(object sender, EventArgs e) { if (Connect() == false) { return; } // set game timer to 0 when button is clicked WriteProcessMemory(ProcessHandle, (IntPtr)adrTime, BitConverter.GetBytes(0), 4/*an int is 4 bytes in size*/, 0); freezeTime = 0; Disconnect(); } private void pictureBox_Click(object sender, EventArgs e) { // when picture is clicked, open website System.Diagnostics.Process.Start("http://www.mmohax.com/"); } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 24 октября, 2011 Поделиться Опубликовано 24 октября, 2011 Как раз здесь не нужен этот модуль . И здесь код хаотичный, т.к. аналогично - без инкапсуляции данных. Без инкапсуляции приходится читать код в 2-3 раза медленнее. Суть такова. Есть чексбокс. Когда в нём ставим галку то, происходит заморозка по таймеру.Очевидно что нужно создать статический класс Трейнера и из обработчиков класса формы использовать методы класса трейнера.В C# нельзя обратиться к API функциям без объявления их импорта, типа этого. [DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")] private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, [Out] int lpNumberOfBytesRead);Если писать на VC++, то с этим меньше гемора, т.к. там все эти функции используются через windows.h. А вообще как я сказал код без классов смотрится как "каша" или как бордак на рабочем столе как у меня сейчас. Куча ярылков, все некогда разгрести.Если сравнивать C# и С++ для создания трейнеров, то есть свои плюсы и минусы, которые зависят от того, какой трейнер нужен Разработчику. В качестве интерфейса C# нагляднее для новичков в программировании. А вообще на Visual Studio можно создавать два вида форм. Windows Forms и WPF. Последняя технология более смахивает на программирование по html разметке, только там разметка называется XAML. Я на ней уже не кодил почти два месяца, а раньше в захлёб писал только на WPF + C# каждый день в течении года, но когда я нашёл работу по Unity3D, то пришлось о Visual Studio пока забыть и писать на MonoDevelop. В данный момент вожусь с импортом и оптимизацией под Андроид, а затем под IPAD и Web-плеер в качестве плагина. Вообще я не жалею, что столько времени угрохал на GUI Windows и перешёл на GUI в Unity3D. Не жалею что сейчас работаю с .NET2.0, когда привык к .NET4.0 к Linq-выражениям.... Ладно, что-то я от темы отклонился.Короче, советую писать трейнеры на Cheat Engine. Есть прекрасное направление -> создание АА-скрипта по дизассемблерному коду, когда вы заранее не знаете, какая инструкция будет по адресу сигнатуры, но вы знаете первый байт.Адрес1: mov "вы не знаете что здесь","вы не знаете что здесь"*Адрес1 находим по сигнатуреНа Lua-engine можно написать небольшой парсер для основных инструкцийmov [reg1], reg2mov reg1, [reg2]mov reg1,reg2И если по адресу1, есть какой-то известный шаблон из трёх выше, то можно сделать генерацию АА-скрипта по шаблону и правилу. Например, правило "постоянное значение". В результате сгенерировать АА-скрипт с постоянным значением...Большинство трейнеров на языках программирования под Windows не обладают той потенциальной мощью, которую предоставляет Cheat Engine + Lua. Если эта мощь не нужна и хочется делать трйенеры для каждой версии игры, где каждый трейнеры весит от 16 кб (хороший трейнер на С++ или Дельфи без VCL или на MASM) до размера трейнера в 3 Мб сгенерированного на CE, то конечно это предпочтение каждого. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 25 октября, 2011 Поделиться Опубликовано 25 октября, 2011 Если эта мощь не нужна и хочется делать трйенеры для каждой версии игры, где каждый трейнеры весит от 16 кбКод для поиска по сигнатуре в том же ассемблере занимает строчек пять. Или я что-то не так понял? О_о Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 октября, 2011 Поделиться Опубликовано 25 октября, 2011 keng, я думаю что не пять, а более.В моих целях применять ассемблер и диззассемблер во время работы трейнера используя CE Lua-engine - скрипты для создания автоматически формируемых инъекции по неизвестным дизассемблерными инструкциям по адресам внедрения нового кода с условиями в виде правил. Возможно твои цели менее глобальны и сканер на MASM-е тебя вполне устроит.Например, я желаю, чтобы программа нашла адрес сигнатуры кода и независимо от того какой именной машинный код там будет произойдёт внедрение постоянного условия - чтобы значение на текущей инструкции соответствовало правилу "Постоянное значение 500". Т.е. если у нас там будет mov eax, ebx, то сформируется АА-скрипт по записи в ebx числа 555, записи в eax значения из ebx и прыжок обратно в игровую рутину.Суть в том, что нужен не только сканер сигнатур, а дизассемблер и ассемблер и всё это во время уже запущенного трейнера. Пока я эту фишку с автоматически формируемыми инъекциями на CE Lua-Engine не реализовал. Зато сделал на Дельфи (где-то больше года назад что ли) для самых распространённых инструкций: mov, add, sub.... Исходники лежат в закрытом подфоруме, но видны Разработчикам.. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 26 октября, 2011 Поделиться Опубликовано 26 октября, 2011 В коде BZK_GH как поменять баттон на горячие клавиши типа нампад1 и далее, какая функция реагирует и записывать значение на адрес, примеры есть где на си шарп? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 октября, 2011 Поделиться Опубликовано 26 октября, 2011 C# как и любой другой язык программирования имеет техническую справочную документацию. Чтобы освоить язык на минимуме и применять его в таких простых вопросах сначала изучают назначения основных сборок, пространств имен в этой документации. Затем идём по классам. И находим класс Keyboard System.Windows - пространства имен System.Windows.Input Keyboard - класс Keyboard - методы AddGotKeyboardFocusHandler - метод AddKeyboardInputProviderAcquireFocusHandler - метод AddKeyDownHandler - метод AddKeyUpHandler - метод AddLostKeyboardFocusHandler - метод AddPreviewGotKeyboardFocusHandler - метод AddPreviewKeyboardInputProviderAcquireFocusHandler - метод AddPreviewKeyDownHandler - метод AddPreviewKeyUpHandler - метод AddPreviewLostKeyboardFocusHandler - метод ClearFocus - метод Focus - метод GetKeyStates - метод IsKeyDown - метод --- > вот что тебе надо //....Перейди по ссылке на которой найдёшь описание нужного примера.Вот ещё пример://...if (Keyboard.IsKeyDown(Key.A)) return true;//... Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 29 октября, 2011 Поделиться Опубликовано 29 октября, 2011 Простой пример трейнера из сети на VSC# выдает ошибку.using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Diagnostics;using System.Runtime.InteropServices;using System.Windows.Forms;namespace dsf{ public partial class Form1 : Form { public Form1() { InitializeComponent(); [DllImport ("kernel32.dll")] public static extern Int32 CloseHandle(IntPtr hObject); // На эту строку ругается,не запускается приложение. [DllImport ("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport ("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten); private void button1_Click(object sender, EventArgs e) { IntPtr pHandle; IntPtr Address = (IntPtr)0x00B7CE54; uint[] Write = new uint[] { 0xFFFFF }; System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("gta_sa"); pHandle = OpenProcess(0x1F0FFF, 0, (UInt32)proc[0].Id); WriteProcessMemory(pHandle, Address, Write, 4, (IntPtr)0); CloseHandle(pHandle); } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 29 октября, 2011 Поделиться Опубликовано 29 октября, 2011 Простой пример трейнера из сети на VSC# выдает ошибку.using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Diagnostics;using System.Runtime.InteropServices;using System.Windows.Forms;namespace dsf{ public partial class Form1 : Form { public Form1() { InitializeComponent(); [DllImport ("kernel32.dll")] public static extern Int32 CloseHandle(IntPtr hObject); // На эту строку ругается,не запускается приложение. [DllImport ("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport ("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten); private void button1_Click(object sender, EventArgs e) { IntPtr pHandle; IntPtr Address = (IntPtr)0x00B7CE54; uint[] Write = new uint[] { 0xFFFFF }; System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("gta_sa"); pHandle = OpenProcess(0x1F0FFF, 0, (UInt32)proc[0].Id); WriteProcessMemory(pHandle, Address, Write, 4, (IntPtr)0); CloseHandle(pHandle); } }}А что за ошибку выдаёт? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 Попробуй так:using System;using System.Linq;using System.Runtime.InteropServices;using System.Windows.Forms;namespace SimpleTrainer{ public partial class TrainerForm : Form { public TrainerForm() { InitializeComponent(); } const string ProcessName = "winmine"; // изменить на имя другого процесса private void Button1Click(object sender, EventArgs e) { // Изменить на нужный адрес SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x010056A4, new uint[] { 0xFFFFF }, 4); } public static class SystemProcess { [DllImport("kernel32.dll")] public static extern Int32 CloseHandle(IntPtr hObject); [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten); public static void WriteMemoryData(string processName, IntPtr address, uint[] writeData, uint sizeData) { var idProcess = (UInt32)System.Diagnostics.Process.GetProcessesByName(processName).First().Id; var hProcess = OpenProcess(0x1F0FFF, 0, idProcess); WriteProcessMemory(hProcess, address, writeData, sizeData, (IntPtr)0); CloseHandle(hProcess); } } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id 1F0FF (хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id 1F0FF (хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?Я мало что понял из твоего сообщения. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 Ладно, иногда я сам себя не пойму (Когда человек много знает, больше тупит начнет). Вот собираюсь писать статью на тему Создаем простой трейнер на VC#2010 . Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 октября, 2011 Поделиться Опубликовано 30 октября, 2011 MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id 1F0FF (хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?Это один из аргументов WinAPI-функции OpenProcess. Конкретно, PROCESS_ALL_ACCESS, устанавливает то, с какими правами один процесс получает доступ к другому. Компьютер всё равно не понимает букв (для него существуют только биты - байты - два байта - четыре байта), но вот человеку проще запомнить слова, чем цифры. Можно было записать и как:Openprocess(PROCESS_ALL_ACCESS, pHandle, pId)но перед этим объявить константу вида PROCESS_ALL_ACCESS=0x1F0FF. Подробнее про функцию - вот тут. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 1 ноября, 2011 Поделиться Опубликовано 1 ноября, 2011 keng понял что к чему СПС.В общем сделал трейнер на VC#Вывод: В Cheat Engine делать трейнер намного проще чем на VS. MessageBox.Show("Это мое мнение"); Код:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Runtime.InteropServices;using System.Windows.Forms;namespace gtatrn{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } const string ProcessName = "gta_sa"; private void checkBox1_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B7CE50, new uint[] { 0x05F5E0FF }, 4); SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B7CE54, new uint[] { 0x05F5E0FF }, 4); timer1.Enabled = true; } public static class SystemProcess { [DllImport("kernel32.dll")] public static extern Int32 CloseHandle(IntPtr hObject); [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten); public static void WriteMemoryData(string processName, IntPtr address, uint[] writeData, uint sizeData) { var idProcess = (UInt32)System.Diagnostics.Process.GetProcessesByName(processName).First().Id; var hProcess = OpenProcess(0x1F0FFF, 0, idProcess); WriteProcessMemory(hProcess, address, writeData, sizeData, (IntPtr)0); CloseHandle(hProcess); } } private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { System.Diagnostics.Process[] myprocess = System.Diagnostics.Process.GetProcessesByName("gta_sa"); if (myprocess.Length != 0) { checkBox1.Enabled = true; checkBox2.Enabled = true; checkBox3.Enabled = true; checkBox4.Enabled = true; checkBox5.Enabled = true; checkBox6.Enabled = true; } else { checkBox1.Enabled = false; checkBox2.Enabled = false; checkBox3.Enabled = false; checkBox4.Enabled = false; checkBox5.Enabled = false; checkBox6.Enabled = false; } } private void checkBox2_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B793DC, new uint[] { 0x447A0000 }, 4); timer1.Enabled = true; } private void pictureBox2_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("http://forum.gamehacklab.ru//"); } private void Form1_Deactivate(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.ShowInTaskbar = false; notifyIcon1.Visible = true; } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; notifyIcon1.Visible = false; } } private void button1_Click(object sender, EventArgs e) { Close(); } private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { notifyIcon1.Icon = SystemIcons.Application; notifyIcon1.BalloonTipText = "Трейнер свернут на трее"; notifyIcon1.ShowBalloonTip(1000); } else if (this.WindowState == FormWindowState.Normal) { notifyIcon1.BalloonTipText = "Востановлено"; notifyIcon1.ShowBalloonTip(1000); } } private void notifyIcon1_DoubleClick(object sender, EventArgs e) { this.WindowState = FormWindowState.Normal; } private void showFormToolStripMenuItem_Click(object sender, EventArgs e) { this.WindowState = FormWindowState.Normal; } private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { } private void exitToolStripMenuItem_Click_1(object sender, EventArgs e) { Application.Exit(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("Made by ZOCKIR"); } private void checkBox3_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B70153, new uint[] { 0x01 }, 1); timer1.Enabled = true; } private void checkBox5_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B793D4, new uint[] { 0x447A0000 }, 4); timer1.Enabled = true; } private void checkBox4_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B70153, new uint[] { 0x0D }, 1); timer1.Enabled = true; } private void checkBox6_CheckedChanged(object sender, EventArgs e) { SystemProcess.WriteMemoryData(ProcessName, (IntPtr)0x00B793D4, new uint[] { 0x0000000A }, 4); timer1.Enabled = true; } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { System.Diagnostics.Process.Start("http://forum.gamehacklab.ru//"); } } } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 2 ноября, 2011 Поделиться Опубликовано 2 ноября, 2011 ZOCKIR, ну ещё можно было бы доработать чтобы код смотрелся удобнее. Чтобы не приходилось часто в аргумент функции передавать имя процесса, а также чтобы не приходилось для каждого чексбокса писать обработчик. И лучше работать с массивом структур : "адрес, значение, размер в байтах "... Также создать класс по работе с процессом игры в котором бы инкапсулировалась работа по записи адресов через SystemProcess.WriteMemoryData(....) Да, и лучше чуть-чуть переписать SystemProcess сделав его не статичным классом, а с конструктором запоминания имени процесса. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения