-1

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

在地址上00498D45我想编辑它的值

当前值:

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

更新值:

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

到目前为止我得到的是这个(在网上搜索了它,这是我走了多远):

提前致谢!

现在使用此代码:

它应该是什么样子?

WriteMemory(Process process,00498D45 , 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;
}
4

1 回答 1

3
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

这意味着您的指令实际上是 bytes 字符串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您复制和粘贴的记忆功能在这里对您没有帮助。问题是,它只写入long4 个字节的 a。您需要写入 7 个字节。因此,您要么必须修改该函数以使用byte[]参数,要么自己动手。

于 2013-05-01T06:42:27.007 回答