Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Информация о dll загруженный в процесс
Посл.ответ Сообщение


Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 18:16
· Личное сообщение · #1

В общем получаю такую инфу через RtlQueryProcessDebugInformation...
Всё бы хорошо, но как однозначно определить, что либа загружена не через LoadLibrary программой, потому что флаг в структуре может "врать", тоесть либа например ntdll.dll загружена всем процесса и ясно, что не через LoadLibrary... А флаг говорит об обратном... Но у неё все свойства dll подгруженой автоматически, тоесть её нельязя никак выгрузить, у неё LoadCount равен 65535...
Вывод напрашиваеться сам... проверять сколько загрузок имеет либа, если 65535, значит она не подгружена через LoadLibrary... Но вот опять! Если мы специально возьмём либу (любую) подгрузим её функцией LoadLibrary 65535 раз, то она ничем и не будет по флагам и количеству загрузок отличаться например от той же ntdll.dll...

procedure Log(LogString:String);
var
f:TextFile;
begin
AssignFile(f,'log.txt');
if not FileExists('log.txt') then
rewrite(f)
else
append(f);
writeln(f,LogString);
CloseFile(f);
end;
...
type
mods=array of DEBUG_MODULE_INFORMATION;
var
DebugInfo:PDEBUG_BUFFER;
...
DebugInfo:=RtlCreateQueryDebugBuffer(0,true);
if DebugInfo=nil then
exit;
RtlQueryProcessDebugInformation(PID,PDI_MODULES,DebugInfo);
if DebugInfo.ModuleInformation=nil then
exit;
count:=Cardinal(DebugInfo.ModuleInformation^);
Cardinal(DebugInfo.ModuleInformation):=Cardinal(DebugInfo.ModuleInform ation)+sizeof(Cardinal);
for k := 0 to count-1 do
begin
// log('Reserved[0] '+inttohex(mods(DebugInfo.ModuleInformation)[k].Reserved[0],8));
// log('Reserved[1] '+inttohex(mods(DebugInfo.ModuleInformation)[k].Reserved[1],8));
// log('Base '+inttohex(mods(DebugInfo.ModuleInformation)[k].Base,8));
// log('Size '+inttohex(mods(DebugInfo.ModuleInformation)[k].Size,8));
log('Index '+inttohex(mods(DebugInfo.ModuleInformation)[k].Index,4));
log('Unknown '+inttohex(mods(DebugInfo.ModuleInformation)[k].Unknown,4));
log('LoadCount '+inttohex(mods(DebugInfo.ModuleInformation)[k].LoadCount,4));
log('ModuleNameOffset '+inttohex(mods(DebugInfo.ModuleInformation)[k].ModuleNameOffset,4));
log('ImageName '+string(mods(DebugInfo.ModuleInformation)[k].ImageName));
log(' ');
log('Flags:');
log('LDRP_STATIC_LINK '+booltostr(boolean(LDRP_STATIC_LINK and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_IMAGE_DLL '+booltostr(boolean(LDRP_IMAGE_DLL and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_LOAD_IN_PROGRESS '+booltostr(boolean(LDRP_LOAD_IN_PROGRESS and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_UNLOAD_IN_PROGRESS '+booltostr(boolean(LDRP_UNLOAD_IN_PROGRESS and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_ENTRY_PROCESSED '+booltostr(boolean(LDRP_ENTRY_PROCESSED and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_ENTRY_INSERTED '+booltostr(boolean(LDRP_ENTRY_INSERTED and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_CURRENT_LOAD '+booltostr(boolean(LDRP_CURRENT_LOAD and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_FAILED_BUILTIN_LOAD '+booltostr(boolean(LDRP_FAILED_BUILTIN_LOAD and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_DONT_CALL_FOR_THREADS '+booltostr(boolean(LDRP_DONT_CALL_FOR_THREADS and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_PROCESS_ATTACH_CALLED '+booltostr(boolean(LDRP_PROCESS_ATTACH_CALLED and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_DEBUG_SYMBOLS_LOADED '+booltostr(boolean(LDRP_DEBUG_SYMBOLS_LOADED and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_IMAGE_NOT_AT_BASE '+booltostr(boolean(LDRP_IMAGE_NOT_AT_BASE and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log('LDRP_WX86_IGNORE_MACHINETYPE '+booltostr(boolean(LDRP_WX86_IGNORE_MACHINETYPE and mods(DebugInfo.ModuleInformation)[k].Flags),true));
log(' ');
log(' ');
end;

LDRP_STATIC_LINK как раз и отвечает за такую инфу... (ИМХО)



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

Создано: 24 марта 2008 19:07 · Поправил: Kiev78
· Личное сообщение · #2

---




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 19:57 · Поправил: multiarc
· Личное сообщение · #3

А как же ntdll.dll? ведь её нету в таблице импорта...
или например msvcr.dll... и вообще таких либ много...



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

Создано: 24 марта 2008 20:51 · Поправил: Kiev78
· Личное сообщение · #4

---



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

Создано: 24 марта 2008 21:22 · Поправил: drin
· Личное сообщение · #5


ntdll.dll - в твоём импорте её может и нет, но если ты импортируешь kernel32.dll, то он в свою очередь импортирует именно ntdll.dll (можешь глянуть его директорию импорта).


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



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

Создано: 24 марта 2008 21:26 · Поправил: drin
· Личное сообщение · #6

multiarc
где-то в ОЕП поставь хук на LoadLibraryW и сохраняй список загружаемых через нее модулей, а потом по завершению загрузки сравнивай ...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 21:29
· Личное сообщение · #7

Kiev78 пишет:
msvcr.dll - ты хочешь сказать, что она отсутствует в импорте, не загружается при помощи ЛоадЛайбрари и при этом стабильно присутствует в адресном пространстве процесса (типа появляется из ниоткуда)???

ну например apphelp.dll так и существует ))
msvcr.dll не во все процессы грузиться...
а на счёт kernel32.dll то флаг LDRP_STATIC_LINK вообще не установлен, как буд-то я её руками грузил...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 21:31
· Личное сообщение · #8

drin пишет:
где-то в ОЕП поставь хук на LoadLibraryW и сохраняй список загружаемых через нее модулей, а потом по завершению загрузки сравнивай ...

А если процесс был запущен задолго до того как мне нужна такая инфа???




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 21:35
· Личное сообщение · #9

на OEP загрузчик уже загрузит то что ему надо... Но вот apphelp.dll там ещё нету...
хотя вот она и kernel32.dll и ntdll.dll все статически подгружаються, тоесть выгружать их нельзя из под юзер мода...




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 24 марта 2008 23:28
· Личное сообщение · #10

Есть идея пытаться выгрузить такие либы у которых 65535 загрузок, если значение уменьшиться, значит она динамическая...



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 25 марта 2008 10:24
· Личное сообщение · #11

ntdll.dll - это отдельная тема, имидж мапится в АП процесса при его создании до всех остальных, в списки добавляется позже.

Тебе скорее всего нужно LdrpHashTable (LdrpCheckForLoadedDll).

Kiev78 пишет:
А если посмотреть в директорию импорта исполняемого файла?

То надо будет рекурсивно смотреть еще и импорты импортируемых модулей.

drin пишет:
импорт вообще может быть пуст, но базовые модули винды загрузчик все равно приаттачит..

Размечтался.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 28 марта 2008 21:17
· Личное сообщение · #12

А всё таки что тогда на самом деле значят флаги LDRP_...?


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


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