2013-04-30 71 views
4

我想修改有效应用程序(编辑的存储器地址),编辑存储器地址

上地址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; 
} 
+2

你的问题是什么? – Yahia 2013-04-30 20:50:59

+0

我怎么能做我想要的编辑,我的意思是ASM从更正值更新到更新值 - 我是ASM新手,所以我不知道如果我设置值等权利。 – Dan272 2013-04-30 20:51:44

+0

@Yahia他想要任意编辑进程内存中的一个字节。 – Patashu 2013-04-30 20:51:59

回答

3

从你other question

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

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

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

也许你应该多做一点研究,了解编译和编译程序时的汇编工作,以及你的CPU在执行程序时的实际内容。另外,我建议您通过示例代码阅读您非常明显从某处获取的代码,并尝试了解它。你会更好地了解正在发生的事情,而不是要求每个人帮助解决你们拼凑在一起的东西。 </rant>

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

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代码中写入小的内联块。最后,你会准备好绕开其他正在运行的进程的指令。

+0

写4个字节有什么问题?实际上只有1个字节会改变,对吧? – harold 2013-05-03 10:17:58

1

您可以使用注射库,如MemorySharp(我是作者)。所有这些函数都封装在一个方便的API中,集成了一个汇编器(FASM语法)。因此,这段代码执行你想要的东西:

using (var m = new MemorySharp(ApplicationFinder.FromProcessName("My App").First())) 
{ 
    m.Assembly.Inject("MOV BYTE [EBP-423],8", new IntPtr(0x00498D45)); 
}