Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[nt] process_environment_block 07.11.02 23:03
Автор: beetle <beetle> Статус: Member
|
структура имеет следующий вид:
typedef struct _PROCESS_ENVIRONMENT_BLOCK
{
DWORD AllocationSize;
DWORD unknown2;
void *pImage;
PVOID handles;
PPROCESS_PARAMETRS pi;
PPROCESS_PARAMETRS
HANDLE hHeap;
DWORD lock;
void *ack_lock;
void *rel_lock;
DWORD *lock_cnt;
void *user_cb;
HANDLE *heaps;
//CRITICAL_SECTION *cs;
void *cs;
DWORD ver;
} PROCESS_ENVIRONMENT_BLOCK, *PPROCESS_ENVIRONMENT_BLOCK;
параметр handles указывает на список dll-модулей(описатель,имя,полный путь и т.д.), загруженных процессом.
вопрос:какой формат имеет элемент этого списка?
никак не могу под отладчиком определить =((
|
|
А где ты такой PEB нарыл? 15.11.02 18:26
Автор: amirul <Serge> Статус: The Elderman
|
> структура имеет следующий вид: > typedef struct _PROCESS_ENVIRONMENT_BLOCK > { [skipped]
> } PROCESS_ENVIRONMENT_BLOCK, *PPROCESS_ENVIRONMENT_BLOCK; Собственно subj
По моим данным PEB выглядит так:
typedef struct _PEB
{
UCHAR InheritedAddressSpace; // 00h
UCHAR ReadImageFileExecOptions; // 01h
UCHAR BeingDebugged; // 02h
UCHAR Spare; // 03h
PVOID Mutant; // 04h
PVOID ImageBaseAddress; // 08h
PPEB_LDR_DATA Ldr; // 0Ch
PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h
PVOID SubSystemData; // 14h
PVOID ProcessHeap; // 18h
PVOID FastPebLock; // 1Ch
PPEBLOCKROUTINE FastPebLockRoutine; // 20h
PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h
ULONG EnvironmentUpdateCount; // 28h
PVOID* KernelCallbackTable; // 2Ch
PVOID EventLogSection; // 30h
PVOID EventLog; // 34h
PPEB_FREE_BLOCK FreeList; // 38h
ULONG TlsExpansionCounter; // 3Ch
PVOID TlsBitmap; // 40h
ULONG TlsBitmapBits[0x2]; // 44h
PVOID ReadOnlySharedMemoryBase; // 4Ch
PVOID ReadOnlySharedMemoryHeap; // 50h
PVOID* ReadOnlyStaticServerData; // 54h
PVOID AnsiCodePageData; // 58h
PVOID OemCodePageData; // 5Ch
PVOID UnicodeCaseTableData; // 60h
ULONG NumberOfProcessors; // 64h
ULONG NtGlobalFlag; // 68h
UCHAR Spare2[0x4]; // 6Ch
LARGE_INTEGER CriticalSectionTimeout; // 70h
ULONG HeapSegmentReserve; // 78h
ULONG HeapSegmentCommit; // 7Ch
ULONG HeapDeCommitTotalFreeThreshold; // 80h
ULONG HeapDeCommitFreeBlockThreshold; // 84h
ULONG NumberOfHeaps; // 88h
ULONG MaximumNumberOfHeaps; // 8Ch
PVOID** ProcessHeaps; // 90h
PVOID GdiSharedHandleTable; // 94h
PVOID ProcessStarterHelper; // 98h
PVOID GdiDCAttributeList; // 9Ch
PVOID LoaderLock; // A0h
ULONG OSMajorVersion; // A4h
ULONG OSMinorVersion; // A8h
ULONG OSBuildNumber; // ACh
ULONG OSPlatformId; // B0h
ULONG ImageSubSystem; // B4h
ULONG ImageSubSystemMajorVersion; // B8h
ULONG ImageSubSystemMinorVersion; // C0h
ULONG GdiHandleBuffer[0x22]; // C4h
} PEB, *PPEB;
---
Собственно и TEB до кучи:
// +++
// User-Mode Thread Environment Block (UTEB)
// Selector 0x3B: DPL=3, Base=0x7FFDE00 (1st thread), Lim=0x00000FFF
// Base is updated at every thread switch.
// Loaded into FS in User Mode
// ---
typedef struct _TEB
{
NT_TIB Tib; // 00h
PVOID EnvironmentPointer; // 1Ch
CLIENT_ID Cid; // 20h
PVOID ActiveRpcInfo; // 28h
PVOID ThreadLocalStoragePointer; // 2Ch
PPEB Peb; // 30h
ULONG LastErrorValue; // 34h
ULONG CountOfOwnedCriticalSections; // 38h
PVOID CsrClientThread; // 3Ch
struct _W32THREAD* Win32ThreadInfo; // 40h
ULONG Win32ClientInfo[0x1F]; // 44h
PVOID WOW32Reserved; // C0h
ULONG CurrentLocale; // C4h
ULONG FpSoftwareStatusRegister; // C8h
PVOID SystemReserved1[0x36]; // CCh
PVOID Spare1; // 1A4h
LONG ExceptionCode; // 1A8h
ULONG SpareBytes1[0x28]; // 1ACh
PVOID SystemReserved2[0xA]; // 1D4h
// GDI_TEB_BATCH GdiTebBatch; // 1FCh
ULONG gdiRgn; // 6DCh
ULONG gdiPen; // 6E0h
ULONG gdiBrush; // 6E4h
CLIENT_ID RealClientId; // 6E8h
PVOID GdiCachedProcessHandle; // 6F0h
ULONG GdiClientPID; // 6F4h
ULONG GdiClientTID; // 6F8h
PVOID GdiThreadLocaleInfo; // 6FCh
PVOID UserReserved[5]; // 700h
PVOID glDispatchTable[0x118]; // 714h
ULONG glReserved1[0x1A]; // B74h
PVOID glReserved2; // BDCh
PVOID glSectionInfo; // BE0h
PVOID glSection; // BE4h
PVOID glTable; // BE8h
PVOID glCurrentRC; // BECh
PVOID glContext; // BF0h
NTSTATUS LastStatusValue; // BF4h
UNICODE_STRING StaticUnicodeString; // BF8h
WCHAR StaticUnicodeBuffer[0x105]; // C00h
PVOID DeallocationStack; // E0Ch
PVOID TlsSlots[0x40]; // E10h
LIST_ENTRY TlsLinks; // F10h
PVOID Vdm; // F18h
PVOID ReservedForNtRpc; // F1Ch
PVOID DbgSsReserved[0x2]; // F20h
ULONG HardErrorDisabled; // F28h
PVOID Instrumentation[0x10]; // F2Ch
PVOID WinSockData; // F6Ch
ULONG GdiBatchCount; // F70h
ULONG Spare2; // F74h
ULONG Spare3; // F78h
ULONG Spare4; // F7Ch
PVOID ReservedForOle; // F80h
ULONG WaitingOnLoaderLock; // F84h
PVOID WineDebugInfo; // Needed for WINE DLL's
} TEB, *PTEB;
---
Для полноты картины еще и это:
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD* ExceptionList; // 00h
PVOID StackBase; // 04h
PVOID StackLimit; // 08h
PVOID SubSystemTib; // 0Ch
union {
PVOID FiberData; // 10h
ULONG Version; // 10h
} Fib;
PVOID ArbitraryUserPointer; // 14h
struct _NT_TIB *Self; // 18h
} NT_TIB, *PNT_TIB;
typedef struct _GDI_TEB_BATCH
{
ULONG Offset;
ULONG HDC;
ULONG Buffer[0x136];
} GDI_TEB_BATCH, *PGDI_TEB_BATCH;
typedef struct _PEB_LDR_DATA
{
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;
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;
---
> параметр handles указывает на список > dll-модулей(описатель,имя,полный путь и т.д.), загруженных > процессом. > вопрос:какой формат имеет элемент этого списка? > никак не могу под отладчиком определить =((
Теперь, ежели ты хочешь получить список (LIST_ENTRY *) модулей, нужно делать так:
1. По адресу fs:0x18 - взять TEB * (в user-mode, то бишь fs==0x3b)
2. В этой структуре взять ->Peb (по смещению 0x30)
Вообще-то PEB в NT-ях всегда отмаплен по адресу 0x7ffdf000 и занимает всю страницу. Под ним (0x7ffde000, 0x7ffdd000 ...) находятся TEB-ы 0-го, 1-го и т.д. потоков процессы. Но правильно делать именно так как написано
3. Из PPEB-а взять Ldr типа PPEB_LDR_DATA
4. Взять из него InLoadOrderModuleList.Flink
Это указатель на LIST_ENTRY InLoadOrderModuleList в структуре LDR_MODULE первого модуля (собственно экзешника этого процесса чаще всего). Все остальные InLoadOrderModuleList связаны (смотри макрос CONTAINING_RECORD)
#include <winnt.h> // Та которая в NTDDK
void
main() {
PTEB pTeb;
PPEB pPeb;
PPEB_LDR_DATA pLdrData;
PLIST_ENTRY pCurrentEntry;
PLDR_MODULE pModule;
__asm {
mov pTeb, fs:0x18
}
pPeb = pTeb->Peb;
pLdrData = pPeb->Ldr;
pCurrentEntry = InLoadOrderModuleList.Flink;
while (pCurrentEntry != &Peb->Ldr->InLoadOrderModuleList && pCurrentEntry != NULL) {
pModule = CONTAINING_RECORD(pCurrentEntry, LDR_MODULE, InLoadOrderModuleList);
// Использование pModule
pCurrentEntry = pCurrentEntry->Flink;
}
---
|
| |
[NT] need more info 22.11.02 19:43
Автор: beetle <beetle> Статус: Member
|
если возможно кинь мне описания следующих структур:
PEBLOCKROUTINE
PEB_FREE_BLOCK
|
| | |
[NT] need more info 25.11.02 12:49
Автор: amirul <Serge> Статус: The Elderman
|
> если возможно кинь мне описания следующих структур: > PEBLOCKROUTINE > PEB_FREE_BLOCK
typedef struct _PEB_FREE_BLOCK
{
struct _PEB_FREE_BLOCK* Next;
ULONG Size;
} PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;
typedef VOID STDCALL (*PPEBLOCKROUTINE)(PVOID);
---
Качай и наслаждайся :-)
|
| |
[NT] а ты откуда все енто взял?особенно по поводу TEB ???? 15.11.02 21:42
Автор: beetle <beetle> Статус: Member
|
|
| | |
Ты лучше скажи работает или нет - я ж сам не проверял еще, и вряд ли буду в ближайшее время 18.11.02 11:34
Автор: amirul <Serge> Статус: The Elderman
|
Да несколько лет в инете собирал доки и сырцы по интерналсам винды. Вернее не собирал, а качал все что имеет к этому хоть какое-то отношение, даже если сейчас мне не нужно.
Очень хорошая штука в этом плане - reactos (reactos.org по мойму). Те структуры, что я отпостил - оттуда
Еще файлик nt4.h - хедер для нативных структур и функций, ну и куча всего по мелочам (Object Manager, Memory Manager, File System etc.)
structures.txt - только структуры и т.д.
Линки дать не могу - не помню
ЗЫ: Все что там описано нужно делать из UserMode. В кернел моде в fs находится селектор 0x30 и указывает на текущий KPCR - kernel processor control region, но с ним совсем другая история
|
| | | |
[NT] пришлось заставить работать =)) 23.11.02 01:07
Автор: beetle <beetle> Статус: Member
|
> Еще файлик nt4.h - хедер для нативных структур и функций, > ну и куча всего по мелочам (Object Manager, Memory Manager, > File System etc.) > structures.txt - только структуры и т.д. пришли если можешь
> ЗЫ: Все что там описано нужно делать из UserMode. В кернел > моде в fs находится селектор 0x30 и указывает на текущий > KPCR - kernel processor control region, но с ним совсем > другая история на основе твоих описаний все заработало и причем именно так как хотел я -
только пришлось повозиться =))
большое спасибо
ЗЫ:если пожелаешь я тебе мыльну сырец - поглядишь
кстати вот линк на прогу
process killer
|
| | | | |
[NT] пришлось заставить работать =)) 25.11.02 13:00
Автор: amirul <Serge> Статус: The Elderman
|
> > Еще файлик nt4.h - хедер для нативных структур и > функций, > > ну и куча всего по мелочам (Object Manager, Memory > Manager, > > File System etc.) > > structures.txt - только структуры и т.д.
> пришли если можешь
Ушло мылом
|
| |
Уточнение 15.11.02 18:34
Автор: amirul <Serge> Статус: The Elderman
|
> Вообще-то PEB в NT-ях всегда отмаплен по адресу 0x7ffdf000 > и занимает всю страницу. Под ним (0x7ffde000, 0x7ffdd000 > ...) находятся TEB-ы 0-го, 1-го и т.д. потоков процессы. Здесь я не совсем уверен насчет размера (может и не страница), но общий принцип именно такой. Хотя вроде самое логичное - выделить именно страницу
> #include <winnt.h> // Та которая в NTDDK > > void > main() { > PTEB pTeb; > PPEB pPeb; > PPEB_LDR_DATA pLdrData; > PLIST_ENTRY pCurrentEntry; > PLDR_MODULE pModule; > > __asm { > mov pTeb, fs:0x18 > } > pPeb = pTeb->Peb; > pLdrData = pPeb->Ldr; > pCurrentEntry = InLoadOrderModuleList.Flink; > while (pCurrentEntry != > &Peb->Ldr->InLoadOrderModuleList && pCurrentEntry != > NULL) { > pModule = CONTAINING_RECORD(pCurrentEntry, LDR_MODULE, > InLoadOrderModuleList); > > // Использование pModule > pCurrentEntry = pCurrentEntry->Flink; > } > --- Прогу не тестил. Просто для примера - она даже не была ни в одном development environmente - набирал прямо в багтраковской форме
|
|
|