Сейчас на форуме: vsv1 (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Как дождаться загрузки Модуля для получения Адреса загрузки
Посл.ответ Сообщение

Ранг: 4.2 (гость)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2016 14:41 · Поправил: bolvai
· Личное сообщение · #1

Добрый день! Мне требуется узнать адрес загрузки - сторонней библиотеки "Nwindow.dll" которая загружается в 1 приложение, проблема в том что то место откуда я внедряю свой код(точнее библиотека "Ogg.dll")) загружается намного раньше чем NWindow.dll, и по этому всякий раз когда я выполняю GetModuleHandle - подобным образом -
Code:
  1. HMODULE inc = GetModuleHandle("NWindow.dll");
  2. if (!(inc = GetModuleHandle("NWindow.dll"))){
  3.         wsprintfA(buffer, "%d", GetLastError());
  4.         MessageBoxA(0, buffer, "buffer error", MB_OK);
  5.     }
  6.     else{
  7.         wsprintfA(buffer, "inc: 0x%08X\n", inc);
  8.         MessageBoxA(0, buffer, "buffer addr", MB_OK);
  9.     }
получаю ноль - 126(не найдено) , так же пробовал сделать через LoadLibrary, но таким образом нарушалась цепочка вызова и программа попросту не запускалась, еще пробовал сделать while loop, т.е псевдо способ дождаться загрузки модуля.
Code:
  1. while ((UInterfaceBar = GetModuleHandle(TEXT("NWindow.dll"))) == 0)
  2.                  Sleep(100);

но в результате программа попросту зависала, как правильно следует дождаться загрузки модуля через код, либо может есть другой способ ?
Пытаюсь решить эту проблему уже несколько дней - но не как не выходит, подскажите пжлста !



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 14:49
· Личное сообщение · #2

sleep()



Ранг: 60.6 (постоянный), 87thx
Активность: 0.060
Статус: Участник

Создано: 08 февраля 2016 14:50
· Личное сообщение · #3

https://msdn.microsoft.com/en-us/library/dd347461(v=vs.85).aspx



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 14:52 · Поправил: dosprog
· Личное сообщение · #4

Kaimi пишет:
https:/

-
[This function may be changed or removed from Windows without further notice.]




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 февраля 2016 14:53
· Личное сообщение · #5

ну например так: LdrLoadDll

-----
[nice coder and reverser]




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 14:59
· Личное сообщение · #6

Если вызывать sleep() в DllMain - то она и будет зависать.
Это ж очевидно - DLL не закончила инициализацию и другие библиотеки не загружаются.



Ранг: 4.2 (гость)
Активность: 0.020
Статус: Участник

Создано: 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

Так если я загружу библиотеку раньше чем это требуется, это разве не вызовет проблем ?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 февраля 2016 15:13
· Личное сообщение · #8

ты можешь перехватить функцию и следить за загрузкой модулей.
либо ждать загрузки в отдельном потоке, гоняя цикл с GetModuleHandle.

-----
[nice coder and reverser]




Ранг: 4.2 (гость)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2016 15:18 · Поправил: bolvai
· Личное сообщение · #9

Hellspawn пишет:
либо ждать загрузки в отдельном потоке, гоняя цикл с GetModuleHandle.

Можно чуточку по подробнее про это и про LdrRegisterDllNotification ?
Я просто раньше не сталкивался с подобным - но эта древняя библиотека 2006 -года, генерирует адреса динамически(и самих функций и адрес загрузки), от запуска к запуску они разные.



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 08 февраля 2016 15:18
· Личное сообщение · #10

Господа, а нельзя ли загрузить модуль NWindow.dll без запуска DllMain (а также опционально загрузки зависимостей, вызовов TLS), чтобы хендл был уже валидный, а попозже модуль загрузится полноценно в обычном порядке родной программой?
Вроде в LoadLibraryExW есть интересные флажки, но я туда сам не лез.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 15:25 · Поправил: dosprog
· Личное сообщение · #11

kunix пишет:
Господа, а нельзя ли загрузить модуль NWindow.dll без запуска DllMain


Потом, при реальной загрузке, уже будет другой адрес.

bolvai пишет:
Я просто раньше не сталкивался с подобным - но эта древняя библиотека 2006 -года, генерирует адреса динамически(и самих функций и адрес загрузки), от запуска к запуску они разные.


При чём тут древность?
На какой системе запускаете это всё?





Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 08 февраля 2016 15:29 · Поправил: kunix
· Личное сообщение · #12

dosprog пишет:
Потом, при реальной загрузке, уже будет другой адрес.

Ну это смотря какой механизм применить. Если сначала As Data File - то при реальной загрузке будет другой адрес.
А если как-то еще?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 15:31 · Поправил: dosprog
· Личное сообщение · #13

kunix пишет:
А если как-то еще?


На Vista+ говнюки ввели механизм ASLR - специально, чтобы воспрепятствовать подобным экспериментам.
- Специально, гады, рандомизируют адреса загрузки модулей.
(если модули имеют таблицу перемещений)





Ранг: 60.6 (постоянный), 87thx
Активность: 0.060
Статус: Участник

Создано: 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



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 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 два раза и вернет два разных хендла.



Ранг: 4.2 (гость)
Активность: 0.020
Статус: Участник

Создано: 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

Сейчас попробую



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2016 19:20 · Поправил: dosprog
· Личное сообщение · #17

bolvai пишет:
под Win8.1 приложение x86 (игра),


Пробуйте под WinXP. А то начинаются какие-то непонятные описания с "генерированием библиотекой динамических адресов"...





Ранг: 4.2 (гость)
Активность: 0.020
Статус: Участник

Создано: 08 февраля 2016 21:49
· Личное сообщение · #18

dosprog пишет:
генерированием библиотекой динамических адресов"...

Это я забыл вам упоминать - основную причину того - почему мне требуется адрес загрузки, в этом приложении(игре) адресное пространство функций генерируется от запуска к запуску с разными значением, было к примеру 9330000, а потом стало 9320000, по этому те функции что мне сгенирировала IDA имеют не совсем верный адрес уже в памяти, т.е была функци по адресу sub_1008F870(В иде),а в итоге она будет в памяти по адресу (sub_1008F870-ImageBase)+Тот самый адрес загрузки - который как раз не постоянный.

В общем посмотрел я на применение
Code:
  1. LdrRegisterDllNotification
и это слишком муторно, много доп кода ради простого ожидания, кто то говорил про внедрение дополнительно потока и цикла внутри него - как это будет выглядеть в коде - может кто пример скинуть пжлста ?



Ранг: 80.6 (постоянный), 194thx
Активность: 0.10.04
Статус: Участник

Создано: 08 февраля 2016 23:22 · Поправил: v00doo
· Личное сообщение · #19

bolvai пишет:
дресное пространство функций генерируется от запуска к запуску с разными значением

Почитал бы уже про и примеры погуглил, уже даже сказали.
https://ru.wikipedia.org/wiki/ASLR
Кстати вариант с ожиданием в потоке, как сказал Hellspawn, кажется тут самым простым.
bolvai пишет:
по этому те функции что мне сгенирировала IDA имеют не совсем верный адрес уже в памяти

Не генерирует она ничего, они идут от базы (ImageBase) все так же, ты описываешь тот же ASLR, хотя могу ошибаться, но скорее всего все именно так, отключить да проверить.
bolvai пишет:
есть более новые версии этой самой игры и та же самая библиотека имеет статичные адреса

Измени тогда хидер либы, отключи ASLR


 eXeL@B —› Вопросы новичков —› Как дождаться загрузки Модуля для получения Адреса загрузки
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати