0

我尝试使用 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;
}
4

1 回答 1

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函数。无论字符集构建类型如何,此函数都是正确的。

于 2016-01-06T22:58:11.600 回答