· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› pTEB + 600-700h

Посл.отвђт Сообщенiе


Дата: Июл 17, 2004 06:20:55

заинтересовался хешированием hWnd , начал разбираться но возникли определенные трудности со страницой в которой находиться TEB , сам то TEB хорошо документирован :) - достать по нему инфу нет проблем, но я не могу найти где описано содержание остальной части страницы


Дата: Июл 17, 2004 18:30:12

TEB STRUCT
    Tib                             NT_TIB      <>      ; 000h
    EnvironmentPointer              PVOID       ?       ; 01Ch
    Cid                             CLIENT_ID   <>      ; 020h
    ActiveRpcInfo                   PVOID       ?       ; 028h
    ThreadLocalStoragePointer       PVOID       ?       ; 02Ch
    Peb                             PVOID       ?       ; 030h PTR PEB
    LastErrorValue                  DWORD       ?       ; 034h
    CountOfOwnedCriticalSections    DWORD       ?       ; 038h
    CsrClientThread                 PVOID       ?       ; 03Ch
    Win32ThreadInfo                 PVOID       ?       ; 040h
    Win32ClientInfo                 DWORD   1Fh dup(?)  ; 044h
    WOW32Reserved                   PVOID       ?       ; 0C0h
    CurrentLocale                   DWORD       ?       ; 0C4
    FpSoftwareStatusRegister        DWORD       ?       ; 0C8
    SystemReserved1                 PVOID   36h dup(?)  ; 0CC
    Spare1                          PVOID       ?       ; 1A4
    ExceptionCode                   DWORD       ?       ; 1A8
    SpareBytes1                     DWORD   28h dup(?)  ; 1AC
    SystemReserved2                 PVOID   0Ah dup(?)  ; 24C
    GdiRgn                          DWORD       ?       ; 274
    GdiPen                          DWORD       ?       ; 278
    GdiBrush                        DWORD       ?       ; 27C
    RealClientId                    CLIENT_ID   <>      ; 6B4h
    GdiCachedProcessHandle          PVOID       ?       ; 
    GdiClientPID                    DWORD       ?       ; 
    GdiClientTID                    DWORD       ?       ; 
    GdiThreadLocaleInfo             PVOID       ?       ; 
    UserReserved                    PVOID   5 dup(?)    ; 
    GlDispatchTable                 PVOID   118h dup(?) ; 
    GlReserved1                     DWORD   1Ah dup(?)  ; 
    GlReserved2                     PVOID       ?       ; 
    GlSectionInfo                   PVOID       ?       ; 
    GlSection                       PVOID       ?       ; 
    GlTable                         PVOID       ?       ; 
    GlCurrentRC                     PVOID       ?       ; 
    GlContext                       PVOID       ?       ; 
    LastStatusValue                 DWORD       ?       ; BF4h
    StaticUnicodeString             UNICODE_STRING  <>  ; 
    StaticUnicodeBuffer             WORD    105h dup(?) ; WCHAR
    DeallocationStack               PVOID       ?       ; 
    TlsSlots                        PVOID   40h dup(?)  ; 
    TlsLinks                        LIST_ENTRY  <>      ; 0
    Vdm                             PVOID       ?       ; 
    ReservedForNtRpc                PVOID       ?       ; 
    DbgSsReserved                   PVOID   2 dup(?)    ; 
    HardErrorDisabled               DWORD       ?       ; F28h
    Instrumentation                 PVOID   10h dup(?)  ; 
    WinSockData                     PVOID       ?       ; 
    GdiBatchCount                   DWORD       ?       ; 
    Spare2                          DWORD       ?       ; 
    Spare3                          DWORD       ?       ; 
    Spare4                          DWORD       ?       ; 
    ReservedForOle                  PVOID       ?       ; 
    WaitingOnLoaderLock             DWORD       ?       ; 
    StackCommit                     PVOID       ?       ; 
    StackCommitMax                  PVOID       ?       ; 
    StackReserved                   PVOID       ?       ; 
TEB ENDS
PTEB typedef PTR TEB


Где нашел не помню, от какой версии не знаю, насколько это верно не знаю :) Но какие-то поля правильны. Можно ещё в исходниках nt4 порыться (в w2k не нашел). Там должна наверное быть.


Дата: Июл 18, 2004 05:14:10

У меня эта структура только до 40h включительно описана, и похоже полностью совпадает с твоим вариантом, что до интересующей меня части: 6сс и 6fc, то похоже там что-то нето написано, во всяком случае я не это ожидал :(


Дата: Июл 18, 2004 08:56:38 · Поправил: comrade


Дата: Июл 20, 2004 05:18:17

comrade, ссылки немного не по теме...

Four-F, нарыл на http://ntprog.by.ru/_def.htm#TEB еще одно такоеже описание структы, но оно слегка не совпадает с твоим :( Похоже придется мне осваивать методологию реверсинга.


Дата: Июл 20, 2004 07:43:54

Mayor

ну ты блин и задал вопросик


Дата: Июл 21, 2004 06:29:59

CARDINAL
просто я еще слаб в реверсинге, лет 5 со времен z80 нормально не практиковался, придет время сам разбираться начну, ну а пока юзаю готовое


Дата: Июл 22, 2004 01:39:04

Mayor, у меня таких определений 5 или 6 и всё чуть-чуть отличаются. Скорее всего, они просто от разный версий оси. А в исходниках nt4 порыться лень было? Таки мне пришлось. В nt4_src\sdk\inc\ntpsapi.h написано вот что:
typedef struct _TEB {
    NT_TIB NtTib;
    PVOID  EnvironmentPointer;
    CLIENT_ID ClientId;
    PVOID ActiveRpcHandle;
    PVOID ThreadLocalStoragePointer;
    PPEB ProcessEnvironmentBlock;
    ULONG LastErrorValue;
    ULONG CountOfOwnedCriticalSections;
    PVOID CsrClientThread;
    PVOID Win32ThreadInfo;          // PtiCurrent
    ULONG Win32ClientInfo[WIN32_CLIENT_INFO_LENGTH];    // User32 Client Info
    PVOID WOW32Reserved;           // used by WOW
    LCID CurrentLocale;
    ULONG FpSoftwareStatusRegister;
    PVOID SystemReserved1[54];      // Used by FP emulator
    PVOID Spare1;                   // unused
    NTSTATUS ExceptionCode;         // for RaiseUserException
    UCHAR SpareBytes1[40];
    PVOID SystemReserved2[10];                      // Used by user/console for temp obja
    GDI_TEB_BATCH GdiTebBatch;      // Gdi batching
    ULONG gdiRgn;
    ULONG gdiPen;
    ULONG gdiBrush;
    CLIENT_ID RealClientId;
    HANDLE GdiCachedProcessHandle;
    ULONG GdiClientPID;
    ULONG GdiClientTID;
    PVOID GdiThreadLocalInfo;
    PVOID UserReserved[5];          // unused
    PVOID glDispatchTable[280];     // OpenGL
    ULONG glReserved1[26];          // OpenGL
    PVOID glReserved2;              // OpenGL
    PVOID glSectionInfo;            // OpenGL
    PVOID glSection;                // OpenGL
    PVOID glTable;                  // OpenGL
    PVOID glCurrentRC;              // OpenGL
    PVOID glContext;                // OpenGL
    ULONG LastStatusValue;
    UNICODE_STRING StaticUnicodeString;
    WCHAR StaticUnicodeBuffer[STATIC_UNICODE_BUFFER_LENGTH];
    PVOID DeallocationStack;
    PVOID TlsSlots[TLS_MINIMUM_AVAILABLE];
    LIST_ENTRY TlsLinks;
    PVOID Vdm;
    PVOID ReservedForNtRpc;
    PVOID DbgSsReserved[2];
    ULONG HardErrorsAreDisabled;
    PVOID Instrumentation[16];
    PVOID WinSockData;              // WinSock
    ULONG GdiBatchCount;
    ULONG Spare2;
    ULONG Spare3;
    ULONG Spare4;
    PVOID ReservedForOle;
    ULONG WaitingOnLoaderLock;
} TEB;
typedef TEB *PTEB;



Это, так сказать, официальная версия верная не 100% :) Но опять же только для NT4 какойто-то там sp.


Дата: Июл 22, 2004 06:31:27

Скорее всего, они просто от разный версий оси. А в исходниках nt4 порыться лень было?

Видишь ли я вообще не знал что они существуют, судя по пути я должен посмотреть в своем DDK\SDK ? может тебе проще было бы скинуть ссылку мне на все 5 версий teb ?

За еще одну struc teb большое спасибо, мне нужно будет немного времени чтобы разобраться в смещениях

:)


Дата: Июл 22, 2004 16:12:52

[ Mayor: судя по пути я должен посмотреть в своем DDK\SDK ? ]

Зря время потратишь.
#define TLS_MINIMUM_AVAILABLE 64
#define WIN32_CLIENT_INFO_LENGTH 31
#define GDI_BATCH_BUFFER_SIZE 310

typedef struct _GDI_TEB_BATCH {
    ULONG Offset;
    ULONG HDC;
    ULONG Buffer[GDI_BATCH_BUFFER_SIZE];
} GDI_TEB_BATCH,*PGDI_TEB_BATCH;


Если этого недостаточно, могу скинуть на мыло весь ntpsapi.h.

5-6 тебов где-то по винту разбросаны. Да тебе это кроме путаницы ничего не даст. Глянь по этим ссылкам и нете пошукай.

http://board.win32asmcommunity.net/showthread.php?s=63557c834a2ec969c7 32c81762f02f24&threadid=11081

http://board.win32asmcommunity.net/showthread.php?s=63557c834a2ec969c7 32c81762f02f24&threadid=14185


Дата: Июл 24, 2004 07:11:04

Единственное что удалось понять - то что младшие 6 битов HWND образуют индекс в одной из таблиц объектов окна, причем к объектам всех процессов можно получить доступ из пользовательского режима :-) как это не типично для Windows. По крайней мере для чтения, запись в них вроде идет через sysenter, а то был бы крутой exploit, но я не уверен, :( к сожалению не знаю как в SoftICE получить тип страницы через виртуальный адресс.

К сожалению, просто мало опыта, не вижу с какого конца прицепиться - код постоянно сравнивает содержимое разных таблиц с глобальными переменными и полями TEB и делает условные переходы. Кажется еще немного и на пару месяцев отпадет охота реверсировать что-либо :(

Насчет TEB только понял, что fs:6f4 содержит текущий hWnd ( передаваемый к примеру в WindowProc) а fs:6f8 ссылку на его объект, последнее можно проверить: pWO->0 == hWnd ; pWO->60h == offset WindowProc; но определений TEB, содержащих эти поля мне не встречалось :(


Дата: Июл 24, 2004 12:14:21

[ Mayor: Единственное что удалось понять - то что младшие 6 битов HWND образуют индекс в одной из таблиц объектов окна ]

Прочти "USER and GDI Objects" в доке "Using SoftICE".


[ Mayor: причем к объектам всех процессов можно получить доступ из пользовательского режима ]

http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=5326


[ Mayor: не знаю как в SoftICE получить тип страницы через виртуальный адресс. ]

page <вирт.адр.>. Только она контекстно зависима. Обратная операция phys <физ.аддр.>. Она естественно контекстно независима. Для page переключись сначала на интересующий тебя процесс addr <имя процесса или указатель на EPROCESS> и читай "SoftICE Command Reference Help"


Дата: Июл 27, 2004 06:33:10

page <вирт.адр.>.

Оказалось что объекты доступны из user mode только для чтения .
С остальным пока разбираюсь ...


Дата: Июл 28, 2004 06:35:32

Вроде начал понимать: lowword hwnd это индекс в " Global Master User Table "; Понимание того как получить адрес начала этой таблицы находится далеко за пределами моих реверсинговых способностей, код его берет из глобальной переменной user32.dll, как эта переменая инициализируется просто невозможно понять :(
В этой таблице храняться структуры MasterUserObject размером 12 байт, hiword hwnd должен совпадать с полем MUO->Instance иначе дескриптер уже не актуален, далее в MUO->type должно храниться 1 - это идентификатор объекта типа окна, далее MUO ->flags как-то проверяются, но что они означают я тоже не в силах понять :(
В MUO->pUserObject хранит непосредственно адрес на сам объект в таблице UserObject с ее адресом все проще она храниться сразу в адресном пространстве Ядра и UserMode в последнем есстественно доступна только для чтения: в fs:6e4 храниться адрес структуры типа { dword pKernelStartUOT; dword pKernelEndOUT; } в fs:6e8 храница разница = pKernelStartUOT - pUserStartUOT . Таким образом можно получить ее адрес в пользовательском режиме, но без адреса MUOT все это бесполезно :(
может кому-нить пригодиться:
MasterUserObject {
PVOID pUserObject;
byte type;
byte flags;
word Instance;
dword АХЗ ;
}


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058