Сейчас на форуме: vsv1 (+5 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Как дождаться загрузки Модуля для получения Адреса загрузки |
Посл.ответ | Сообщение |
|
Создано: 08 февраля 2016 14:41 · Поправил: bolvai · Личное сообщение · #1 Добрый день! Мне требуется узнать адрес загрузки - сторонней библиотеки "Nwindow.dll" которая загружается в 1 приложение, проблема в том что то место откуда я внедряю свой код(точнее библиотека "Ogg.dll")) загружается намного раньше чем NWindow.dll, и по этому всякий раз когда я выполняю GetModuleHandle - подобным образом - Code:
Code:
но в результате программа попросту зависала, как правильно следует дождаться загрузки модуля через код, либо может есть другой способ ? Пытаюсь решить эту проблему уже несколько дней - но не как не выходит, подскажите пжлста ! ![]() |
|
Создано: 08 февраля 2016 14:49 · Личное сообщение · #2 |
|
Создано: 08 февраля 2016 14:50 · Личное сообщение · #3 |
|
Создано: 08 февраля 2016 14:52 · Поправил: dosprog · Личное сообщение · #4 |
|
Создано: 08 февраля 2016 14:53 · Личное сообщение · #5 |
|
Создано: 08 февраля 2016 14:59 · Личное сообщение · #6 |
|
Создано: 08 февраля 2016 15:00 · Личное сообщение · #7 Kaimi пишет: https://msdn.microsoft.com/en-us/library/dd347461(v=vs.85).aspx А примерный код можно взглянуть(в упрошенной форме) То что тут нашел https://github.com/strobejb/sslhook/blob/master/sslhook/modnotify.cpp немного замудрено для разных целей. Hellspawn пишет: ну например так: LdrLoadDll Так если я загружу библиотеку раньше чем это требуется, это разве не вызовет проблем ? ![]() |
|
Создано: 08 февраля 2016 15:13 · Личное сообщение · #8 |
|
Создано: 08 февраля 2016 15:18 · Поправил: bolvai · Личное сообщение · #9 Hellspawn пишет: либо ждать загрузки в отдельном потоке, гоняя цикл с GetModuleHandle. Можно чуточку по подробнее про это и про LdrRegisterDllNotification ? Я просто раньше не сталкивался с подобным - но эта древняя библиотека 2006 -года, генерирует адреса динамически(и самих функций и адрес загрузки), от запуска к запуску они разные. ![]() |
|
Создано: 08 февраля 2016 15:18 · Личное сообщение · #10 Господа, а нельзя ли загрузить модуль NWindow.dll без запуска DllMain (а также опционально загрузки зависимостей, вызовов TLS), чтобы хендл был уже валидный, а попозже модуль загрузится полноценно в обычном порядке родной программой? Вроде в LoadLibraryExW есть интересные флажки, но я туда сам не лез. ![]() |
|
Создано: 08 февраля 2016 15:25 · Поправил: dosprog · Личное сообщение · #11 kunix пишет: Господа, а нельзя ли загрузить модуль NWindow.dll без запуска DllMain Потом, при реальной загрузке, уже будет другой адрес. bolvai пишет: Я просто раньше не сталкивался с подобным - но эта древняя библиотека 2006 -года, генерирует адреса динамически(и самих функций и адрес загрузки), от запуска к запуску они разные. При чём тут древность? На какой системе запускаете это всё? ![]() |
|
Создано: 08 февраля 2016 15:29 · Поправил: kunix · Личное сообщение · #12 |
|
Создано: 08 февраля 2016 15:31 · Поправил: dosprog · Личное сообщение · #13 |
|
Создано: 08 февраля 2016 15:34 · Личное сообщение · #14 bolvai пишет: А примерный код можно взглянуть(в упрошенной форме) То что тут нашел https://github.com/strobejb/sslhook/blob/master/sslhook/modnotify.cpp немного замудрено для разных целей. Да по ссылке вроде все просто. Вот еще какой-то пример http://www.programmershare.com/3522318/ или вот http://stackoverflow.com/questions/4242469/detect-when-a-module-dll-is-unloaded ![]() |
|
Создано: 08 февраля 2016 15:41 · Личное сообщение · #15 dosprog пишет: На Vista+ говнюки ввели механизм ASLR - специально, чтобы воспрепятствовать подобным экспериментам. - Специально, гады, рандомизируют адреса загрузки модулей. (если модули имеют таблицу перемещений) Вы меня слишком примитивно поняли, я не предлагаю загружать и потом выгружать, а потом опять загружать. Я предлагаю загрузить частично, через LoadLibraryEx (,,DONT_RESOLVE_DLL_REFERENCES) или LoadLibraryEx (,, LOAD_LIBRARY_AS_IMAGE_RESOURCE). Скорее всего не выйдет, так как, например, LoadLibraryEx (,,LOAD_LIBRARY_AS_DATAFILE) с последующим LoadLibrary() загрузит image два раза и вернет два разных хендла. ![]() |
|
Создано: 08 февраля 2016 16:06 · Личное сообщение · #16 dosprog пишет: На какой системе запускаете это всё? под Win8.1 приложение x86 (игра), есть более новые версии этой самой игры и та же самая библиотека имеет статичные адреса, которые генерирует IDA, и их можно напрямую инжектить, а с этой версией такое не срабатывает. Kaimi пишет: http://www.programmershare.com/3522318/ или вот http://stackoverflow.com/questions/4242469/detect-when-a-module-dll-is-unloaded Сейчас попробую ![]() |
|
Создано: 08 февраля 2016 19:20 · Поправил: dosprog · Личное сообщение · #17 |
|
Создано: 08 февраля 2016 21:49 · Личное сообщение · #18 dosprog пишет: генерированием библиотекой динамических адресов"... Это я забыл вам упоминать - основную причину того - почему мне требуется адрес загрузки, в этом приложении(игре) адресное пространство функций генерируется от запуска к запуску с разными значением, было к примеру 9330000, а потом стало 9320000, по этому те функции что мне сгенирировала IDA имеют не совсем верный адрес уже в памяти, т.е была функци по адресу sub_1008F870(В иде),а в итоге она будет в памяти по адресу (sub_1008F870-ImageBase)+Тот самый адрес загрузки - который как раз не постоянный. В общем посмотрел я на применение Code:
![]() |
|
Создано: 08 февраля 2016 23:22 · Поправил: v00doo · Личное сообщение · #19 bolvai пишет: дресное пространство функций генерируется от запуска к запуску с разными значением Почитал бы уже про и примеры погуглил, уже даже сказали. https://ru.wikipedia.org/wiki/ASLR Кстати вариант с ожиданием в потоке, как сказал Hellspawn, кажется тут самым простым. bolvai пишет: по этому те функции что мне сгенирировала IDA имеют не совсем верный адрес уже в памяти Не генерирует она ничего, они идут от базы (ImageBase) все так же, ты описываешь тот же ASLR, хотя могу ошибаться, но скорее всего все именно так, отключить да проверить. bolvai пишет: есть более новые версии этой самой игры и та же самая библиотека имеет статичные адреса Измени тогда хидер либы, отключи ASLR ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Как дождаться загрузки Модуля для получения Адреса загрузки |