Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过c编辑内存地址#_C#_Inline Assembly - Fatal编程技术网

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

C# 通过c编辑内存地址#,c#,inline-assembly,C#,Inline Assembly,我想编辑活动应用程序(编辑内存地址) 在地址00498D45上,我想编辑它的值 当前值: MOV BYTE PTR SS:[EBP-423],7 到 更新值: MOV BYTE PTR SS:[EBP-423],8 到目前为止,我得到的是这个(在网上搜索了一下,我得到了多少): 提前谢谢 using System.Runtime.InteropServices; [Flags] public enum ProcessAccessFlags : uint {

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

在地址
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;
}
从您的:

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

  • 您正在调用一个函数,但是您在那里有
    进程
    ,就像它是一个签名一样
  • 00498D45
    不是任何基数中的有效常量。如果您指的是十六进制(这可能是因为您正在处理地址),那么与所有其他类似C的语言一样,应该表示为
    0x00498D45
  • 这是ASCII格式的x86汇编代码(但它不是字符串格式的,只是一团糟)。您不能只是将ASCII汇编代码塞入另一个进程的地址空间 也许您应该对编译和汇编在构建程序时是如何工作的,以及CPU在执行程序时实际在做什么进行更多的研究。此外,我建议您通读您显然从某处获取的示例代码,并尝试理解它。如果你知道发生了什么,你会比让每个人帮你解决你拼凑的东西要好得多<代码>

    无论如何,在组装代码后,它看起来是这样的(重新分解):

    这意味着您的指令实际上是字节字符串
    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[]
    参数,要么自己动手



    我佩服你的雄心壮志,但你真的应该从低一点开始。编写一些C代码,让自己熟悉类似C语言的编程。然后写一些C来熟悉当你做得不完美时的崩溃。然后试着涉猎汇编——也许是在C代码中编写小的内联代码。最后,您将准备好破解其他正在运行的进程的指令。

    您可以使用类似(我是作者)的注入库。所有这些函数都封装在一个方便的API中,集成了一个汇编程序(FASM语法)。因此,这段代码执行您想要的操作:

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

    你的问题是什么?我如何做我想要的编辑,我的意思是ASM从currect值更新到更新值-我是ASM新手,所以我不知道我是否正确设置了值等。你想破解什么软件?@Evo510要能够执行断点之类的操作,调试器必须注入代码()。这里有一个很好的解释它是如何工作的。@Dan272不,已经是这样了,将8写入
    0x00498D45+6
    (假设是该7的地址)写入4字节有什么问题?实际上只有1个字节发生了变化,对吗?你的库似乎不起作用,这是有原因的。当我尝试使用您在可执行进程上显示的代码(具有不同的指令和地址)时,我得到了一个错误:“在FASM组装助记符时发生了一个错误。错误代码:-118(无效表达式);错误行:3;错误偏移量:21”。知道为什么会这样吗?
    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);
    
    using (var m = new MemorySharp(ApplicationFinder.FromProcessName("My App").First()))
    {
        m.Assembly.Inject("MOV BYTE [EBP-423],8", new IntPtr(0x00498D45));
    }