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

Как Подключиться К Базовому Адресу


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

Спасибо за уроки которые я уже видел!

Но меня все таки мучает один опрос, ответа на который я ни где не нашел.

Как подключиться к базовому адресу, на который указывает указатель?

Есть вот такой Offset, игры Half-Life:

14908570873c9e341f65032e29c6bc50.jpg

Вопрос как подключиться к указателю 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);
}
}
}

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

Для получения базового адреса на C# можешь поискать код примеров в поисковике "C# GetModuleBaseName". Получишь базовый адрес, а далее прибавляешь к нему смещения какие нужные для чтения адреса и конечного значения. Если не найдёшь примеров, то поищи исходники трейнеров на C# или других языков .NET, и в них работу с GetModuleBaseName.

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

ТУТ можешь прочитать мою статью о нахождении базового адреса модуля. Если ты неплохо программируешь, тебе не составит труда переписать представленный там код на C#. За одним исключением - в статье описано, как находить модуль по истинному имени, если имя файла модуля меняется, тебе же это не нужно, и кусок с вытаскиванием реального имени и его сравнения можешь пропустить. В остальном же - все будет актуально.
Ссылка на комментарий
Поделиться на другие сайты

Ой, что-то я совсем не то посоветовал o_0. "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 = 0x400000

Address module: USER32.dll = 0x77270000

Желаю успехов!

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

Если я правильно понял требуется найти базовый адрес hw.dll, тогда достаточно:


var someModuleName = "hw.dll";

>> может так?

Можно и так. Ошибки не должно быть при выводе имени. Нам важно задать имя модуля в someModuleName.

Я думаю дальше не будет сложностей с чтением адреса по цепочке указателей начиная от базового адреса модуля или начиная от базового адреса процесса. Надо просто прибавлять смещения к базовому адресу и читать адреса.

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

эта строка

if (String.Compare(modules[i].ModuleName, someModuleName, false) == 1)

по моему указывает на ntdll.dll

если же ввести например:

var someModuleName = "ntdll.dll";

то получаю:

de57cd294e3e3d9ccd7ae8b2d0e70833.jpg

то есть опять смещение

Вот она :D :

if (modules[i].ModuleName.Contains(someModuleName))

3be833898ee65b4a3c4abc895b6480a0.jpg

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

Ой, моя ошибка.

Надо использовать:


String.Compare(modules[i].ModuleName, someModuleName, true) == 0

Эта строка возвращает истину, если строки равны без учёта регистра.

А этот код возвращает немного другое


modules[i].ModuleName.Contains(someModuleName)

Он возвращает истину, если имя модуля содержит указанную подстроку someModuleName. И в роде с учётом регистра. Во всяком случае с учётом регистра или без решать не мне. Но, я обычно не учитываю регистр.

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

Я немного прошлый код переписал


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(). Именно в ней может быть проверка существования адреса по указателю и запись по нему, если этот адрес существует.

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

А если в трейнере есть вот такой класс:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; //USED TO CALL THE DLL IMPORTS
using System.Globalization;
using System.Diagnostics;
using System.Windows.Forms; //DELETE ME
namespace 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);
}
}

Это можно как то использовать?

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

Я думаю, что можно использовать. Работать можно с функцией

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 {
// выдать сообщение в косоли о том что успешно
}

Можешь провести различные эксперименты долго и упорно, и тогда обязательно что-нибудь получится.

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

Сегодня опять дома и продолжаю мучить свой трейнер.

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

Из консоли все работает, и даже патроны добавляет. Спасибо за науку работы с консолью!!!

Как же привязаться к форме? Что то я опять туплю. Может кто подскажет !

Люди!!! Дайте кто нибудь исходник, с указателем на модуль. Пожалуйста!!!

Может грубо но приляпал :D

Андрюхе огромное спасибо!!!

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

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

  • 2 недели спустя...

Такой вот еще вопрос!

Если значение float

как все это:

string writtenddress = myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten);

преобразовать во float ???

Адрес менял на float, значение тоже менял и все равно не записывается (((

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

Такой вот еще вопрос!

Если значение float

как все это:

string writtenddress = myMemory.PointerWrite((IntPtr)MemoryAddress, valueToWrite, pointerOffset, out bytesWriten);

преобразовать во float ???

Адрес менял на float, значение тоже менял и все равно не записывается (((

Тебе поможет [вот эта] штука.

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

ZOCKIR

Не работает, я с этого и начал. По идее если меняется один параметр, то меняется все.

Может и меняется, но результат не записывается. Как отследить, пока не понял в чем проблема.

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

Что то вроде этого? :

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

В общем, пробуй и смотри результат через отладчик - там всё наглядно. :-D

PS: Если ты хочешь записать float-значение в память, его нужно этим же конвертером переделать в цепочку байт, которую уже в память и писать.

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

Не в преобразовании было дело, что то не с классом.

С DLL тогоже автора все получилось.

MemoryEditor.dll ==> http://forum.cheaten...5185623#5185623

Консольная версия, подставь свои значения :D

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

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

На самом деле класс в порядке,

просто я в последний раз случайно вместо offset = { 0x7c, 0x4, 0x160 } записал offset = { 0x7c + 0x4 + 0x160 }

:-D :-D :-D :-D :-D

и float с плюсами вписался без вопросов :-P :-P :-P

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

  • 3 месяца спустя...

В 4-ом фреймворке все это работает, но вот на 3.5, 3.0 и 2.0 компилятор ругается на это

(myProcessModule.BaseAddress + 0x7bbd9

пишет что не возможно складывать IntPtr ....

Подскажите как еще можно это сделать ? А то на 4-ом фреймворке не очень хочется делать трейнеры (не у всех он есть)

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

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

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

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