Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Программирование —› Получение базы ntdll.dll -- как оно работает?
Посл.ответ Сообщение


Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 12:41 · Поправил: =TS=
· Личное сообщение · #1

Есть такой код:

mov eax,fs:[eax].TEB.Peb
mov eax,[eax].PEB.Ldr
mov eax,[eax].PEB_LDR_DATA.InInitializationOrderModuleList.Flink // что в eax!???!
mov eax,[eax+8] // откуда в eax база ntdll.dll ? Какая структура используется?


Если считать что в 3 строке в eax адрес _LDR_DATA_TABLE_ENTRY, то откуда база по смещению 8 ? А по [eax+0x18] также отнюдь не лежит дворд базы библиотеки.

еще один вариант примера выше:

mov eax,fs:[eax].TEB.Peb
mov eax, [eax+PEB.Ldr]
mov esi, [eax+PEB_LDR_DATA.InInitializationOrderModuleList.Flink]
lodsd
mov ebx, [eax+8]


тут вообще не понятно, почему оно работает...

-----
DREAMS CALL US




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

Создано: 17 октября 2007 14:28
· Личное сообщение · #2

=TS= пишет:
mov eax,[eax+8] // откуда в eax база ntdll.dll ? Какая структура используется?


LDR_DATA_TABLE_ENTRY

а из нее DllBase поле

-----
Security through obscurity is just an illusion





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 14:41
· Личное сообщение · #3

typedef struct _LDR_DATA_TABLE_ENTRY
{
LIST_ENTRY InLoadOrderModuleList; /* 00h */
LIST_ENTRY InMemoryOrderModuleList; /* 08h */
LIST_ENTRY InInitializationOrderModuleList; /* 10h */
PVOID DllBase; /* 18h */
PVOID EntryPoint; /* 1Ch */
ULONG SizeOfImage; /* 20h */
UNICODE_STRING FullDllName; /* 24h */
UNICODE_STRING BaseDllName; /* 2Ch */
ULONG Flags; /* 34h */
USHORT LoadCount; /* 38h */
USHORT TlsIndex; /* 3Ah */
union
{
LIST_ENTRY HashLinks; /* 3Ch */
PVOID SectionPointer; /* 3Ch */
};
ULONG CheckSum; /* 44h */
union
{
ULONG TimeDateStamp; /* 48h */
PVOID LoadedImports; /* 48h */
};
PVOID EntryPointActivationContext; /* 4Ch */
PVOID PatchInformation; /* 50h */
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;


-----
DREAMS CALL US





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 14:53 · Поправил: =TS=
· Личное сообщение · #4

Походу каждый из элемента списка указывает на другой аналогичный элемент списка из аналогичной структуры (т.е. структура "нанизана" на элементы списка).

поэтому так как у третьего элемента структуры смещение от начала структуры LDR_DATA_TABLE_ENTRY 10h (2*(4+4)), то смещение поля DllBase от адреса элемента списка в структуре 18h-10h=8h

и пример выглядит так:

mov eax,fs:[eax].TEB.Peb
mov eax,[eax].PEB.Ldr
mov eax,[eax].PEB_LDR_DATA.InInitializationOrderModuleList.Flink // eax== LDR_DATA_TABLE_ENTRY.InInitializationOrderModuleList.Flink
mov eax,[eax-LDR_DATA_TABLE_ENTRY.InInitializationOrderModuleList.Flink]-LDR_DATA_TABLE_ENTRY.DllBase


-----
DREAMS CALL US




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

Создано: 17 октября 2007 14:55 · Поправил: UsAr
· Личное сообщение · #5

после
mov eax,[eax].PEB_LDR_DATA.InInitializationOrderModuleList.Flink
eax указывает на InInitializationOrderModuleList в LDR_MODULE
смещение InInitializationOrderModuleList = 10h, а смещение LDR_MODULE.BaseAddress = 18h
стало быть относительно InInitializationOrderModuleList = 8h, отсюда и
mov eax,[eax+8]
=TS= пишет:
еще один вариант примера выше:

а этот вариант получает базу kernel32, а не ntdll как 2ой модуль по LDR_MODULE
1ый это ntdll, а 0ой сам exe




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 15:01 · Поправил: =TS=
· Личное сообщение · #6

UsAr

разобрался почти одновременно с твоим обьяснением, спасибо

UsAr пишет:
а этот вариант получает базу kernel32, а не ntdll как 2ой модуль по LDR_MODULE
1ый это ntdll, а 0ой сам exe


проверил по третьему варианту -- ntdll.dll (смотрел в ольке)

MOV EAX, DWORD PTR FS:[30]
MOV EAX, DWORD PTR DS:[EAX+C]
MOV ESI, DWORD PTR DS:[EAX+14]
LODS DWORD PTR DS:[ESI]
MOV EBP, DWORD PTR DS:[EAX+10] ; ntdll.7C900000


-----
DREAMS CALL US




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

Создано: 17 октября 2007 15:07 · Поправил: UsAr
· Личное сообщение · #7

скопировал код и скомпилил
все-таки kernel32 =)
update:
чето уже другой код?)



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

Создано: 17 октября 2007 15:15
· Личное сообщение · #8

=TS= пишет:
# Malware KilleR #


этот код юзается в большинстве эксплоитов, как можно при такой-то подписи задавать детские вопросы =)




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 15:19 · Поправил: =TS=
· Личное сообщение · #9

__

Тема создавалась, потому что понятно ЧТО там лежит, но не понятно было В ТОЧНОСТИ - ПОЧЕМУ...

UsAr
да, все правильно, первый и третий вариант дает ntdll.dll, второй - kernel32.dll

-----
DREAMS CALL US




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

Создано: 17 октября 2007 15:36 · Поправил: UsAr
· Личное сообщение · #10

...




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 17 октября 2007 15:43
· Личное сообщение · #11

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

-----
DREAMS CALL US



 eXeL@B —› Программирование —› Получение базы ntdll.dll -- как оно работает?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати