c ++ if语句不起作用(不会读取内存)

时间:2015-10-07 18:15:22

标签: c++

我为我的节目制作了一个小白名单。 但问题是它不起作用。 这是代码:

#include <iostream>
#include <Windows.h>
#include <string>
#include <cstdint>

using namespace std;

int main();
{
    //Here is the part where it gets the process and it data so i won't type it here, takes too much space.
    string a;
    uintptr_t p = 0x0178B3A8;
    int value = *reinterpret_cast<int *>(p);
    int ID = 22862235;

    printf("Authorizing...\n");

    if(value == ID)
    {
        printf("Authorized, Access Granted\n");
        Sleep(5000);
    }
    else
    {
        printf("ERROR004:Account Not On Whitelist\n");
        printf("Shutdowning...\n");

        BYTE newcode[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90};
        DWORD address = 0x007C122E;

        WriteProcessMemory(GetCurrentProcess(), (LPVOID)address, newcode, sizeof(newcode), NULL);
    }
}

运行时会显示“ERROR404:帐户不在白名单上” 任何修复???

1 个答案:

答案 0 :(得分:4)

OP似乎与不理解Virtual Memory有冲突。

每个进程都有自己的虚拟寻址,其唯一的寻址空间可以使用或不使用任何地址。这允许物理存储在任何物理上可寻址的介质中:高速缓存,RAM,磁盘高速缓存或类似于成对的亚原子粒子旋转的深奥的东西。因此,所有进程可以同时使用相同的地址,因为每个进程中的每个地址都映射到物理存储中的不同位置。

OP已声明在某个未知进程的0x0178B3A8处,X是有效的ID号。

OP的程序不是进程X.让我们称之为执行进程Y.在进程X中,0x0178B3A8很可能是用户ID的地址。我无法证实这一点。但由于0x0178B3A8是虚拟引用,而不是物理存储引用,因此进程Y无法读取0x0178B3A8并期望任何进程Y没有放在那里。如果Y没有在0x0178B3A8处放置任何内容,则程序的行为未定义。

如何解决这个问题我想与之无关。赔率很高,不会结束。