информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяВсе любят медЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach