Как я могу написать на другой памяти процессов?
-
30-09-2019 - |
Вопрос
У меня есть адрес, который я хотел бы изменить. У меня есть процесс. У меня новая ценность. Ну что теперь?
// My Process
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
// Address
var addr = 0x00A66E11;
// Value
var val = 0x63;
Как я могу написать 0x63
(99) по этому адресу на другой памяти процессов?
Решение
@Harvey, от вашего ответа я выкопал и нашел много:
Открыть, закрыть и записать подписи:
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hProcess);
Флаги:
[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000
}
Сделайте мою жизнь более простым методом:
public static void WriteMem(Process p, int address, long v)
{
var hProc = OpenProcess(ProcessAccessFlags.All, false, (int)p.Id);
var val = new byte[] { (byte)v };
int wtf = 0;
WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32)val.LongLength, out wtf);
CloseHandle(hProc);
}
Написание в другой память процесса:
static void Main(string[] args)
{
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
WriteMem(p, 0x00A66DB9, 99);
}
Другие советы
Проверить ПишеткаProcessMemory. в pinvoke.net.net.
Вот еще один подобный сообщение на стойке, но они говорят о C ++. Вы можете сделать то же самое, используя Pinvoke.
Несмотря на P / вызывать родные функции, такие как WriteProcessMemory
Работает отлично, библиотеки, посвященные редактированию памяти, существуют и позволяют вам более простым образом выполнять эту задачу.
Используя библиотеку MEADYSHARP., Это может быть обобщено как:
using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault()))
{
sharp[0x00A66E11, false].Write(0x63);
}
Предыдущий код предполагает адрес, где записано значение, не перестраивается.
Вы можете использовать ПишеткаProcessMemory., Но имейте в виду, что вам нужно включить привилегии отладки, и что она не будет работать с большим количеством защищенных процессов в Vista, а затем.
И что вы, вероятно, будете снимать себя в ногу и перехватывать вещи несколько раз. Я предлагаю вам не иметь никаких важных программ, работающих, когда вы делаете это.
Удачи, тебе понадобится. :)