gastraler Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Спасибо за уроки которые я уже видел!Но меня все таки мучает один опрос, ответа на который я ни где не нашел.Как подключиться к базовому адресу, на который указывает указатель?Есть вот такой Offset, игры Half-Life:Вопрос как подключиться к указателю hw.dll+7bbd9c или модулю hw.dll, например в моем трейнере: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;using System.Diagnostics;using System.Runtime.InteropServices;using System.Globalization;using System.Threading;namespace Half_Life_Opposing_Force{ public partial class Form1 : Form { #region Global variables Memory myMemory = new Memory(); Process[] myProcess; bool IsGameAvailable = false; bool UnlimitedAmmo = false; string AmmoPointer = "10343A08"; int[] AmmoOffset = { 0x578, 0xAC }; int ammoToFill = 50; #endregion public Form1() { InitializeComponent(); } private void UnlimAmmoBTN_Click(object sender, EventArgs e) { if (IsGameAvailable) { if (UnlimitedAmmo) { UnlimitedAmmo = false; UnlimAmmoBTN.Text = "OFF"; } else { UnlimitedAmmo = true; UnlimAmmoBTN.Text = "ON"; } } } private void GameAvailabilityTMR_Tick(object sender, EventArgs e) { myProcess = Process.GetProcessesByName("hl"); if (myProcess.Length != 0) { IsGameAvailable = true; statusLBL.Text = "Вы в игре"; } else { IsGameAvailable = false; statusLBL.Text = "Игра не запущенна"; } } private void UpdateCheatsTMR_Tick(object sender, EventArgs e) { if (IsGameAvailable) { #region Unlimited ammo if (UnlimitedAmmo) { myMemory.ReadProcess = myProcess[0]; myMemory.Open(); int pointerAddress = HexToDec(AmmoPointer); int[] pointerOffset = AmmoOffset; int bytesWriten; byte[] valueToWrite = BitConverter.GetBytes(ammoToFill); string writtenddress = myMemory.PointerWrite((IntPtr)pointerAddress, valueToWrite, pointerOffset, out bytesWriten); myMemory.CloseHandle(); } #endregion } } public static string HexToDec(int DEC) { return DEC.ToString("X"); } public static int HexToDec(string Hex) { return int.Parse(Hex, NumberStyles.HexNumber); } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Для получения базового адреса на C# можешь поискать код примеров в поисковике "C# GetModuleBaseName". Получишь базовый адрес, а далее прибавляешь к нему смещения какие нужные для чтения адреса и конечного значения. Если не найдёшь примеров, то поищи исходники трейнеров на C# или других языков .NET, и в них работу с GetModuleBaseName. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 7 мая, 2012 Автор Поделиться Опубликовано 7 мая, 2012 Сэнкс, искал, но все примерно пишут как и ты, буду искать дальше.На счет исходников идея, но пока ни одного не видел. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 ТУТ можешь прочитать мою статью о нахождении базового адреса модуля. Если ты неплохо программируешь, тебе не составит труда переписать представленный там код на C#. За одним исключением - в статье описано, как находить модуль по истинному имени, если имя файла модуля меняется, тебе же это не нужно, и кусок с вытаскиванием реального имени и его сравнения можешь пропустить. В остальном же - все будет актуально. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Ой, что-то я совсем не то посоветовал . "GetModuleBaseName не возвращает адрес модуля, а возвращает имя модуля по его уже известному описателю (хендлу).Один способ точно должен работать - перебирать все данные модулей для конкретного процесса. Как найдёшь нужный модуль, то извлекаешь информацию о его базовом адресе. Т.е. нужно найти этот способ перебора модулей на C# и посмотреть поле базового адреса. Вот и всё.Поскольку я посоветовал не то что нужно и наверно заставил искать в ненужном направлении, вот решение.Допустим имеем процесс с названием test.exe и модуль user32.dll. И нам нужно найти базовые адреса и того и того.using System;namespace ModuleBase{ class Program { static void Main(string[] args) { var processName = "test"; // не пишем расширение "*.exe" var someModuleName = "user32.dll"; var arrayProcesses = System.Diagnostics.Process.GetProcessesByName(processName); if (arrayProcesses == null || arrayProcesses.Length < 1){ Console.WriteLine("Process not found"); return; } var currentProcess = arrayProcesses[0]; Console.WriteLine("Address prosess: " + processName + ".exe" + " = " + "0x" + currentProcess.MainModule.BaseAddress.ToString("X")); var modules = currentProcess.Modules; var max = modules.Count; for (int i = 0; i < max; i++) if ( String.Compare(modules[i].ModuleName, someModuleName, false) == 1){ Console.WriteLine("Address module: " + modules[i].ModuleName + " = " + "0x" + modules[i].BaseAddress.ToString("X")); break; } Console.Read(); } }}Вывод будет:Address prosess: test.exe = 0x400000Address module: USER32.dll = 0x77270000Желаю успехов! Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 7 мая, 2012 Автор Поделиться Опубликовано 7 мая, 2012 Оо класс, спасибо , а то я как то приуныл глядючи на Дельфи.только DLL пока не тот Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Если я правильно понял требуется найти базовый адрес hw.dll, тогда достаточно:var someModuleName = "hw.dll";>> может так?Можно и так. Ошибки не должно быть при выводе имени. Нам важно задать имя модуля в someModuleName.Я думаю дальше не будет сложностей с чтением адреса по цепочке указателей начиная от базового адреса модуля или начиная от базового адреса процесса. Надо просто прибавлять смещения к базовому адресу и читать адреса. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 7 мая, 2012 Автор Поделиться Опубликовано 7 мая, 2012 эта строкаif (String.Compare(modules[i].ModuleName, someModuleName, false) == 1)по моему указывает на ntdll.dllесли же ввести например:var someModuleName = "ntdll.dll";то получаю:то есть опять смещениеВот она :if (modules[i].ModuleName.Contains(someModuleName)) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Ой, моя ошибка.Надо использовать:String.Compare(modules[i].ModuleName, someModuleName, true) == 0Эта строка возвращает истину, если строки равны без учёта регистра.А этот код возвращает немного другоеmodules[i].ModuleName.Contains(someModuleName)Он возвращает истину, если имя модуля содержит указанную подстроку someModuleName. И в роде с учётом регистра. Во всяком случае с учётом регистра или без решать не мне. Но, я обычно не учитываю регистр. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 7 мая, 2012 Автор Поделиться Опубликовано 7 мая, 2012 Да уж, и все таки как все это приляпать к трейнеру? Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 7 мая, 2012 Поделиться Опубликовано 7 мая, 2012 Да уж, и все таки как все это приляпать к трейнеру?также, руками Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 8 мая, 2012 Поделиться Опубликовано 8 мая, 2012 Я немного прошлый код переписалusing System;using System.Diagnostics;namespace ModuleBase{ class Program { const string processName = "tutorial-i386"; // не пишем расширение "*.exe" const string someModuleName = "ole32.dll"; static uint GetProcessBaseAddress(Process currentProcess) { return (uint)currentProcess.MainModule.BaseAddress; } static string GetProcessStringBaseAddress(Process currentProcess) { return "0x" + currentProcess.MainModule.BaseAddress.ToString("X"); } static uint GetModuleBaseAddress(Process currentProcess, string moduleName, bool ignoredCase) { var modules = currentProcess.Modules; var max = modules.Count; for (int i = 0; i < max; i++) if (String.Compare(modules[i].ModuleName, moduleName, ignoredCase) == 0) return (uint)modules[i].BaseAddress; return 0; } static string GetModuleStringBaseAddress(Process currentProcess, string moduleName, bool ignoredCase) { var modules = currentProcess.Modules; var max = modules.Count; for (int i = 0; i < max; i++) if (String.Compare(modules[i].ModuleName, moduleName, ignoredCase) == 0) return "0x" + modules[i].BaseAddress.ToString("X"); return ""; } static void Main(string[] args) { var arrayProcesses = Process.GetProcessesByName(processName); if (arrayProcesses == null || arrayProcesses.Length < 1) { Console.WriteLine("Process not found"); return; } var currentProcess = arrayProcesses[0]; // Получить строку базового адреса процесса var str1 = GetProcessStringBaseAddress(currentProcess); var line1 = String.Format("Address prosess: {0}.exe = {1}", processName, str1); Console.WriteLine(line1); // Получить строку базового адреса некотрого модуля someModuleName var str2 = GetModuleStringBaseAddress(currentProcess, someModuleName, true); var line2 = String.Format("Address module: {0} = {1}", someModuleName, str2); Console.WriteLine(line2); Console.Read(); } }}>>Да уж, и все таки как все это приляпать к трейнеру?Если сложно встроить новый код, то могу посоветовать создать новый проект можно консольный или WinForms, или WPF в зависимости от опыта и от того что попроще. Для экспериментов по чтению и записи для адресов с цепочками указателей проще работать с консольным проектом.Так вот создаёшь пустой проект. Вставляешь в него мой код. Проверяешь со своими значениями. Если всё работает, то теперь думаешь как написать код по чтению и записи значений.На нашем форуме должны быть примеры кода чтения адресов по пути указателя. Тебе нужно поискать этот самый код. Копировать и вставить в проект. Далее его нужно изменить с учётом базового адреса модуля. т.е. к базовому адресу будешь прибавлять смещения и читать адреса. Получишь конечный адрес. В этот адрес осуществишь запись. Проверяешь если всё работает, то начинается следующий этап.Открываешь предыдущий свой проект и колдуешь в функции UpdateCheatsTMR_Tick(). Именно в ней может быть проверка существования адреса по указателю и запись по нему, если этот адрес существует. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 8 мая, 2012 Автор Поделиться Опубликовано 8 мая, 2012 А если в трейнере есть вот такой класс:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices; //USED TO CALL THE DLL IMPORTSusing System.Globalization;using System.Diagnostics;using System.Windows.Forms; //DELETE MEnamespace Half_Life_Opposing_Force{ //Class wasnt done by me //FULL CREDITS TO //http://forum.cheatengine.org/viewtopic.php?t=530207 public class Memory { private Process m_ReadProcess = null; private IntPtr m_hProcess = IntPtr.Zero; public static int DllImageAddress(string Pname, string ModuleName) { System.Diagnostics.Process[] MyProcess = System.Diagnostics.Process.GetProcessesByName(Pname); System.Diagnostics.ProcessModuleCollection myProcessModuleCollection = MyProcess[0].Modules; for (int i = 0; i < myProcessModuleCollection.Count; i++) { if (myProcessModuleCollection[i].ModuleName.ToLower().StartsWith(ModuleName.ToLower())) { return (int)myProcessModuleCollection[i].BaseAddress; } } return -1; } public Process ReadProcess { get { return m_ReadProcess; } set { m_ReadProcess = value; } } public void Open() { ProcessAccessType access = ProcessAccessType.PROCESS_VM_READ | ProcessAccessType.PROCESS_VM_WRITE | ProcessAccessType.PROCESS_VM_OPERATION; m_hProcess = OpenProcess((uint)access, 1, (uint)m_ReadProcess.Id); } public void CloseHandle() { int iRetValue; iRetValue = CloseHandle(m_hProcess); if (iRetValue == 0) { throw new Exception("CloseHandle Failed"); } } public byte[] Read(IntPtr MemoryAddress, uint bytesToRead, out int bytesRead) { byte[] buffer = new byte[bytesToRead]; IntPtr ptrBytesRead; ReadProcessMemory(m_hProcess, MemoryAddress, buffer, bytesToRead, out ptrBytesRead); bytesRead = ptrBytesRead.ToInt32(); return buffer; } public byte[] PointerRead(IntPtr MemoryAddress, uint bytesToRead, int[] Offset, out int bytesRead) { int iPointerCount = Offset.Length - 1; IntPtr ptrBytesRead; bytesRead = 0; byte[] buffer = new byte[4]; //DWORD to hold an Address int tempAddress = 0; if (iPointerCount == 0) { ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead); tempAddress = ToDec(Make(buffer)) + Offset[0]; //Final Address buffer = new byte[bytesToRead]; ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead); bytesRead = ptrBytesRead.ToInt32(); //MessageBox.Show(bytesRead.ToString()); return buffer; } for (int i = 0; i <= iPointerCount; i++) { if (i == iPointerCount) { ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead); tempAddress = ToDec(Make(buffer)) + Offset[i]; //Final Address buffer = new byte[bytesToRead]; ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead); bytesRead = ptrBytesRead.ToInt32(); return buffer; } else if (i == 0) { ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead); tempAddress = ToDec(Make(buffer)) + Offset[1]; } else { ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead); tempAddress = ToDec(Make(buffer)) + Offset[i]; } } return buffer; } public void Write(IntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten) { IntPtr ptrBytesWritten; WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten); bytesWritten = ptrBytesWritten.ToInt32(); } public string PointerWrite(IntPtr MemoryAddress, byte[] bytesToWrite, int[] Offset, out int bytesWritten) { int iPointerCount = Offset.Length - 1; IntPtr ptrBytesWritten; bytesWritten = 0; byte[] buffer = new byte[4]; //DWORD to hold an Address int tempAddress = 0; if (iPointerCount == 0) { ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten); tempAddress = ToDec(Make(buffer)) + Offset[0]; //Final Address WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten); bytesWritten = ptrBytesWritten.ToInt32(); return ToHex(tempAddress); } //only necessary for multiple OFFSETS for (int i = 0; i <= iPointerCount; i++) { if (i == iPointerCount) { ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten); tempAddress = ToDec(Make(buffer)) + Offset[i]; //Final Address WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten); bytesWritten = ptrBytesWritten.ToInt32(); return ToHex(tempAddress); } else if (i == 0) { ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten); tempAddress = ToDec(Make(buffer)) + Offset[i]; } else { ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten); tempAddress = ToDec(Make(buffer)) + Offset[i]; } } return ToHex(tempAddress); } public int PID() { return m_ReadProcess.Id; } public string BaseAddressH() { return ToHex(m_ReadProcess.MainModule.BaseAddress.ToInt32()); } public int BaseAddressD() { return m_ReadProcess.MainModule.BaseAddress.ToInt32(); } [Flags] public enum ProcessAccessType { PROCESS_TERMINATE = (0x0001), PROCESS_CREATE_THREAD = (0x0002), PROCESS_SET_SESSIONID = (0x0004), PROCESS_VM_OPERATION = (0x0008), PROCESS_VM_READ = (0x0010), PROCESS_VM_WRITE = (0x0020), PROCESS_DUP_HANDLE = (0x0040), PROCESS_CREATE_PROCESS = (0x0080), PROCESS_SET_QUOTA = (0x0100), PROCESS_SET_INFORMATION = (0x0200), PROCESS_QUERY_INFORMATION = (0x0400) } public static string Make(byte[] buffer) { string sTemp = ""; for (int i = 0; i < buffer.Length; i++) { if (Convert.ToInt16(buffer[i]) < 10) { sTemp = "0" + ToHex(buffer[i]) + sTemp; } else { sTemp = ToHex(buffer[i]) + sTemp; } } return sTemp; } public static string ToHex(int Decimal) { return Decimal.ToString("X"); //Convert Decimal to Hexadecimal } public static int ToDec(string Hex) { return int.Parse(Hex, NumberStyles.HexNumber); //Convert Hexadecimal to Decimal } [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId); [DllImport("kernel32.dll")] public static extern Int32 CloseHandle(IntPtr hObject); [DllImport("kernel32.dll")] public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead); [DllImport("kernel32.dll")] public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten); }}Это можно как то использовать? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 8 мая, 2012 Поделиться Опубликовано 8 мая, 2012 Я думаю, что можно использовать. Работать можно с функциейPointerWrite(IntPtr MemoryAddress, byte[] bytesToWrite, int[] Offset, out int bytesWritten)Работать можно приблизительно так:Memory memory = new Memory(); // обычное действие при работе с классамиmemory.ReadProcess = ; // присвой процесс (ты уже знаешь как его найти)memory.Open(); // открыть процессIntPtr MemoryAddress = ; // вводишь базовый адрес модуляbyte[] bytesToWrite = new byte[]{0xff,0xff,0xff,0xff}; // записываемые байты можешь забить вручную или через конвертер из десятичного в шестнадцатеричную формуint[] Offset = new int[]{0xff,0xff,0xff,0xff}; // вводишь нужные оффсеты со своего скирншотаint bytesWritten = 0; // просто инициализацияmemory.PointerWrite(MemoryAddress, bytesToWrite, Offset, out bytesWritten);if(bytesRead.Length < 1){ // было ли что-то записано?//выдать ошибку в консоли}else {// выдать сообщение в косоли о том что успешно}Можешь провести различные эксперименты долго и упорно, и тогда обязательно что-нибудь получится. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 10 мая, 2012 Автор Поделиться Опубликовано 10 мая, 2012 Сегодня опять дома и продолжаю мучить свой трейнер.class Program { static void Main(string[] args) { Memory memory = new Memory(); // обычное действие при работе с классами Process[] myProcess; // myProcess = Process.GetProcessesByName("hl"); // memory.ReadProcess = myProcess[0]; // присвой процесс (ты уже знаешь как его найти) memory.Open(); // открыть процесс ProcessModule myProcessModule = null; // IntPtr MemoryAddress = IntPtr.Zero; // вводишь базовый адрес модуля if (myProcess.Length > 0) // { ProcessModuleCollection myProcessModuleCollection; try { myProcessModuleCollection = myProcess[0].Modules; } catch { return; } for (int i = 0; i < myProcessModuleCollection.Count; i++) { myProcessModule = myProcessModuleCollection[i]; if (myProcessModule.ModuleName.Contains("hw.dll")) { MemoryAddress = (myProcessModule.BaseAddress + 0x7BBD9C); break; } } } //byte[] bytesToWrite = new byte[]{0xff,0xff,0xff,0xff}; // записываемые байты можешь забить вручную или через конвертер из десятичного в шестнадцатеричную форму int[] Offset = new int[]{0x7C,0x578,0xAC}; // вводишь нужные оффсеты со своего скирншота int bytesWritten = 0; // просто инициализация int ammoToFill = 50; //Полный магазин byte[] bytesToWrite = BitConverter.GetBytes(ammoToFill); //Перезаписать значение memory.PointerWrite(MemoryAddress, bytesToWrite, Offset, out bytesWritten); } }Из консоли все работает, и даже патроны добавляет. Спасибо за науку работы с консолью!!!Как же привязаться к форме? Что то я опять туплю. Может кто подскажет !Люди!!! Дайте кто нибудь исходник, с указателем на модуль. Пожалуйста!!!Может грубо но приляпал Андрюхе огромное спасибо!!!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;using System.Diagnostics;using System.Runtime.InteropServices;using System.Globalization;using System.Threading;namespace Half_Life_Opposing_Force{ public partial class Form1 : Form { #region Global variables Memory myMemory = new Memory(); Process[] myProcess; bool IsGameAvailable = false; bool UnlimitedAmmo = false; //string AmmoPointer = ""; int[] AmmoOffset = { 0x7C, 0x578, 0xAC }; int ammoToFill = 50; #endregion public Form1() { InitializeComponent(); } private void UnlimAmmoBTN_Click(object sender, EventArgs e) { if (IsGameAvailable) { if (UnlimitedAmmo) { UnlimitedAmmo = false; UnlimAmmoBTN.Text = "OFF"; } else { UnlimitedAmmo = true; UnlimAmmoBTN.Text = "ON"; } } } private void GameAvailabilityTMR_Tick(object sender, EventArgs e) { myProcess = Process.GetProcessesByName("hl"); if (myProcess.Length != 0) { IsGameAvailable = true; statusLBL.Text = "Вы в игре"; } else { IsGameAvailable = false; statusLBL.Text = "Игра не запущенна"; } } private void UpdateCheatsTMR_Tick(object sender, EventArgs e) { if (IsGameAvailable) { #region Unlimited ammo if (UnlimitedAmmo) { myMemory.ReadProcess = myProcess[0]; myMemory.Open(); ProcessModule myProcessModule = null; // IntPtr MemoryAddress = IntPtr.Zero; // вводишь базовый адрес модуля if (myProcess.Length > 0) // { ProcessModuleCollection myProcessModuleCollection; try { myProcessModuleCollection = myProcess[0].Modules; } catch { return; } for (int i = 0; i < myProcessModuleCollection.Count; i++) { myProcessModule = myProcessModuleCollection[i]; if (myProcessModule.ModuleName.Contains("hw.dll")) { MemoryAddress = (myProcessModule.BaseAddress + 0x7BBD9C); break; } } } //int pointerAddress = HexToDec(AmmoPointer); int[] pointerOffset = AmmoOffset; int bytesWriten; byte[] valueToWrite = BitConverter.GetBytes(ammoToFill); string writtenddress = myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten); myMemory.CloseHandle(); } #endregion } } //public static string HexToDec(int DEC) //{ // return DEC.ToString("X"); //} //public static int HexToDec(string Hex) //{ // return int.Parse(Hex, NumberStyles.HexNumber); //} } }Трейнер делался на основе этих уроков:http://www.punkarcade.net/videos/video/0osZuafJuB0/How-to-Make-a-TRAINER-C-TUTORIAL-1-6-HD.html Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 18 мая, 2012 Автор Поделиться Опубликовано 18 мая, 2012 Такой вот еще вопрос!Если значение floatкак все это:string writtenddress = myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten);преобразовать во float ???Адрес менял на float, значение тоже менял и все равно не записывается ((( Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 19 мая, 2012 Поделиться Опубликовано 19 мая, 2012 Такой вот еще вопрос!Если значение floatкак все это:string writtenddress = myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten);преобразовать во float ???Адрес менял на float, значение тоже менял и все равно не записывается (((Тебе поможет [вот эта] штука. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 19 мая, 2012 Поделиться Опубликовано 19 мая, 2012 gastraler byte[] valueToWrite = BitConverter.GetBytes((float)ammoToFill);string writtenAddress = myMemory.PointerWrite((IntPtr)pointerAdress, valueToWrite, pointerOffset, out bytesWritten); Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 19 мая, 2012 Автор Поделиться Опубликовано 19 мая, 2012 ZOCKIRНе работает, я с этого и начал. По идее если меняется один параметр, то меняется все.Может и меняется, но результат не записывается. Как отследить, пока не понял в чем проблема. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 20 мая, 2012 Автор Поделиться Опубликовано 20 мая, 2012 Тебе поможет [вот эта] штука. Что то вроде этого? :BitConverter.ToSingle(myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten), 0); Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 20 мая, 2012 Поделиться Опубликовано 20 мая, 2012 Что то вроде этого? :BitConverter.ToSingle(myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten), 0);Допустим, у тебя есть 4-байтный буфер, куда ты читаешь значение того или ного адреса:var buf = new byte[] { 0, 0, 0, 0 };Ты делаешь ReadProcessMemory, скармливая ему этот буфер:ReadProcessMemory(address, size, out buf);После этого в массиве buf у тебя лежат прочитанные данные:buf = { 0xAA, 0xBB, 0xCC, 0xDD };Допустим, если это float:var floatResult = BitConverter.ToSingle(buf, 0); (0 - индекс элемента массива, с которого надо начинать конвертацию)Не знаю, как именно у тебя устроена функция чтения из памяти, но в этом случае удобно будет возвращать этот самый buf, чтобы затем его конвертировать в нужный тип данных. Обратный процесс, если я правильно помню:BitConverter.GetBytes(floatResult.ToString());В общем, пробуй и смотри результат через отладчик - там всё наглядно. PS: Если ты хочешь записать float-значение в память, его нужно этим же конвертером переделать в цепочку байт, которую уже в память и писать. Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 22 мая, 2012 Автор Поделиться Опубликовано 22 мая, 2012 Не в преобразовании было дело, что то не с классом.С DLL тогоже автора все получилось.MemoryEditor.dll ==> http://forum.cheaten...5185623#5185623Консольная версия, подставь свои значения using System;using System.Collections.Generic;using System.Linq;using System.Text;using MemoryEditor;using System.Diagnostics;using System.Runtime.InteropServices;using System.Globalization;using System.Threading;namespace MemoryEditTest{ class Program { static void Main(string[] args) { Memory oMemory = new Memory(); Process[] myProcess = Process.GetProcessesByName("hl"); ProcessModule myProcessModule = null; IntPtr MemoryAddress = IntPtr.Zero; if (myProcess.Length > 0) { ProcessModuleCollection myProcessModuleCollection; try { myProcessModuleCollection = myProcess[0].Modules; } catch { return; } for (int i = 0; i < myProcessModuleCollection.Count; i++) { myProcessModule = myProcessModuleCollection[i]; if (myProcessModuleCollection[i].ModuleName == "hw.dll") break; } MemoryAddress = (myProcessModule.BaseAddress + 0x7bbd9c); int address = (int)MemoryAddress; if (oMemory.OpenProcess("hl")) { oMemory.Write(address, new int[] { 0x7c + 0x4 + 0x160 }, (float)50); } } } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
gastraler Опубликовано 23 мая, 2012 Автор Поделиться Опубликовано 23 мая, 2012 На самом деле класс в порядке,просто я в последний раз случайно вместо offset = { 0x7c, 0x4, 0x160 } записал offset = { 0x7c + 0x4 + 0x160 } :-D :-D и float с плюсами вписался без вопросов :-P Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Sten97 Опубликовано 15 сентября, 2012 Поделиться Опубликовано 15 сентября, 2012 В 4-ом фреймворке все это работает, но вот на 3.5, 3.0 и 2.0 компилятор ругается на это(myProcessModule.BaseAddress + 0x7bbd9пишет что не возможно складывать IntPtr ....Подскажите как еще можно это сделать ? А то на 4-ом фреймворке не очень хочется делать трейнеры (не у всех он есть) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 15 сентября, 2012 Поделиться Опубликовано 15 сентября, 2012 А приведение типов религия не позволяет использовать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения