gpt4 book ai didi

c# - 通过 C# 编辑内存地址

转载 作者:行者123 更新时间:2023-11-30 12:11:03 25 4
gpt4 key购买 nike

我想编辑一个事件的应用程序(编辑内存地址),

地址 00498D45 我想编辑它的值

当前值:

MOV BYTE PTR SS:[EBP-423],7

更新值:

 MOV BYTE PTR SS:[EBP-423],8

到目前为止我得到的是这个(在网上搜索它以及我得到了多少):

提前致谢!

using System.Runtime.InteropServices;

[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
}

[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hProcess);

Process process = Process.GetProcessesByName("My Apps Name").FirstOrDefault();

public static bool WriteMemory(Process process, int address, long value, out int bytesWritten)
{
IntPtr hProc = OpenProcess(ProcessAccessFlags.All, false, process.Id);

byte[] val = BitConverter.GetBytes(value);

bool worked = WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32) val.LongLength, out bytesWritten);

CloseHandle(hProc);

return worked;
}

最佳答案

来自您的 other question :

WriteMemory(Process process,00498D45 , MOV BYTE PTR SS:[EBP-423],8)

这个有很多问题,我不知道从哪里开始。首先,这远不是正确的 C# 语法。

  1. 你正在调用一个函数,但是你有 Process那里好像有一个签名。
  2. 00498D45在任何基数中都不是有效常数。如果你的意思是十六进制,(你可能会这样做,因为你正在处理地址)那么就像所有其他类似 C 的语言一样,它应该表示为 0x00498D45 .
  3. 那是 ASCII 格式的 x86 汇编代码(但它不是字符串,你只是一团糟)。您不能只是将 ASCII 汇编代码放入另一个进程的地址空间!

也许您应该多研究一下构建程序时编译和汇编的工作原理,以及您的 CPU 在执行程序时实际做什么。另外,我建议通读您显然从某处获取的示例代码,并尝试理解它。了解正在发生的事情比要求每个人帮助修复你拼凑的东西要好得多。 </rant>

无论如何,在你组装你的代码之后,它看起来像这样(重新反汇编):

C68559FEFFFF08    mov byte [ebp-0x1a7],0x8

这意味着你的指令实际上是字节串C6 85 59 FE FF FF 08 .这就是您需要写入目标应用程序的内容。

这是您要执行的操作的基础:

byte[] new_instr = new byte[] {0xC6, 0x85, 0x59, 0xFE, 0xFF, 0xFF, 0x08};
IntPtr target_addr = (IntPtr)0x00498D45;

int bytesWritten;
WriteProcessMemory(hProcess, target_addr, new_instr, (UInt32)new_instr.Length, out bytesWritten);

WriteMemory您复制粘贴的内存功能不会在这里帮助您。问题是,它只写了一个 long这是4个字节。您需要写入 7 个字节。因此,您要么必须修改该函数以使用 byte[]参数,或者自己做。


我很佩服你的野心,但你真的应该开始低一点。编写一些 C# 代码,让自己熟悉使用类 C 语言进行编程。然后写一些 C 来熟悉当你做事不完美时的崩溃。然后尝试涉足汇编——也许将小的内联片段写入您的 C 代码中。最后,您将准备好破解其他正在运行的进程的指令。

关于c# - 通过 C# 编辑内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16308744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com