Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
553 / 25 / 7
Регистрация: 12.11.2013
Сообщений: 52

Получить имя библиотеки/функции по её адресу

25.04.2019, 14:04. Показов 3676. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С помощью несложного кода получаю строку вида
C++
1
2
3
4
case CREATE_THREAD_DEBUG_EVENT:
        tcout << TEXT(" dwThreadId: ") << DbgEvent.dwThreadId << TEXT(" (Start Address: 0x")
            << DbgEvent.u.CreateThread.lpStartAddress << TEXT(", Name: )") << std::endl;
        break;
Имеется поток с идентификатором и его адрес в библиотеке, которая его запустила


Если взять этот адрес и посмотреть что по нему находится (к примеру через CheatEngine) можно увидеть следующее


Вопрос: как зная адрес lpStartAddress определить что это, во-первых ntdll.dll, и во-вторых, что это функция DbgUiRemoteBreakin?

Первое что приходит на ум, это распарсить экспорт (по HMODULE библиотеки) и искать адреса, смещения... и прочее.
А есть ли что-то попроще? Может быть какая-то WinAPI функция, которая делает это одной строкой?

К примеру, чтобы узнать имя файла по его хендлу в XP нужно использовать огромный код
https://docs.microsoft.com/en-... ile-handle
Хотя всю эту громоздкость, начиная с Vista, можно уложить в пару стандартных функций
C++
1
2
GetFinalPathNameByHandle(DbgEvent.u.LoadDll.hFile, FileName, MAX_PATH, FILE_NAME_NORMALIZED);
FindFirstFile(FileName, &Data);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2019, 14:04
Ответы с готовыми решениями:

Получить имя пользователя по IP-адресу
Возможно ли такое?

Имя функции по ее адресу
У экземпляра класса ProcessThread есть поле StartAddress. Msdn подсказал, что там . Как я могу получить имя этой функции?

Получить в функции имя перменной
Можно ли получить в функции имя переменной, с которой произошло обращение к функции? Поясню на примере let ident = 5; foo(ident); ...

3
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.04.2019, 10:12
Лучший ответ Сообщение было отмечено cloo как решение

Решение

cloo, вызов функции
GetModuleHandleEx с первым параметром равным GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS вернет дескриптор библиотеки, которой принадлежит переданный вторым параметром адрес.

Добавлено через 2 минуты
Цитата Сообщение от cloo Посмотреть сообщение
во-вторых, что это функция DbgUiRemoteBreakin
Если функция экспортируемая - парсить таблицу экспорта библиотеки. Если нет - читать pdb-файл, Microsoft предоставляет доступ к pdb для большинства своих библиотек.

Добавлено через 27 минут
Цитата Сообщение от cloo Посмотреть сообщение
К примеру, чтобы узнать имя файла по его хендлу в XP нужно использовать огромный код
GetModuleFileName возвращает имя библиотеки по ее дескриптору.

Добавлено через 18 минут
Если это все нужно проделать для стороннего процесса, то
EnumProcessModules - для получения списка подгруженных библиотек,
GetModuleInformation - для получения адреса и размера библиотеки (эта информация позволит проверить какой библиотеке принадлежит некоторый адрес),
GetModuleFileNameEx - для получения имени библиотеки.
1
553 / 25 / 7
Регистрация: 12.11.2013
Сообщений: 52
26.04.2019, 10:36  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Если это все нужно проделать для стороннего процесса, то
Да, именно для стороннего. Нужна информация о его модулях.

В принципе так и думал: сначала перечислить все модули у процесса по его хендлу, тем самым узнав адреса по которым они загружены, а уже потом методично извлекать необходимую информацию.
Попробую всё это обернуть в небольшой лаконичный код, о результатах отпишусь.
Спасибо.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
28.04.2019, 18:59
Лучший ответ Сообщение было отмечено cloo как решение

Решение

Цитата Сообщение от cloo Посмотреть сообщение
именно для стороннего
как вариант использовать библиотеку TlHelp32
C++
1
2
3
4
5
6
7
8
9
10
11
12
hSnapshop = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
if (Process32First(hSnapshop, &ProcessEntry)) {
    do {
        if (strcmp(ProcessEntry.szExeFile, ProcessName) == 0) {
            dwProcessId = ProcessEntry.th32ProcessID;
            break;
        }
    } while (Process32Next(hSnapshop, &ProcessEntry));
}
    
CloseHandle(hSnapshop);
C++
1
2
3
4
5
6
7
8
9
10
hSnapshop = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 
if (Thread32First(hSnapshop, &ThreadEntry)) {
    do {
        if (ThreadEntry.th32OwnerProcessID == dwProcessId)
        std::cout << TEXT(" dwThreadId: ") << ThreadEntry.th32ThreadID << std::endl;
    } while (Thread32Next(hSnapshop, &ThreadEntry));
}
 
CloseHandle(hSnapshop);
C++
1
2
3
4
5
6
7
8
9
10
hSnapshop = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
 
if (Module32First(hSnapshop, &ModuleEntry)) {
    do
    {
        std::cout << ModuleEntry.szModule << TEXT(" - ") << ModuleEntry.hModule << std::endl;
    } while (Module32Next(hSnapshop, &ModuleEntry));
}
 
CloseHandle(hSnapshop);
но с поиском имён функций в библиотеках придётся всё таки помудрить, простого решения нету.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2019, 18:59
Помогаю со студенческими работами здесь

Получить имя функции в блоке catch
Внутри метода находится блок try-catch. Как получить при исключении имя метода ?

Получить имя пользователя с помощью функции GetUserName
Получить Імя юзера с помащю функції GetUserName

Как в билдере получить с сервера (MySQL 5.1, имя базы "skola", имя table "info") имя столбцов и имя строк
Доброва времены суток Как в билдере получить с сервера (MySQL 5.1, имя базы &quot;skola&quot;, имя table &quot;info&quot;) имя столбцов и...

Как получить имя текущей процедуры или функции?
Всем доброго времени суток. Прошерстив просторы интернета не нашел каким образом можно получить имя текущей процедуры или функции? Все...

Получить имя моего процесса (получить имя меня)
Работает мой код. Мне нужно получить имя моего процесса - ***.exe


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru