WriteProcessMemory不支持';不能使用非静态变量

WriteProcessMemory不支持';不能使用非静态变量,c,winapi,memory,C,Winapi,Memory,我的问题如下。我有两个函数,一个调用WriteProcessMemory并返回结果,另一个将缓冲区发送到第一个 如果我将一个静态变量作为缓冲区从第二个发送到第一个,没有问题,反之亦然,它会崩溃 以下是第1条的来源: void WriteMem(LPVOID addr, LPCVOID *buffer,size_t size){ int i = WriteProcessMemory(hProc, addr, buffer, size, NULL); if(i) prin

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

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

以下是第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是分配给主函数的
全局变量
。这是一个进程的句柄,我正在编辑它的内存

以下是所要求的:

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

问题是,您正在使用自己进程中的指针标识要在另一个进程中写入的地址。Windows使用虚拟内存系统,因此地址是进程的本地地址,而进程在特定地址有一个对象这一事实并不能告诉您对象在其他进程中的位置

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

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

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


我可以用简化的代码重现您的问题;即使WriteMem()什么也不做,它仍然会崩溃!问题是:

scanf("%hhu",&cardsDrawn);
hh
前缀为,但在Microsoft C运行时中

相反,使用

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

这一切都是在同一个进程中运行的吗?如果是这样,您可能不需要(也不应该使用)WriteProcessMemory。如果代码在不同的进程中运行,您能提供更多信息吗?在哪里定义了
Y_敌方卡
Y_玩家卡
,它们的值是什么?其中
hProc
正在分配。请考虑在@ HarryJohnston的建议,但它是“代码> > %HU”/代码>,它指定了<代码>未签名的char <代码> > @ thb,这2个都是在头文件中定义的。这对您的问题不重要,但为什么是“代码> WrreMeMe”(<代码)>原型>代码>无效写入(LpValAdDR,LPCVATE*缓冲区,SIZEZT大小)。而不是
无效写入项(LPVOID addr,LPCVOID buffer,size\u t size)
?您正在传入(并使用)指向缓冲区的指针,而不是指向指针的指针。这是令人困惑的/误导的,如果没有其他的东西。根据最新的编辑,指针从一个固定的整数转换,<代码>((LPATOLT)0x0B765 10)< /C>注意,Visual C++ 2015(又名MSVC 14)支持<代码> HH前缀,即使它没有被记录(但是)。如果我使用
%hc
我不会出现分段错误,但我还有另一个问题。结果是键代码而不是数字。看起来我需要坚持使用
static
@krystalgamer:使用
static
的“解决方案”,您依赖的未定义行为没有明显的效果-它仍然是一个内存损坏bug,只是一个您没有发现问题的bug。然而为什么不将
scanf()
转换成一个
无符号整数
,然后将其转换成一个字节,使用
WriteMem()
?:
无符号整数x=0;scanf(“%u”、&x);cardsDrawn=x。现在没有内存损坏。