Hi,
ich hab folgendes Problem:
Ich hab mit CE (6.2) einen statischen Pointer ermittelt mit dem ich dann zur gewünschten speicher Adresse komme.
Leider bekomme ich beim dem hinzufügen der Offsets immer nur eine null als wert raus.
[Only registered and activated users can see links. Click Here To Register...]
(toll img tag geht nicht)
[Only registered and activated users can see links. Click Here To Register...]
Die endgültige Adresse müsste doch wie folgt sein:
[[[[[[[BaseAddress+0x0003CDD0]+0x38]+0x8]+0x18]+0x18]+0x8]+0x98] = Value 96
Im Code hab ich es wie folgt versucht:
Memory Class:
Zum auslesen benutze ich jetzt das Form_Load Event mit zwei verschiedenen ansätzen:
Bei beiden kommt 0 raus..
Hat einer ne Idee was ich falsch mache ?
ich hab folgendes Problem:
Ich hab mit CE (6.2) einen statischen Pointer ermittelt mit dem ich dann zur gewünschten speicher Adresse komme.
Leider bekomme ich beim dem hinzufügen der Offsets immer nur eine null als wert raus.
[Only registered and activated users can see links. Click Here To Register...]
(toll img tag geht nicht)
[Only registered and activated users can see links. Click Here To Register...]
Die endgültige Adresse müsste doch wie folgt sein:
[[[[[[[BaseAddress+0x0003CDD0]+0x38]+0x8]+0x18]+0x18]+0x8]+0x98] = Value 96
Im Code hab ich es wie folgt versucht:
Memory Class:
Code:
class NFXMemory
{
[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)
}
[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,IntPtr lpNumberOfBytesRead);
[DllImport("kernel32.dll")]
public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size,IntPtr lpNumberOfBytesWritten);
private Process _process = null;
private IntPtr _handleProcess = IntPtr.Zero;
public IntPtr _baseAdress = IntPtr.Zero;
private string _application;
private int _processID;
private ProcessAccessType _accessFlags = ProcessAccessType.PROCESS_VM_READ | ProcessAccessType.PROCESS_VM_WRITE | ProcessAccessType.PROCESS_VM_OPERATION;
public NFXMemory(string Application)
{
_application = Application;
OpenProcess();
}
public void OpenProcess()
{
if (Process.GetProcessesByName(_application).Length > 0)
{
_process = Process.GetProcessesByName(_application)[0];
_baseAdress = _process.MainModule.BaseAddress;
_processID = _process.Id;
_handleProcess = OpenProcess((uint)_accessFlags, 1, (uint)_processID);
}
}
public IntPtr GetPointer(int[] Offsets)
{
byte[] buffer = new byte[4];
IntPtr _address = _baseAdress;
ReadProcessMemory(_handleProcess, _address, buffer, (uint)4, IntPtr.Zero);
_address = new IntPtr(BitConverter.ToInt32(buffer,0));
for (int i = 0; i < Offsets.Length; i++)
{
ReadProcessMemory(_handleProcess, _address, buffer, (uint)4, IntPtr.Zero);
_address = new IntPtr(BitConverter.ToInt32(buffer, 0));
}
return _address;
}
public int getInt(IntPtr address)
{
byte[] buffer = new byte[4];
ReadProcessMemory(_handleProcess, address, buffer, (uint)4, IntPtr.Zero);
return BitConverter.ToInt32(buffer, 0);
}
}
Zum auslesen benutze ich jetzt das Form_Load Event mit zwei verschiedenen ansätzen:
Code:
private void Form1_Load(object sender, EventArgs e)
{
// 1
NFXMemory memReader = new NFXMemory("Client");
IntPtr ammoPtr = memReader.GetPointer(new int[] { 0x0003CDD0, 0x38, 0x8, 0x18, 0x8, 0x98});
int ammoValue = memReader.getInt(ammoPtr);
Console.WriteLine(ammoValue);
//2
IntPtr ammoAddr = memReader._baseAdress;
ammoAddr = IntPtr.Add(ammoAddr, 0x0003CDD0);
ammoAddr = IntPtr.Add(ammoAddr, 0x38);
ammoAddr = IntPtr.Add(ammoAddr, 0x8);
ammoAddr = IntPtr.Add(ammoAddr, 0x18);
ammoAddr = IntPtr.Add(ammoAddr, 0x8);
ammoAddr = IntPtr.Add(ammoAddr, 0x98);
int am = memReader.getInt(ammoAddr);
Console.WriteLine(am);
}
Hat einer ne Idee was ich falsch mache ?