Перед тем как создал тему, прочитал FAQ и заюзал поиск через гугл и тут тоже. Хотелось бы узнать, кто открыл мой процесс. По аналогии с WhoLockMe, который позволяет узнать, кто открыл какой-то файл и заблокировал его. Для чего нужно - чтобы предовтратить возможность отладки. Никаких dll, перехватов API и т.д. Для закрытия дескриптора будет использоваться скорее всего DuplicateHandle.
Похвально! Делай енум всем хэндлам, относящимся к типу "процесс", и смотри, кто владелец хэндла (ZwQuerySystemInformation+SystemHandleInformation)
А как определить что к типу "процесс" относится? Жалко что в kernel32.dll подобной функции нет, придётся ntdll'овскую ZwQuerySystemInformation. У меня уже было подозрение на неё. Сейчас буду искать описание для SystemHandleInformation, я так понял это будет в качестве параметра.
Ну наткнулся на пример Ms-Rem'а по поиску открытых файлов (работает отлично), теперь ума не приложу как это на процессы перевести. Помогите, блин, а то башка и так после DuplicateHandle болит.
Почитай http://www.wasm.ru/article.php?article=hiddndt Там есть примеры перечисления процессов таким методом.
Ума только не приложу, что такое GetInfoTable? В библиотеке advApiHook вроде нет. + Что-то у меня OllyDbg глючит при отладке двупоточного приложения, а я-то ещё хэндлы даже искать во втором потоке не начал. Отлаживать проблемно будет.
GetInfoTable - это обертка вокруг NtQuerySystemInformation вот код на Си (взят из ms-rem'ной программы henum) Код (Text): PVOID GetInfoTable( IN ULONG ATableType ) { ULONG mSize = 0x8000; PVOID mPtr; NTSTATUS status; do { mPtr = HeapAlloc(hHeap, 0, mSize); if (!mPtr) return NULL; memset(mPtr, 0, mSize); status = NtQuerySystemInformation(ATableType, mPtr, mSize, NULL); if (status == STATUS_INFO_LENGTH_MISMATCH) { HeapFree(hHeap, 0, mPtr); mSize = mSize * 2; } } while (status == STATUS_INFO_LENGTH_MISMATCH); if (NT_SUCCESS(status)) return mPtr; HeapFree(hHeap, 0, mPtr); return NULL; }
slow Да, точно, и у меня это есть оказывается. Это хорошо, что здесь только API - проще на асм переделывать. Вот только как отлаживать эту хрень не понятно, я же многопоточное приложение делаю, а Olly глючит.
cresta Неужели всё так плохо? Мне надо чтобы код работал на всех NT безупречно. Придётся ждать Ms-Rem'а.
NullSessi0n А что тут плохого? Можно собрать заранее константы для разных ОС и зашить их в ехе. Можно определить тип хэндла динамически: открыть какой-нибудь процесс, наверняка владеющий хэндлом искомого типа. Например csrss. И перечислять все его хэндлы, для каждого из хэндлов запрашивать его тип через ZwQueryObject. Как найдешь хэндл типа "процесс" - запомни его Object Type Number в глобальной переменной. И всё. И не нужно никого ждать.
Нужно с помощью Duplicatehandle создать из псевдохендла своего процесса (-1) обычный хендл, а затем перечислить хендлы и сохранить тип. Никакой другой процесс открывать не стоит. ZwQueryObject тоже ненужен. Пример динамического определения типа хендла есть в http://www.wasm.ru/pub/21/files/lockfileswork/henum.rar
Так нет, я хочу закрыть все дескрипторы, которые указывают на мой процесс. Чтобы обломать WriteProcessMemory и т.д. Понятно, что перехватить API многого не стоит, но попробовать отделатся можно.
Есть идея для полчуения OB_TYPE_XXX - надо открыть собственный же процесс, а потом получить информацию о полученном дескрипторе, в поле TYPE будет OB_TYPE_PROCESS. А точно нет нормального способа?
NullSessi0n На мой взгляд, вместо грубого препятствования дампу, можно просто открывать доступ к нужным страницам, в нужное время (VirtualProtect), и запрещать его после. Такой метод правда работает в основном с редакторами памяти, не известно решаться ли дамперы читать из страниц с аттрибутами PAGE_NOACCESS.