|
|
| Посл.отвђт | Сообщен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.113 |