информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsЗа кого нас держат?Сетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 С наступающим 
 Серьезная уязвимость в Apache Log4j 
 Крупный взлом GoDaddy 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / operating systems
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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 - набирал прямо в багтраковской форме
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach