![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хендл KERNEL32 [D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
-SeM- © (2004-11-23 12:17:00)Как узнать хендл (адрес загрузки) kernel32.dll без использования API?
Можно ли со 100% уверенностью ожидать ее загрузки по $BFF60000? Или могут быть иные случаи?
-SeM- (2004-11-24 16:52:00) [21]Leonid Troyanovsky (24.11.04 10:58) [20]
> Так что, можешь смело пользовать GetModuleHandle
Да не могу. Он же сидит в кернел, адрес которого и хочу определить. Нет у меня ни одного импорта (и ExitProcess тоже).
Leonid Troyanovsky (2004-11-24 10:58:00) [22]
> -SeM- (23.11.04 17:33) [15]
> Хм... Хендл которой все равно нужно как-то узнать. Ведь
> адрес ее загрузки, наверное, тоже не фиксирован...
http://groups.google.com/groups?selm=emFadfYyDHA.2720%40TK2MSFTNGP09.phx.gbl
Как, собс-но, и kernel32.dll, о чем некогда рассказывал Slava Usov.
Так что, можешь смело пользовать GetModuleHandle,
во всяком случае, в Win32.
--
С уважением, LVT.
Digitman (2004-11-24 08:26:00) [23]
> -SeM- (23.11.04 17:53) [17]
kernel32 ведь как правило всегда загружается одним из первых модулей, поэтому и адрес его загрузки как правило равен предпочтительному адресу, фигурирующему в PE-заголовке
n0name (2004-11-23 19:28:00) [24]http://delphimaster.ru/cgi-bin/forum.pl?id=1100098886&n=5
-SeM- (2004-11-23 17:53:00) [25]Игорь Шевченко © (23.11.04 17:43) [16]
Но как сказали мне выше адрес загрузки кернел
> зависит и от конкретной ОС-платформы и от версии kernel32
а хотелось попроще (к примеру [8])
Игорь Шевченко (2004-11-23 17:43:00) [26]-SeM- (23.11.04 17:33) [15]
Адрес загрузки NTDLL.DLL можно узнать, проанализировав заголовок PE-файла на диске. Эта библиотека всегда грузится по одному и тому же адресу.
Но я не понимаю, какой смысл - под NT NTDLL.DLL у тебя всегда есть, Kernel32.dll у тебя всегда есть.
-SeM- (2004-11-23 17:33:00) [27]Игорь Шевченко © (23.11.04 17:24) [14]
Хм... Хендл которой все равно нужно как-то узнать. Ведь адрес ее загрузки, наверное, тоже не фиксирован...
Ладно, спасибо всем. Буду продолжать с [4]
Игорь Шевченко (2004-11-23 17:24:00) [28]-SeM- (23.11.04 17:07) [10]
За 9x не скажу ничего. За NT могу сказать - NTDLL.DLL экспортирует функцию LdrGetDllHandle, которая выполняется те же самые действия, что и GetModuleHandle. Под NT в адресное пространство любого приложения загружена NTDLL.DLL
-SeM- (2004-11-23 17:22:00) [29]Digitman © (23.11.04 17:15) [11]
Да я не отказываюсь :) Спасибо. Просто а вдруг еще есть варианты
-SeM- (2004-11-23 17:21:00) [30]Digitman © (23.11.04 17:15) [11]
Да я не отказываюсь :) Спасибо. Просто а вдруг еще есть варианты
Digitman (2004-11-23 17:15:00) [31]
> -SeM- (23.11.04 17:07) [10]
в Win9x тоже есть PEB .. ищи инфу ...
а по поводу использования для этой цели PEB на НТ-платформе тебе уже сказано в [4]
-SeM- (2004-11-23 17:07:00) [32]Игорь Шевченко © (23.11.04 16:56)
Игорь, извините, но что Вы можете сказать по сабжу. Может есть другие варианты определения хендла кернела для 9х/NT?
Игорь Шевченко (2004-11-23 16:56:00) [33]
> При старте ехе указатель стека содержит адрес из кернел
> (оставляет наверное загрузчик). Всегда ли это так
Под Win9x скорее всего, всегда. Под NT адресв стеке, скорее всего будет в NTDLL.DLL. Это не загрузчик, а функция CreateThread.
-SeM- (2004-11-23 15:13:00) [34]Digitman © (23.11.04 14:35) [7]
Ок. Спасибо. Буду пробовать.
А для 9х какие-нибудь решения есть?
Тут еще мысль возникла. При старте ехе указатель стека содержит адрес из кернел (оставляет наверное загрузчик). Всегда ли это так (другого увидеть мне не удалось), можно ли его как-то использовать?
Digitman (2004-11-23 14:35:00) [35]смело переделай скелет, удалив из него сабж.
на цель он никак не влияет
-SeM- (2004-11-23 13:53:00) [36]Digitman © (23.11.04 13:36) [4]
> как видишь, никаких API-вызовов нет и в помине
> if hModule <> THandle(lpModule) then
> hModule := GetModuleHandle(lpModule);
А GetModuleHandle что-то свое или из кернел?
clickmaker (2004-11-23 13:38:00) [37]
> [3] -SeM- (23.11.04 13:01)
> Digitman © (23.11.04 12:27)
>
> Всегда ли кернел имеет самый большой адрес загрузки?
нет
Digitman (2004-11-23 13:36:00) [38]
> -SeM-
вот "скелет" решения задачи :
TModuleInfo = packed record
DllBase : Pointer;
EntryPoint : Pointer;
SizeOfImage : Cardinal;
FullDllName : TUNICODE_STRING;
BaseDllName : TUNICODE_STRING;
Flags : Cardinal;
LoadCount : Word;
TlsIndex : Word;
HashLinks : TLIST_ENTRY;
SectionPointer : Pointer;
CheckSum : Cardinal;
TimeDateStamp : Cardinal;
LoadedImports : Pointer;
EntryPointActivationContext : Pointer;
end;
PModuleInfo = ^TModuleInfo;
function FindModuleInfo(hModule: THandle): PModuleInfo;
var
Peb: PPeb;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
begin
Result := nil;
if hModule = 0 then Exit;
Peb := GetCurrentPeb;
LockLoader(Peb);
try
pLdrData := Peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
Result := @pInLoadModuleEntry.ModuleInfoData;
if Result^.DllBase = Pointer(hModule) then
Exit;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
Result := nil;
finally
UnLockLoader(Peb);
end;
end;
function GetModuleInfo(lpModule: PChar; out ModuleInfo: TModuleInfo): Boolean;
var
peb: PPeb;
hModule: THandle;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
pModuleNfo: PModuleInfo;
begin
Result := False;
if not Assigned(lpModule) then Exit;
peb := GetCurrentPeb;
LockLoader(Peb);
try
hModule := FindHInstance(lpModule);
if hModule = 0 then Exit;
if hModule <> THandle(lpModule) then
hModule := GetModuleHandle(lpModule);
if hModule = 0 then Exit;
pLdrData := peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
pModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
if pModuleNfo^.DllBase = Pointer(hModule) then
begin
if Assigned(@ModuleInfo) then
ModuleInfo := pModuleNfo^;
Result := True;
Break;
end;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
finally
UnLockLoader(Peb);
end;
end;
как видишь, никаких API-вызовов нет и в помине, однако база требуемого модуля, если он присутствует в тек.АП, замечательно определяется
не приведенные здесь описания используемых структур можно поиметь, например, в книге Свена Шрайбера "Недок. возможности Винтукея"
приведенный "скелет" касаем только НТ-линейки
-SeM- (2004-11-23 13:01:00) [39]Digitman © (23.11.04 12:27)
Всегда ли кернел имеет самый большой адрес загрузки? Если да, с какого адреса производить поиск (вниз кратно $00010000) сигнатуры РЕ?
-SeM- (2004-11-23 12:49:00) [40]Digitman © (23.11.04 12:27) [1]
> может, не ту траву куришь ..
Да другой просто нет :)
Прога без использования импорта может использовать API. Т.е. предложеный тобой вариант - наверное не подходит, т.к. нет подгруженых модулей. Как быть?