Hallo zusammen,
ich muss an einer Stelle im Speicher eine Änderung vornehmen Leider ist de zu patchende Adresse nicht statisch,
somit muss ich mir eine Suchfunktion bauen, die mir die zu patchenden Byte's im Programmspeicher findet und die Adresse liefert.
Ich habe testweise mal versucht mit Hilfe einer for-Schleife und ReadProcessMemory den Speicher von 0x04100000...0x7FFFFFFF zu durchsuchen aber das hat extrem lange gedauert..
Nun habe ich folgenden Ansatz, leider liefert mir ManagedWinapi.ProcessMemoryChunk.read in das Array "bigMem" nur Null-bytes...
Kann das jemand nachvollziehen bzw. kennt eine bessere und schnelle Möglichkeit den Speicher ratzfatz zu scannen ?
(Das Programm ist in Modulen aufgebaut und eins davon schreibt die Bytes, die ich patchen muss..)
thanks in advice
tcM
- using System;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- using ManagedWinapi;
- using System.Collections.Generic;
- namespace Proggy
- {
- public struct MEMORY_BASIC_INFORMATION
- {
- public uint BaseAddress;
- public uint AllocationBase;
- public uint AllocationProtect;
- public uint RegionSize;
- public uint State;
- public uint Protect;
- public uint Type;
- }
- public partial class Form1 : Form
- {
- [DllImport("Kernel32.Dll")]
- public static extern uint VirtualQueryEx(IntPtr ProcessHandle, uint Address, ref MEMORY_BASIC_INFORMATION MemInfo, int MemInfoLength);
- [DllImport("Kernel32.Dll")]
- public static extern bool ReadProcessMemory(IntPtr ProcessHandle, uint Address, byte[] Buffer, uint Size, ref uint BytesRead);
- [DllImport("Kernel32.Dll")]
- public static extern bool WriteProcessMemory(IntPtr ProcessHandle, uint Address, byte[] Buffer, uint Size, ref uint BytesRead);
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- byte[] s = new byte[4];
- s[0]= 54; s[1]= 51; s[2]= 47 ; s[3]= 48;
- Process[] p = Process.GetProcessesByName("prog");
- MessageBox.Show(GetMemoryAddressOfString(s, p[0]).ToString());
- }
- private static int GetMemoryAddressOfString(byte[] searchedBytes, Process p)
- {
- int addr = 0;
- int speed = 1024 * 64;
- for (int j = 0x04100000; j < 0x7FFFFFFF; j += speed)
- {
- ManagedWinapi.ProcessMemoryChunk mem = new ProcessMemoryChunk(p, (IntPtr)j, speed + searchedBytes.Length);
- byte[] bigMem = mem.Read();
- for (int k = 0; k < bigMem.Length - searchedBytes.Length; k++)
- {
- bool found = true;
- for (int l = 0; l < searchedBytes.Length; l++)
- {
- if (bigMem[k + l] != searchedBytes[l])
- {
- found = false;
- break;
- }
- }
- if (found)
- {
- addr = k + j;
- MessageBox.Show("found");
- break;
- }
- }
- if (addr != 0)
- {
- break;
- }
- }
- return addr;
- }
- }
- }