Перейти к содержанию

Создаем Трейнер на C#


Рекомендуемые сообщения

Всем привет, решил делать трейнер на языке 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

Ссылка на комментарий
Поделиться на другие сайты

Класс VAMemory должен иметь методы чтения не только ReadByte, но и других. Соответственно Byte заменить на нужный тип.

По аналогии Byte.Parse, так нужно заменить на нужный тип. Да и почти все ответы можно найти в MSDN.

Ссылка на комментарий
Поделиться на другие сайты

Тип 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()));

Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

В группу добавлен.

При публикация нужно писать версию игры.

На счёт трейнера.

Я рекомендую использовать MasterGHLuaTrainerSource_V1.lua и использовать Cheat Engine6.2 в качестве исполняемой программы для скриптов .CETRAINER.

Ссылка на комментарий
Поделиться на другие сайты

Адреса лучше вынести в const, VAM - тоже, инициализируя его в конструкторе (зачем каждый раз новый объект создавать?), а то не очень удобно стороннему разработчику будет в коде разбираться. А так - неплохо. :)

PS: Обработчик исключений тоже не помешал бы.

Ссылка на комментарий
Поделиться на другие сайты

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);
}
}

}

На ошибки я не проверял...

Ссылка на комментарий
Поделиться на другие сайты

Делать трейнер на VS C# это круто, скачал трейнер от BZK_GH прям неплохо, но у меня не работает версия совпадает игра NfSU2

Такая ошибка

post-1568-1319461295,15_thumb.jpg

Решил так скачал VAMemory.dll трейнер работает тока в присутствии файл VAMemory.dll. Получается файл должен быть вместе с трейнером?

Ссылка на комментарий
Поделиться на другие сайты

VAMemory.dll как один из вариантов должна быть рядом. Второй вариант включить в ресурсы и извлекать из них. Третий вариант, написать свою обвёртку по работе Api Windows. Есть и другие.

Делать трейнеры на C# как и на любом другом языке программирования круто до поры до времени. Потом можно понять, что придётся прикручивать что-то типа автоассемблера из Cheat Engine, потом в конце поймёшь зачем прикручивать, когда можно пользоваться CE и когда последний периодически обновляется с новыми идеями и возможностями.

Ссылка на комментарий
Поделиться на другие сайты

Что можете сказать об этом коде. Я так понял что тут ни какой 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/");
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Как раз здесь не нужен этот модуль . И здесь код хаотичный, т.к. аналогично - без инкапсуляции данных. Без инкапсуляции приходится читать код в 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], reg2

mov reg1, [reg2]

mov reg1,reg2

И если по адресу1, есть какой-то известный шаблон из трёх выше, то можно сделать генерацию АА-скрипта по шаблону и правилу. Например, правило "постоянное значение". В результате сгенерировать АА-скрипт с постоянным значением...

Большинство трейнеров на языках программирования под Windows не обладают той потенциальной мощью, которую предоставляет Cheat Engine + Lua. Если эта мощь не нужна и хочется делать трйенеры для каждой версии игры, где каждый трейнеры весит от 16 кб (хороший трейнер на С++ или Дельфи без VCL или на MASM) до размера трейнера в 3 Мб сгенерированного на CE, то конечно это предпочтение каждого.

Ссылка на комментарий
Поделиться на другие сайты

Если эта мощь не нужна и хочется делать трйенеры для каждой версии игры, где каждый трейнеры весит от 16 кб

Код для поиска по сигнатуре в том же ассемблере занимает строчек пять. Или я что-то не так понял? О_о

Ссылка на комментарий
Поделиться на другие сайты

keng, я думаю что не пять, а более.

В моих целях применять ассемблер и диззассемблер во время работы трейнера используя CE Lua-engine - скрипты для создания автоматически формируемых инъекции по неизвестным дизассемблерными инструкциям по адресам внедрения нового кода с условиями в виде правил. Возможно твои цели менее глобальны и сканер на MASM-е тебя вполне устроит.

Например, я желаю, чтобы программа нашла адрес сигнатуры кода и независимо от того какой именной машинный код там будет произойдёт внедрение постоянного условия - чтобы значение на текущей инструкции соответствовало правилу "Постоянное значение 500". Т.е. если у нас там будет mov eax, ebx, то сформируется АА-скрипт по записи в ebx числа 555, записи в eax значения из ebx и прыжок обратно в игровую рутину.

Суть в том, что нужен не только сканер сигнатур, а дизассемблер и ассемблер и всё это во время уже запущенного трейнера. Пока я эту фишку с автоматически формируемыми инъекциями на CE Lua-Engine не реализовал. Зато сделал на Дельфи (где-то больше года назад что ли) для самых распространённых инструкций: mov, add, sub.... Исходники лежат в закрытом подфоруме, но видны Разработчикам..

Ссылка на комментарий
Поделиться на другие сайты

В коде BZK_GH как поменять баттон на горячие клавиши типа нампад1 и далее, какая функция реагирует и записывать значение на адрес, примеры есть где на си шарп?

Ссылка на комментарий
Поделиться на другие сайты

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;
//...

Ссылка на комментарий
Поделиться на другие сайты

Простой пример трейнера из сети на 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);

}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Простой пример трейнера из сети на 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);

}
}
}

А что за ошибку выдаёт?

Ссылка на комментарий
Поделиться на другие сайты

Попробуй так:

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);
}
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id

1F0FF 

(хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?

Ссылка на комментарий
Поделиться на другие сайты

MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id

1F0FF 

(хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?

Я мало что понял из твоего сообщения.

Ссылка на комментарий
Поделиться на другие сайты

Ладно, иногда я сам себя не пойму (Когда человек много знает, больше тупит начнет). Вот собираюсь писать статью на тему Создаем простой трейнер на VC#2010 .

Ссылка на комментарий
Поделиться на другие сайты

MasterGH респект тебе, работает. Вот такой вопрос встречаются вот это id

1F0FF 

(хендл или как там) часто в исходниках трейнера.Как ловить вот эту адрес в других играх?

Это один из аргументов WinAPI-функции OpenProcess. Конкретно, PROCESS_ALL_ACCESS, устанавливает то, с какими правами один процесс получает доступ к другому. Компьютер всё равно не понимает букв (для него существуют только биты - байты - два байта - четыре байта), но вот человеку проще запомнить слова, чем цифры. Можно было записать и как:

Openprocess(PROCESS_ALL_ACCESS, pHandle, pId)

но перед этим объявить константу вида PROCESS_ALL_ACCESS=0x1F0FF. Подробнее про функцию - вот тут.

Ссылка на комментарий
Поделиться на другие сайты

keng понял что к чему СПС.

В общем сделал трейнер на VC#

Вывод:

В Cheat Engine делать трейнер намного проще чем на VS.

MessageBox.Show("Это мое мнение"); :grin:

Код:


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
Ссылка на комментарий
Поделиться на другие сайты

ZOCKIR, ну ещё можно было бы доработать чтобы код смотрелся удобнее. Чтобы не приходилось часто в аргумент функции передавать имя процесса, а также чтобы не приходилось для каждого чексбокса писать обработчик. И лучше работать с массивом структур : "адрес, значение, размер в байтах "...

Также создать класс по работе с процессом игры в котором бы инкапсулировалась работа по записи адресов через SystemProcess.WriteMemoryData(....)

Да, и лучше чуть-чуть переписать SystemProcess сделав его не статичным классом, а с конструктором запоминания имени процесса.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.