通过C#编辑内存地址,如何设置语句?
我想编辑活动应用程序(编辑内存地址) 在地址通过C#编辑内存地址,如何设置语句?,c#,inline-assembly,C#,Inline Assembly,我想编辑活动应用程序(编辑内存地址) 在地址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) 但是我不能以这种方式编译/调试
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;
}
这个问题太多了,我不知道从哪里开始。首先,这远远不是正确的C#语法
进程
,就像它是一个签名一样00498D45
不是任何基数中的有效常量。如果您指的是十六进制(这可能是因为您正在处理地址),那么与所有其他类似C的语言一样,应该表示为0x00498D45
C6 85 59 FE 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
记忆功能在这里对您没有帮助。问题是,它只写一个长的,即4个字节。你需要写7个字节。因此,您要么修改该函数以使用byte[]
参数,要么自己动手。非常感谢,正如我所说,我对整个ASM世界以及C#world(几周)都是新手。所以从我的理解来看应该是这样的。WriteMemory(进程进程,0x00498D45,C68559FEFF08)@Dan272甚至没有关闭。你读过我的答案了吗?@Dan272我钦佩你的雄心壮志,但你真的应该从低一点开始。编写一些C代码,让自己熟悉类似C语言的编程。然后写一些C来熟悉当你做得不完美时的崩溃。然后试着涉猎汇编——也许是在C代码中编写小的内联代码。最后,您将准备好对其他正在运行的进程的指令进行黑客攻击。
C68559FEFFFF08 mov byte [ebp-0x1a7],0x8
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);