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

 WASM Phorum —› WASM.WIN32 —› PROCESS_DATABASE, PEB HANDLES_TABLE

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


Дата: Авг 11, 2003 15:52:29

Скажите пожалуйста - где почитать насчет получения указателей на сабжи? в первую очередь интересует PROCESS_DATABASE. Или если можно - поясните что у Пьетрека значит Obfuscator? т.к. из-за него код совсем непонятен :(


Дата: Авг 13, 2003 19:52:57 · Поправил: Four-F

Obfuscator значит "сбиватель с толку". В терминологии M$ это Obsfucator, наверное, чтобы еще более всех запутать ;-) Это значение размером DWORD вычисляемое при старте Windows. Если поксорить с ним, например ID процесса, то получишь указатель на PEB. И вроде, даже любой ID будучи поксореным с Obsfucator, даст указатель на объект, но это я точно не помню уже.

Получить Obsfucator проще всего так:
invoke GetCurrentProcessId
xor eax, fs:[30h]


Вот, например, код OpenThread под масдай. Что-то подобное использовал ProcDump, а он стырил у ATM.
OpenThreadW9x proc uses edx dwDesiredAccess:DWORD, bInheritHandle:BOOL, dwThreadId:DWORD 

local pProcess:LPVOID
local hmodKernel:HANDLE

    assume fs:nothing 
    mov    eax, fs:[30h]                        ; obtain address of ProcessEnvironmentBlock
    mov    pProcess, eax
    invoke GetCurrentProcessId
    xor    eax, pProcess                        ; dwProcessId ^ pPEB
    mov    dwObsfucator, eax                    ; dwObsfucator = LocalProc.dwProcessId ^ LocalProc.pPEB

    invoke GetModuleHandle, addr szKernel32DLL
    mov hmodKernel, eax

    invoke GetProcAddress, hmodKernel, addr szOpenProcess
    add    eax, 24h                             ; OpenProcess+24h
    mov edx, [eax]
    .if edx==0B9h                               ; ? [OpenProcess+24h]==mov ecx, 00000000
        mov    pfnW9xOpenThread, eax

        mov    edx, dwObsfucator
        mov    eax, dwThreadId
        ; Ring3TCB = RemoteProc.dwThreadId ^ LocalProc.dwProcessId ^ LocalProc.pPEB 
        xor    eax, edx                        
        push dwThreadId
        push bInheritHandle
        push dwDesiredAccess
        call [pfnW9xOpenThread]                ; KERNEK32!OpenThread
                                               ; Return RemoteProc.hThread
    .else
        xor eax, eax                           ; Return FALSE
    .endif

    ret
        
OpenThreadW9x endp


Все вышесказанное верно только для масдай (9x).


Дата: Авг 14, 2003 15:13:52

А насчет NT кто что скажет?
Я нашел только один вариант - NtQuerySystemInformation (SystemHandlesInformation) а потом уже проверять каждый хэндл. - Вроде даже под непривелигированным аккаунтом работает.
А насчет таблицы хэндлов, то в W2K internals говорили уже не про PDB, а про EPROCESS ( который кстати так же не сказано, как получить ), и при этом говорилось что таблица хэндлов принадлежит памяти ядра, а не процесса - в результате только драйвер может её почитать. Хотя в другом месте говорилось, что таблица хэндлов принадлежит userspace. Кто прав?
под таблицей хэндлов я имею ввиду таблицу хэндлов процесса, а не ядра


Дата: Авг 14, 2003 17:22:12

[ rst: А насчет NT кто что скажет? ]

Ну, поскольку прозвучала фамилия Пьетрека и волшебное слово Obfuscator, то я и решил, что те для масдая. А под NT это сколько угодно.


PEB (Process Environment Block) всегда отображается по виртуальному адресу 7FFDF000h.
либо fs:[30] (в режиме пользователя) читай (в контексте интересующего процесса, разумеется).
Но там нет указателя на таблицу хендлов. Он содержится в EPROCESS в поле ObjectTable. Указывает на структуру HANDLE_TABLE. Все лежит в памяти режима ядра. Даже если ты из юзера узнаешь адрес EPROCESS или HANDLE_TABLE, то как читать их будешь? Из ядра указатель на EPROCESS получить элементарно, например, PsLookupProcessByProcessId (по идентификатору).

Про таблицу хендлов кроме Соломона еще у Свена Шрайбера в "Недокументированные возможности Windows 2000" почитать можно. Структуры проще всего у меня в KmdKit (на этом сайте) посмотреть (w2kundoc.inc) или из PDB вытянуть.

Если скажешь, для чего те это нужно, может быть что-нибудь придумаем.


Дата: Авг 14, 2003 18:19:16

Мне нужно заставить процесс отвязаться от ресурса (модема) можно просто закрыв хэндл в этом процессе, который указывает на модем.


Дата: Авг 14, 2003 20:42:00

А ты сможешь определить нужный хендл если получишь их список?
Закрывать нужно из юзера или можно из ядра (нужен будет драйвер)?
Под какую ось?


Дата: Авг 15, 2003 14:58:26

Я думаю что в таблице хэндлов есть эта инфа ( нужно уточнить у рихтера ).
Если нет, то GetSystemInformation - там ест info-class который дайт инфу о хэндле.
работать должно под 9х и NT, но я предполагаю что там будут разные методы, кроме инжектирования кода и закрытия хэндла. работать все должно только в userspace - ни дров ничего нельзя делать.
для НТ я вижу самый простой вариант (к тому же его можно сделать OutProc) - это
GetSystemInformation(systemHandlesInformation) а потом по каждому хэндлу пробежаться и спросить - а не \Device\Serial* ли он, если так, то InjectThread с CLoseHandle в нужный процесс и все.
а насчет 98 ещё не знаю - там скорее всего как Пьетрек придется делать.


Дата: Авг 15, 2003 23:02:30

[ rst: Я думаю что в таблице хэндлов есть эта инфа ( нужно уточнить у рихтера ). ]

Ну, у Рихтера точно про это ничего нет.


[ rst: Если нет, то GetSystemInformation - там ест info-class который дайт инфу о хэндле. работать должно под 9х и NT... ]

Если ты имеешь ввиду ZwQuerySystemInformation, SystemHandleInformation,..., то как раз под 9x работать не будет. Откуда там ntdll.dll?


[ rst: для НТ я вижу самый простой вариант (к тому же его можно сделать OutProc) - это
GetSystemInformation(systemHandlesInformation) а потом по каждому хэндлу пробежаться и спросить - а не \Device\Serial* ли он, если так, то InjectThread с CLoseHandle в нужный процесс и все.
]

Возможно получится такое. Только имей ввиду, что вызвав ZwQuerySystemInformation, SystemHandleInformation,..., ты получишь набор структур описывающих хендлы, но само значение хендла передать в ZwQueryObject просто так не получится, т.к. ,например, хендл с индексом 4 под w2k есть в каждом процессе, и сказать ZwQueryObject в каком именно процессе этот хендл, нельзя. Тебе придется сделать дубликат хендла в своем процессе и уже на него натравливать ZwQueryObject. См. у Небетта есть "Example 2.1: Listing Open Handles of a Process". Как раз то, что те нужно. Либо сразу же делать инжект и все делать в удаленном процессе.

А для маздая хз.


Дата: Авг 16, 2003 01:15:33

Ну, у Рихтера точно про это ничего нет. - у него есть про таблицы хэндлов в общих чертах + Пьетрек ещё есть -)

Если ты имеешь ввиду ZwQuerySystemInformation, SystemHandleInformation,..., то как раз под 9x работать не будет. Откуда там ntdll.dll? - я ведь сразу сказал , что для 9х нужно будет другое решение. Возможно они будут совпадать разве что в инжектировании - а по поводу работоспособности и под 9х - естественно later binding через GetProcAddress.


"Example 2.1: Listing Open Handles of a Process". Как раз то, что те нужно. Либо сразу же делать инжект и все делать в удаленном процессе
Я как раз на нем и буду базироваться. По кр. мере для получения списка хэндлов особые привилегии не нужны. Насчет QueryObject - нужно ещё проверить.


Дата: Авг 16, 2003 01:20:41

[ Four-F: Откуда там ntdll.dll?]

А вот если ставишь прогу от Winternals NTFS FOR WINDOWS-98 как раз
приходится пихать в мастдай ntdll.dll, может тогда и эти API можно
будет свободно вызывать и использовать... под win98..


Дата: Авг 16, 2003 04:04:37

Хм.. А как там с int2E?


Дата: Авг 17, 2003 20:17:19

А вот если ставишь прогу от Winternals NTFS FOR WINDOWS-98 как раз
приходится пихать в мастдай ntdll.dll, может тогда и эти API можно
будет свободно вызывать и использовать... под win98..

Не верю, что это тоже будет работать. Просто не верю. может быть там ntdll.dll используется для парсинга структур NTFSных... - это действительно может рабтать на 98. но работа с объектами ядра...
К тому же там можно итак получить доступ к таблице хэндлов ( Пьетрек )


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