【问题标题】:C++ Memory Editing- Writing to current programC++ 内存编辑 - 写入当前程序
【发布时间】:2012-08-05 20:50:56
【问题描述】:

我的代码是-

BYTE newValue[] = {0x90, 0x90, 0x90, 0x90};
*(char *)0x004C40DB = &newValue;

我试图将 004C40DB 设置为 nop

在 Visual C++ 2010 中我得到-

1>----- 构建开始:项目:文件,配置:发布 Win32

1> file.cpp 1>file.cpp(138): 错误 C2440: '=' : 无法从 'BYTE (*)[4]' 到 'char'

1> 没有可以进行这种转换的上下文

1>file.cpp(142): 错误 C2440: '=' : 无法从 'BYTE (*)[4]' 转换 到“字符”

1> 没有可以进行这种转换的上下文

========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

我做错了什么?

【问题讨论】:

  • 为什么要这样做? U 会导致段异常
  • 您的其他问题似乎没有得到完全回答。你应该坚持下去,直到你得到答案,而不是创建一个新问题。
  • 如果我只编辑第一个问题,它会出现在新问题页面上吗?而且它不是重复的,另一个是关于编辑到不同的应用程序,这是关于编辑到当前的。

标签: c++ memory assembly


【解决方案1】:

首先,为了你自己,使用 C++ 风格的强制转换。

其次,如果你想写一个0x90,为什么你有一个包含四个的数组?一个就够了:

*reinterpret_cast<char *>(0x004C40DB) = 0x90;

但很可能您需要使用WriteProcessMemory,如另一个问题中所述,并且您需要首先使用VirtualProtect 使内存可写。

最后,如果您确实需要写入多个字节,则需要注意匹配数据类型——您不能将指向字节的指针写入单个字节。使用WriteProcessMemory,您将传递正确的大小。

如果您在自己的进程中写入内存,则可以改用std::copy

【讨论】:

    【解决方案2】:

    这是你想要做的吗?

    BYTE newValue[] = {0x90, 0x90, 0x90, 0x90};
    *(long*)0x004C40DB = *(long*)newValue;
    

    如果您尝试复制四个字节,那么您需要指向 long 而不是指向 char 的指针(假设 long 是四个字节)。

    【讨论】:

    • 使用 'int' 代替,它在比 'long' 多的系统上是 4 个字节。更好的是,使用 std::copy
    猜你喜欢
    • 2013-04-21
    • 2015-04-01
    • 1970-01-01
    • 2013-08-10
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多