2

我正在记忆编辑一个名为 Assault Cube 的游戏,可以在以下位置找到:http ://assault.cubers.net/

我不知道如何描述它,所以我制作了一个视频:www.youtube.com/watch ?v=SS1swxQIbDI

请注意,我的弹药在编辑之前就已失效。编辑后,弹药保持不变。基本上,在 0x45B75F,我需要插入两个 NOP。

我在互联网上找到了以下内容:

1.

BYTE NewBytes[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
*(PBYTE)0xXXXXXXXX[0] = NewBytes;

所以我试着做:

BYTE NewBytes[] = { 0x90, 0x90 };
*(PBYTE)0x45B75F[0] = NewBytes;

但我得到这个错误:error C2109: subscript requires array or pointer type

2.

DWORD origProtect;
VirtualProtect( ( void* )0x77D142CF, 5, PAGE_EXECUTE_READWRITE, &origProtect );
memcpy( ( void* )0x77D142CF, "\x8B\xFF\x55\x8B\xEC", 5 );
VirtualProtect( ( void* )0x77D142CF, 5, origProtect, NULL );

我宁愿不使用 memcpy 或任何方法。

3.

char val = 0x48;
BOOL success = WriteProcessMemory(target, 0x10134CE0, &val, 1, NULL);

同样,我宁愿不使用方法。

4.

uint8_t* code = (uint8_t*)0x45B75F;
*code = 0x90;

以上给了我这些错误:

error C2065: 'uint8_t' : undeclared identifier
error C2065: 'code' : undeclared identifier
error C2065: 'uint8_t' : undeclared identifier
error C2059: syntax error : ')'
error C2065: 'code' : undeclared identifier

5.

*(char*)0x45B75F = 0x90;

这会导致崩溃。

4

1 回答 1

2

1. 你在这里双重取消引用。你想要的是:

*((BYTE *) (0x45B75F + 0)) = NewBytes[0];
*((BYTE *) (0x45B75F + 1)) = NewBytes[1];

覆盖代码时,您需要确保执行没有运行您正在覆盖的代码。否则,您可能会引入竞争条件,即在短时间内意外引入无效或不受欢迎的指令。您可能会研究用于执行二进制重写的原子操作(如果适用)。

2. 你对这里的厌恶memcpy似乎值得怀疑。编译器可能会将 优化memcpy为双字MOV-,后跟单字节MOV。您可以通过将 5 个字节编码为一个 32 位整数和一个字节来强制解决此问题。或者,您可以将 5 次连续写入内存,编译器可能会自动组合它们。例如:

code[0] = byte0;
code[1] = byte1;
etc.

3. 为什么要避免使用这个功能?我不熟悉 Windows,但这似乎是写入另一个进程内存的标准方法。

4. uint8_tstdint.hC99标准库头文件中定义;你必须包括它。关于code未声明的错误是前一个错误的副作用uint8_t

5. 这并非不合理。您将 a 注入NOP到假定的明确定义的地址中,而不考虑您要覆盖的内容。举个简单的例子:

假设我在内存调用中有一条指令I1,它占用两个字节:[I1_0, I1_1]. 现在,您正在做的可能是用 a 覆盖其中一个字节NOP,而不考虑周围的字节是否将作为指令保持有效,例如[0x90, I1_1][I1_0, 0x90]。如果I1_0I1_1单独是无效的操作码序列,那么程序当然会崩溃!

这可能不起作用的另一个原因是,调试器(在您的情况下为 OllyDbg)通常(至少在 Mac 和 Linux 上)以与操作系统不同的方式布置正在调试的进程的地址空间。进程在本地运行。这意味着类似的地址0x45B75F在调试器中可能是有意义的,但在尝试对本机进程的内存进行操作时却毫无意义。

这可能不起作用的第三个原因是写入内存(没有您提供更多信息)似乎是在您的进程的内存而不是另一个进程的内存上运行(除非您正在尝试这样做)。如果该内存地址甚至被映射,它仍然可能无法写入(由于页面保护)。

于 2013-04-28T04:31:53.463 回答