Member 10620726 Ответов: 2

Получение идентификатора ресурса, зная полную строку


Я знаю, что это немного сложно, но мне это нужно для приложения.
Как правило, мы используем функцию методом loadstring, чтобы загрузить строку из ресурсов в языке, указание на HINSTANCE библиотеки DLL.

Что я уже пробовал:

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

2 Ответов

Рейтинг:
13

Jochen Arndt

Если вам нужно сделать это с помощью кода, просто повторите возможные идентификаторы.

Непроверенный пример на основе существующего кода для сканирования строковых ресурсов в библиотеках DLL:

int GetID(HMODULE hModule, LPCTSTR str)
{
    // Declare CString object outside the loop to avoid 
    //  memory allocation with each call to LoadString().
    CString strItem;
    for (unsigned long i = 0; i <= 0xFFFF; i++)
    {
        if (strItem.LoadString(hModule, i))
        {
            if (strItem == str)
                return i;
        }
    }
    return -1;
}

Если библиотека DLL еще не загружена, загрузите ее как файл данных с помощью LoadLibraryEx с параметрами DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE.


nv3

Мой 5. И я думаю, что есть даже способ избежать повторения всех 2**16 возможных идентификаторов. Но для этого нужно немного глубже заглянуть в формат exe-файла.

Jochen Arndt

Спасибо.
Зная формат, можно найти существующие идентификаторы и сравнить полученные строки (или получить их при разборе идентификаторов).

Но перебор всех возможных идентификаторов должен быть достаточно быстрым. Если я выполнил свой существующий код, который пробует все идентификаторы и добавляет строки в элемент управления edit с помощью wininet.dll (2 МБ):
Это заняло меньше секунды.

Рейтинг:
0

KarstenK

Это простой трюк: откройте dll в Visual Studio как файл ресурсов. ("Открыть файл" + выбрать "ресурс" в качестве типа файла)

Затем вы видите таблицу string list и можете искать ее.