WriteProcessMemory不能处理非静态变量

时间:2015-09-01 23:40:00

标签: c winapi memory

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

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

这是第一个来源:

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。它是我编辑内存的过程的一个句柄。

这里要求的是:

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

2 个答案:

答案 0 :(得分:1)

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

scanf("%hhu",&cardsDrawn);

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

相反,请使用

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

答案 1 :(得分:0)

问题是你要在自己的进程中使用指针识别要在其他进程中写入的地址。 Windows使用虚拟内存系统,因此地址是进程的本地地址,并且您的进程具有位于特定地址的对象这一事实并不能告诉您有关对象在其他进程中的位置的任何信息。

“培训师”(操纵其他程序的内部数据结构的程序,通常是游戏)以多种方式解决这个问题:

  • 全局变量和静态变量通常在程序的多次运行中具有一致的地址,并允许您构建其地址的表(映射)。

  • 每次程序运行时,动态对象都会获得新地址,因此培训师通常使用模式搜索来查找对象,或者读取其他程序的全局变量中的指针,以找到该对象的当前地址。