Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换;应用程序';s";存储器地址_C++_Winapi_Pointers_Memory_Reverse Engineering - Fatal编程技术网

C++ 转换;应用程序';s";存储器地址

C++ 转换;应用程序';s";存储器地址,c++,winapi,pointers,memory,reverse-engineering,C++,Winapi,Pointers,Memory,Reverse Engineering,因此,我正在为微软的蜘蛛纸牌编写我的第一个培训师。首先,我需要反向设计所有内存地址,直到找到一个静态地址。我使用了偏移量,因此可以轻松地将它们还原回去 我发现: 1000157F78 <-- starting value(never changes) + E8 <-- offsets to pointers + 14 002DC3D4 <-- final adress(changes every time) 但这不起作用,因为入口点是5C。它应该给出的地

因此,我正在为微软的蜘蛛纸牌编写我的第一个培训师。首先,我需要反向设计所有内存地址,直到找到一个静态地址。我使用了偏移量,因此可以轻松地将它们还原回去

我发现:

1000157F78  <-- starting value(never changes)
+ E8        <-- offsets to pointers
+ 14
002DC3D4    <-- final adress(changes every time)

但这不起作用,因为入口点是
5C
。它应该给出的地址(在这个会话中)是
FF7A5F78
,但是真正发生的是
5C+B5F78=B5F4D

,我认为您可以使用,传递模块句柄参数的
NULL
来查询加载地址。如果这不起作用,你可以走更长的路,然后。

经过长时间的研究,我找到了自己的答案! 这段代码获取模块基址(AKA入口点)(需要包括TlHelp32.h和tchar.h):

DWORD getModuleBaseAddr(DWORD procId,TCHAR*lpszModuleName)
{
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS\u SNAPMODULE,procId);
DWORD moduleBaseAddr=0;
if(hSnapshot!=无效的\u句柄\u值)
{
MODULEENTRY32 mentry32={0};
mentry32.dwSize=sizeof(MODULEENTRY32);
if(模块32第一(hSnapshot和mentry32))
{
做
{
if(_tcscmp(mentry32.szModule,lpszModuleName)==0)
{
moduleBaseAddr=(DWORD)mentry32.modBaseAddr;
打破
}
}while(module32下一步(hSnapshot和mentry32));
}
}
其他的
{

std::cout地址空间随机化:这是特定于系统的。您不声明系统(除了一些M$系统).Version?64位?32位?很好,@user3344003。我使用的是64位Windows 7。@用户:这不是特定于系统的。确定模块基址所需的API调用适用于所有受支持的Windows版本,它们的使用方式相同。是的,这是我过去做类似事情的方式。或者,您可以插入code,然后加载您设计的DLL,该DLL将加载到进程地址空间iteself中,这使得使用GetProcAddress更容易。我研究了它,但我没有真正理解它。然而,我尝试了。它不起作用,至少对于GetModuleInformation。您能举个例子吗?或者我需要对ModuleInformation做什么on?模块信息包含模块的基址,您的相对偏移量应该添加到该基址。@Jester我尝试了这个,我得到了不同的入口点(这很好),但它不起作用。也许基址不是完全相同的参考点,但它应该是一个可以轻松计算的恒定偏移量。
DWORD FindFinalAddr(HANDLE hProc, BYTE offsets[], DWORD baseAddress, unsigned char pointerLevel)
{
    DWORD pointer = baseAddress;
    DWORD pTemp = 0;
    DWORD pointerAddr = 0;

    // set base address
    ReadProcessMemory(hProc, (LPCVOID)pointer, &pTemp, (DWORD)sizeof(pTemp), NULL);

    for (int c = 0; c < pointerLevel; c++)
    {
        pointerAddr = pTemp + (DWORD)offsets[c];
        ReadProcessMemory(hProc, (LPCVOID)pointerAddr, &pTemp, (DWORD)sizeof(pTemp), NULL);
    }

    return pointerAddr;
}
void * entryPoint = (void*) hProc;

DWORD base_addr = ((DWORD)(entryPoint) + 0xB5F78);
DWORD getModuleBaseAddr(DWORD procId, TCHAR * lpszModuleName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId);
    DWORD moduleBaseAddr = 0;

    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 mentry32 = { 0 };
        mentry32.dwSize = sizeof(MODULEENTRY32);

        if (Module32First(hSnapshot, &mentry32))
        {
            do
            {
                if (_tcscmp(mentry32.szModule, lpszModuleName) == 0)
                {
                    moduleBaseAddr = (DWORD)mentry32.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnapshot, &mentry32));
        }
    }
    else
    {
        std::cout << "Error on finding module base address: " << GetLastError() << "\n";
    }

    return moduleBaseAddr;
}