从exe c ++获取基址

时间:2016-01-06 22:22:25

标签: c++ winapi openprocess

我尝试使用openprocess从这个exe获取基本起始地址,但是当我运行代码时我一直在崩溃,而且我真的没有看到它有任何问题。

HMODULE GetModule(HANDLE han)
{
    HMODULE hMods[1024];
    int i;
    DWORD cbNeeded;
    char szProcessName[MAX_PATH] = "Minesweeper.exe";
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
    for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
    {
        TCHAR szModName[MAX_PATH];
        GetModuleFileNameEx(han, hMods[i], szProcessName, sizeof(szModName));
        //printf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]);
        if (szModName == szProcessName)
        {
            cout << "FOUND" << endl;
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码存在以下问题:

  • 您使用的是TCHAR,但未使用TCHAR
  • 您正在使用==而不是正确的字符串比较功能。
  • GetModuleFileNameEx的调用使用了错误的数组。

以下是代码的清理版本,带有更正(未经过测试,但解决了代码的大部分问题):

HMODULE GetModule(HANDLE han)
{
    HMODULE hMods[1024];
    int i;
    DWORD cbNeeded;
    TCHAR szProcessName[MAX_PATH] = _T("Minesweeper.exe");
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
    for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
    {
        TCHAR szModName[MAX_PATH];
        GetModuleFileNameEx(han, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR));
        if ( _tcscmp(szModName,szProcessName) == 0)
        {
            cout << "FOUND" << endl;
        }
    }
    return 0;
}

请注意,_T()宏用于表示字符串文字。由于Microsoft有两种字符集构建类型,并且您正在使用TCHAR,因此您应该将其余字符串与TCHAR兼容。直接使用char并依赖于字符集构建类型来保存编译器或运行时错误不是编写代码的方法。

此外,sizeof来电中的GetModuleFileNameEx必须除以sizeof(TCHAR)才能正确。

此外,为了解决字符串比较,使用_tcscmp函数。无论字符集构建类型如何,此函数都是正确的。