![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Вклиниться" в адр. пространство библиотеки до выполнения Dllmain [Win2k]
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]что значит "вклиниться" ?