получение базового адреса из exe c++

Я попытался получить базовый начальный адрес из этого исполняемого файла с помощью openprocess, но я продолжаю падать, когда запускаю код, и я действительно не вижу в этом ничего плохого.

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;
}

person Jhon Brian    schedule 06.01.2016    source источник
comment
Этот вопрос, вероятно, должен иметь некоторые теги, специфичные для Windows, но я не знаю, какие из них будут применяться.   -  person 5gon12eder    schedule 07.01.2016
comment
Последний параметр GetModuleFileNameEx измеряется в символах, а не в байтах, поэтому для этого не следует использовать sizeof. В сборке Unicode это может привести к сбою.   -  person Ben Voigt    schedule 07.01.2016
comment
Я использую многобайтовый проект, также я сделал printf, который я закомментировал, и я получил несколько адресов, но у меня произошел сбой после того, как я напечатал их все.   -  person Jhon Brian    schedule 07.01.2016
comment
Кроме того, вы никогда не записываете в szModName (третий и четвертый параметры GetModuleFileName используют разные переменные), и вы не можете сравнивать строки в стиле C с ==, вам нужен strcmp.   -  person Ben Voigt    schedule 07.01.2016
comment
похоже, его находили миллиард раз i.imgur.com/YYeOmwM.png   -  person Jhon Brian    schedule 07.01.2016
comment
Помните, что strcmp возвращает ZERO для совпадения и ненулевое значение в противном случае. Кроме того, вам может понадобиться совпадение подстроки, а не равенство?   -  person Ben Voigt    schedule 07.01.2016
comment
если мне нужен базовый адрес для Minesweeper.exe, как мне конкретно разобраться с Minesweeper.exe вместо всех этих других модальных окон.   -  person Jhon Brian    schedule 07.01.2016
comment
@JhonBrian Я использую многобайтовый проект -- Но вы используете TCHAR, поэтому вы должны писать правильный код относительно количества символов.   -  person PaulMcKenzie    schedule 07.01.2016


Ответы (1)


Есть несколько проблем с вашим кодом:

  • Вы используете 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. Эта функция будет корректной независимо от типа сборки набора символов.

person PaulMcKenzie    schedule 06.01.2016
comment
Все еще вылетает с этой функцией - person Jhon Brian; 07.01.2016
comment
У меня работает нормально, без сбоев. Однако вывод из GetModuleFileNameEx() представляет собой полный путь и имя файла, поэтому вам придется использовать что-то вроде PathFindFileName(szModName), чтобы урезать его до имени файла, прежде чем сравнивать его с szProcessName. - person Remy Lebeau; 07.01.2016
comment
@JhonBrian Вам нужно использовать отладчик, чтобы сообщить нам, на какой строке происходит сбой. Это помогло бы вам правильно написать функцию и/или определить проблему, с которой вы столкнулись. Учитывая это, то, что я написал, является очевидными исправлениями, которые вам нужно было внести, поскольку ваш исходный пост был явно неправильным. - person PaulMcKenzie; 07.01.2016