c - WriteProcessMemory 不适用于非静态变量

标签 c winapi memory

我的问题如下。我有 2 个函数,一个调用 WriteProcessMemory 并返回其结果,另一个将缓冲区发送到第一个函数。

如果我从第二个到第一个发送一个静态变量作为缓冲区,没有问题,但反之亦然,它会崩溃。

这是第一个的来源:

void WriteMem(LPVOID addr, LPCVOID *buffer,size_t size){

int i = WriteProcessMemory(hProc, addr, buffer, size, NULL);

    if(i)
        printf("Success\n");
    else
        printf("Fail\n");

}

第二个来源:

段错误:

void EditCards(BYTE victim){

BYTE cardsDrawn = 23;
puts("Choose the cards:");
scanf("%hhu",&cardsDrawn);

if(cardsDrawn > 40)
    cardsDrawn = 40;

cardsDrawn = 40 - cardsDrawn;//If the enemy has 5 cards then 45 have been drawn :P

WriteMem( victim ? Y_ENEMY_CARDS : Y_PLAYER_CARDS, &cardsDrawn, sizeof(BYTE));



}

工作正常:

void EditCards(BYTE victim){

static BYTE cardsDrawn = 23;
puts("Choose the cards:");
scanf("%hhu",&cardsDrawn);

if(cardsDrawn > 40)
    cardsDrawn = 40;

cardsDrawn = 40 - cardsDrawn;//If the enemy has 5 cards then 45 have been drawn :P

WriteMem( victim ? Y_ENEMY_CARDS : Y_PLAYER_CARDS, &cardsDrawn, sizeof(BYTE));



}

分配给 cardsDrawn 的空间afaik 当传递到下一个 WriteMem 时仍然被分配为什么会失败?

编辑: 不,我正在编辑另一个进程的内存。如果你想知道它是 ePSXe.exe

hProc 是 global variable在main函数中赋值。它是我正在编辑其内存的进程的句柄。

请求内容如下:

#define Y_PLAYER_CARDS ((LPVOID)0x0B76510)
#define Y_ENEMY_CARDS (LPVOID)(Y_PLAYER_CARDS + 0x20)

最佳答案

我能够使用您的代码的简化版本重现您的问题;即使 WriteMem() 什么都不做,它仍然会崩溃!问题是这样的:

scanf("%hhu",&cardsDrawn);

hh 前缀是 valid in Linux但是是not supported在 Microsoft C 运行时中。

相反,使用

{
  int x; 
  scanf("%u",&x);
  cardsdrawn = x;
}

关于c - WriteProcessMemory 不适用于非静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342500/

相关文章:

c++ - 在 ncurses 中提取带有属性的宽字符

c - 确定最大质因数

c# - Windows 如何决定显示屏幕保护程序

winforms - PowerShell 脚本返回错误的屏幕分辨率

c# - 管理内存

c - 使用内核模块中的 sysctl 接口(interface)

delphi - 从 SocketHandle 获取 IP 和端口

C++可视化变量的内存

python - 如何在 Python 中动态分配内存

java - 使用JNI调用java模块中的main方法