Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Вклиниться" в адр. пространство библиотеки до выполнения Dllmain [Win2k]


Страницы:   1 2 3 4

BiN ©   (2004-03-11 12:38:00) 

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

Надеюсь, вы не подумаете, что здесь ведется разработка трояна - скорее наоборот.


BiN   (2004-03-11 14:16:00) [61]

Digitman ©   (11.03.04 13:56) [10]

Прошу прощения, между  Result:=.. и AddressOfEntryPoint(Result{?} ...
следует вставить

@AddressOfEntryPoint:=GetAddressOfEntryPoint(Result);
где GetAddressOfEntryPoint реализована как


function MakePtr(base:Dword;Offset:DWORD):Pointer;
begin
 Result:=Pointer(Base+Offset);
end;

function GetNtHeader(hLocalHinst:HMODULE):PImageNtHeaders;
var
 pDosHeader:PImageDosHeader;
begin
 pDosHeader:=PImageDosHeader(hLocalHinst);
 if IsBadReadPtr(Pointer(hLocalHinst),sizeof(PImageNtHeaders)) or (pDosHeader.e_magic<>IMAGE_DOS_SIGNATURE)
 then  Result:=nil
 else Result:=PImageNtHeaders(MakePtr(DWord(pDOSHeader),DWord(pDOSHeader._lfanew)));
end;

function GetAddressOfEntryPoint(hLib:HMODULE):Pointer;
var
 P:PImageNtHeaders;
begin
 P:=GetNtHeader(Result);
 if not Assigned(P)
 then Result:=nil
 else Result:=Pointer(P.OptionalHeader.AddressOfEntryPoint);
end;



Но я все же думаю, что таким способом нельзя корректно загрузить Dll. Ведь, как я уже говорил, LoadLibraryEx в случае с DONT_RESOLVE_DLL_REFERENCES не подружает дополнительно используемые модули.


Digitman   (2004-03-11 13:56:00) [62]


> AddressOfEntryPoint


Это что ? Твоя собственная ф-ция ? как она реализована ?


BiN   (2004-03-11 13:22:00) [63]


в перехватчике - сначала [2], а потом - все остальное ...


вот функция перехватчика

var
 AddressOfEntryPoint:function (
 hinstDLL:HINSTANCE;  // handle to the DLL module
 fdwReason:DWORD;     // reason for calling function
 lpvReserved:Pointer):Bool; stdcall; будем считать, что адрес уже известен.

..
begin
 Result:=LoadLibraryEx('custom.dll',0 DONT_RESOLVE_DLL_REFERENCES);
 
 AddressOfEntryPoint(Result{?}, DLL_PROCESS_ATTACH, nil);
end;

Результат, к сожалению, -  AV при вызове какой-либо функции из библиотеки (адрес функции конечно проверяется на nil)


Digitman   (2004-03-11 13:05:00) [64]


> надо ее сначала загрузить, а тут как раз и просиходит вызов
> точки входа


опять же - перехват LoadLibrary[Ex], в перехватчике - сначала [2], а потом - все остальное ... DLLEntryPoint в этом случае, по всей видимости. в своем перехватчике придется вызывать явно


BiN   (2004-03-11 13:02:00) [65]

в дополнение  кпосту [3]: Меня настораживает фраза из SDK
Also, the system does not load additional executable modules that are referenced by the specified module

>>Digitman ©   (11.03.04 12:59) [6]
Да именно так я и делаю. Но ведь чтобы получить доступ к адресному пространству библиотеки, надо ее сначала загрузить, а тут как раз и просиходит вызов точки входа


Digitman   (2004-03-11 12:59:00) [66]


> BiN ©   (11.03.04 12:55) [3]


в динамике, я думаю, можно перехватить вызов kernel32.LoadLibrary[Ex], по получению управления выполнить правку нужных таблиц, и после этого вернуть управление вызывающему коду

в статике, наверно, посложней будет


BiN   (2004-03-11 12:57:00) [67]

Digitman ©   (11.03.04 12:55) [4]

Спасибо за абсолютно правильную формулировку.


Digitman   (2004-03-11 12:55:00) [68]


> Игорь Шевченко ©   (11.03.04 12:50) [2]


здесь, вероятно, имеется ввиду, что некий кодовый поток некоего (не обязательно текущего) процесса в статике или динамике грузит библ-ку, и требуется получить управление после загрузки, но до вызова системой DLLEntryPoint(DLL_PROCESS_ATTACH)


BiN   (2004-03-11 12:55:00) [69]

что значит "вклиниться"

Необходимо осущесвить правку таблицы импорта в библиотеке до выполнения Dllmain. Насколько безопасно на ваш взгляд будет решение Игоря при последующей загрузке Dllmain вручную.


Игорь Шевченко   (2004-03-11 12:50:00) [70]

А на какой предмет вклиниться, можно поподробнее ?

Можно ведь использовать LoadLibraryEx с флажком DONT_RESOLVE_DLL_REFERENCES, тогда DllMain вызываться не будет...


Digitman   (2004-03-11 12:47:00) [71]

что значит "вклиниться" ?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо