Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.11;
Скачать: CL | DM;

Вниз

Сканирование списков модулей, загруженных в АП тек.процесса   Найти похожие ветки 

 
Ученик ©   (2002-09-06 09:17) [40]

>Digitman © (06.09.02 09:09)
Когда я влез в эту ветку, она честно говоря не пересекалась, потом выяснилось, что они пересекается на реализации GetModuleFileNameEx, там идет сканирование модулей загруженных в процесс и сравнение HInstance с TLDR_DATA_TABLE_ENTRY.DllBase


 
Digitman ©   (2002-09-06 09:40) [41]

>Ученик

Все ясно. Ну, насколько я понял, ты уже определился на сей момент)



 
Игорь Шевченко ©   (2002-09-06 09:53) [42]

Ученик © (06.09.02 08:54)

Откуда информация по дополнениям/исправлениям ? Ссылочку не подскажете ?


 
Ученик ©   (2002-09-06 10:10) [43]

>Игорь Шевченко © (06.09.02 09:53)
Исправления из разных мест, поиск по PEB_LDR_DATA, добавление, (возможно структура не полная) - маленькое исследование для текущего процесса.


 
Digitman ©   (2002-09-06 10:37) [44]

>Ученик

Наверно таки ты ошибаешься - не может такого быть, чтобы элементы TModuleEntry (включающие линк-заголовок), фигурирующие в трех разных списках, имели различные (в части линк-заголовков) структуры.

Проверь еще раз :

_PEB_LDR_DATA = packed record
Length : Cardinal;
Initialized : LongBool;
SsHandle : THandle;
InLoadOrderModuleList : PListEntry; //не сама линк-структура, а указатель на нее
InMemoryOrderModuleList : PListEntry; //тоже самое
InInitializationOrderModuleList: PListEntry; //тоже самое
end;
TPebLdrData = _PEB_LDR_DATA;

TModuleEntry = packed record
//Один и тот же TModuleEntry включен в 3 различные двунаправленные списки с помощью следующих 3-х связующих структур :


InLoadOrderLinks : TLIST_ENTRY; // данный элемент описывает модуль в порядке загрузки модулей в ВАП процесса
InMemoryOrderLinks : TLIST_ENTRY; // в порядке возрастания адресов загруженных модулей размещения в ВАП процесса
InInitializationOrderLinks : TLIST_ENTRY; // в порядке инициализации модулей

DllBase : Ptr32;
EntryPoint : Ptr32;
SizeOfImage: Ptr32;
ImageName : TUNICODE_STRING;
end;
PModuleEntry = ^TModuleEntry;


 
Ученик ©   (2002-09-06 11:14) [45]

>Digitman © (06.09.02 10:37)
Попробуйте пройтись по InInitializationOrderModuleList с использованием PPEB_LDR_DATA


 
Digitman ©   (2002-09-06 11:45) [46]

>Ученик

Тут вот что получается :

Для каждого непоследнего элемента InInitializationOrderModuleList - списка
его ListEntry.FLink указывает вот сюда :

TLDR_DATA_TABLE_ENTRY = packed record
InLoadOrderLinks : TLIST_ENTRY; //оно есть ! никуда не делось !
ListEntry.FLink -->>> InMemoryOrderLinks : TLIST_ENTRY;
InInitializationOrderLinks : TLIST_ENTRY;
DllBase : Ptr32;
EntryPoint : Ptr32;
SizeOfImage : Uint4B;
FullDllName : TUNICODE_STRING;
BaseDllName : TUNICODE_STRING;
.....
end;



 
Ученик ©   (2002-09-06 11:55) [47]

>Digitman © (06.09.02 11:45)
Тут, наверно, можно долго спорить, попробуйте пройтись по всем трем спискам с использованием одной структуры элементов (TLDR_DATA_TABLE_ENTRY), так как если использованы PListEntry, то когда берется PEB_LDR_DATA.InInitializationOrderModuleList, реально мы берем PEB_LDR_DATA.InMemoryOrderModuleList.FLink


 
Игорь Шевченко ©   (2002-09-06 12:07) [48]

Ученик © (06.09.02 11:55)

Кроме загрузчика на этот вопрос вряд ли кто-то сможет достоверно ответить. Я могу сказать, что экперимент по обходу списка
InMemoryOrderModuleList со ссылками TLDR_DATA_TABLE_ENTRY.InMemoryOrderLinks закончился Access Violation. Из чего я сделал вывод, что структуры там могут быть другие.

С уважением,


 
Ученик ©   (2002-09-06 12:13) [49]

http://www.faqsen.de/delphi/faq.jsp?ID=505448494850494849545250
http://person.okey.net/~webcrazy/module.htm
По всем трем спискам при использовании TListEntry в _PEB_LDR_DATA гуляем без проблем


 
Игорь Шевченко ©   (2002-09-06 12:40) [50]

Ученик © (06.09.02 12:13)

Если внимательно проанализировать последний пример( http://person.okey.net/~webcrazy/module.htm), то видно, что смещения там совсем другие, чем в TLDR_DATA_TABLE_ENTRY


> По всем трем спискам при использовании TListEntry в _PEB_LDR_DATA
> гуляем без проблем


Если у вас есть код, который это делает, не трудно в форум положить ?

С уважением,


 
Ученик ©   (2002-09-06 12:45) [51]

Структуры обрезал (пока не уверен, в дальнейших полях)

TLDR_DATA_TABLE_ENTRY_1 = packed record
InLoadOrderModuleList : TListEntry;
InMemoryOrderModuleList : TListEntry;
InInitializationOrderModuleList: TListEntry;
DllBase : DWord;
EntryPoint : DWord;
SizeOfImage : DWord;
FullDllName : TNtUnicodeString;
BaseDllName : TNtUnicodeString;
Flags : DWord;
end;
PLDR_DATA_TABLE_ENTRY_1 = ^TLDR_DATA_TABLE_ENTRY_1;

TLDR_DATA_TABLE_ENTRY_2 = packed record
ListEntry : TListEntry;
dwUnknown1 : DWord;
dwUnknown2 : DWord;
DllBase : DWord;
EntryPoint : DWord;
SizeOfImage : DWord;
FullDllName : TNtUnicodeString;
BaseDllName : TNtUnicodeString;
Flags : DWord;
end;
PLDR_DATA_TABLE_ENTRY_2 = ^TLDR_DATA_TABLE_ENTRY_2;

TLDR_DATA_TABLE_ENTRY_3 = packed record
ListEntry : TListEntry;
DllBase : DWord;
EntryPoint : DWord;
SizeOfImage: DWord;
ImageName : TNtUnicodeString;
BaseName : TNtUnicodeString;
Flags : DWord;
end;
PLDR_DATA_TABLE_ENTRY_3 = ^TLDR_DATA_TABLE_ENTRY_3;


procedure TForm1.BuildModulesList1;
var
pModule : PLDR_DATA_TABLE_ENTRY_1;
LdrData : PPebLdrData;
begin
ListView.Clear;
LdrData := GetCurrentPeb.Ldr;
pModule := PLDR_DATA_TABLE_ENTRY_1(LdrData.InLoadOrderModuleList.FLink);
repeat
DisplayModule1(pModule);
pModule := PLDR_DATA_TABLE_ENTRY_1(pModule.InLoadOrderModuleList.Flink);
until pModule = @LdrData.InLoadOrderModuleList;
end;

procedure TForm1.BuildModulesList2;
var
pModule : PLDR_DATA_TABLE_ENTRY_2;
LdrData : PPebLdrData;
begin
ListView.Clear;
LdrData := GetCurrentPeb.Ldr;
pModule := PLDR_DATA_TABLE_ENTRY_2(LdrData.InMemoryOrderModuleList.FLink);
repeat
DisplayModule2(pModule);
pModule := PLDR_DATA_TABLE_ENTRY_2(pModule.ListEntry.Flink);
until pModule = @LdrData.InMemoryOrderModuleList;
end;

procedure TForm1.BuildModulesList3;
var
pModule : PLDR_DATA_TABLE_ENTRY_3;
LdrData : PPebLdrData;
begin
ListView.Clear;
LdrData := GetCurrentPeb.Ldr;
pModule := PLDR_DATA_TABLE_ENTRY_3(LdrData.InInitializationOrderModuleList.FLink);
repeat
DisplayModule3(pModule);
pModule := PLDR_DATA_TABLE_ENTRY_3(pModule.ListEntry.Flink);
until pModule = @LdrData.InInitializationOrderModuleList;
end;


 
Игорь Шевченко ©   (2002-09-06 13:07) [52]

Ученик © (06.09.02 12:45)

Спасибо, теперь все ясно. Это одна и та же структура (TLDR_DATA_TABLE_ENTRY) просто из разных списков она видна с разными смещениями, так, чтобы нужный ListEntry был всегда в начале.
То есть, в InMemoryOrderModuleList находятся адреса InMemoryOrderLinks и так далее.


 
Digitman ©   (2002-09-06 13:10) [53]

>Игорь Шевченко (06.09.02 13:07)

Вот и я о том же)


 
Ученик ©   (2002-09-06 13:20) [54]

Одна и та же структура в памяти, но при обращении они все-таки разные


 
Digitman ©   (2002-09-06 13:50) [55]

>Ученик

Просто дополнительная декларация нужна. С учетом смещения на пропускаемый линк. Ее и использовать для такого случая


 
Ученик ©   (2002-09-06 13:55) [56]

>Digitman © (06.09.02 13:50)
Это как "С учетом смещения на пропускаемый линк" ?


 
Digitman ©   (2002-09-06 14:07) [57]

Ну вот же - Digitman © (06.09.02 11:45)



 
Ученик ©   (2002-09-06 14:16) [58]

>Digitman © (06.09.02 14:07)
Не понял, как будет выглядеть проход по второму или третьему списку ?


 
Игорь Шевченко ©   (2002-09-06 14:50) [59]

Ученик © (06.09.02 14:16)

Для того, чтобы получить адрес PLDR_DATA_TABLE_ENTRY из указателя FLink списка, отличающегося от InLoadOrderModuleList, нужно от этого указателя отнять смещение соответствующей структуры TLIST_ENTRY относительно начала TLDR_DATA_TABLE_ENTRY.


 
Ученик ©   (2002-09-06 15:01) [60]

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


 
Digitman ©   (2002-09-06 16:45) [61]

>Ученик

А кто ж запрещает ? Вкладывай)


 
Ученик ©   (2002-09-09 09:36) [62]

Изменения в TLDR_DATA_TABLE_ENTRY

typedef struct _LDR_MODULE
{
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList; // not used
LIST_ENTRY InInitializationOrderModuleList; // not used
PVOID BaseAddress;
ULONG EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
HANDLE SectionHandle;
ULONG CheckSum;
ULONG TimeDateStamp;
#ifdef KDBG
IMAGE_SYMBOL_INFO SymbolInfo;
#endif /* KDBG */
} LDR_MODULE, *PLDR_MODULE;

http://prdownloads.sourceforge.net/reactos/0020_source.zip?download



Страницы: 1 2 вся ветка

Текущий архив: 2002.11.11;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.021 c
8-34130
Asteroid
2002-07-15 17:39
2002.11.11
Бесконечный ландшафт


1-33972
beginner
2002-11-01 12:08
2002.11.11
Редактор математического текста


3-33895
Shrek
2002-10-22 18:55
2002.11.11
AutoCalc


14-34202
Rouse_
2002-10-22 12:04
2002.11.11
Скиньте плз на мыло msdn.hxa от MSDN за январь 2002


4-34305
AntiShellM16
2002-10-02 13:20
2002.11.11
Крутое окно :)