Кто открыл мой процесс.

Тема в разделе "WASM.WIN32", создана пользователем NullSessi0n, 19 апр 2006.

  1. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Перед тем как создал тему, прочитал FAQ и заюзал поиск через гугл и тут тоже.

    Хотелось бы узнать, кто открыл мой процесс. По аналогии с WhoLockMe, который позволяет узнать, кто открыл какой-то файл и заблокировал его. Для чего нужно - чтобы предовтратить возможность отладки. Никаких dll, перехватов API и т.д. Для закрытия дескриптора будет использоваться скорее всего DuplicateHandle.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Похвально!



    Делай енум всем хэндлам, относящимся к типу "процесс", и смотри, кто владелец хэндла (ZwQuerySystemInformation+SystemHandleInformation)
     
  3. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    А как определить что к типу "процесс" относится?

    Жалко что в kernel32.dll подобной функции нет, придётся ntdll'овскую ZwQuerySystemInformation. У меня уже было подозрение на неё. Сейчас буду искать описание для SystemHandleInformation, я так понял это будет в качестве параметра.
     
  4. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Ну наткнулся на пример Ms-Rem'а по поиску открытых файлов (работает отлично), теперь ума не приложу как это на процессы перевести. Помогите, блин, а то башка и так после DuplicateHandle болит.
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
  6. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Ms Rem

    Спасибо, думаю я теперь справлюсь. Твои статьи рулят!
     
  7. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Ума только не приложу, что такое GetInfoTable? В библиотеке advApiHook вроде нет.

    + Что-то у меня OllyDbg глючит при отладке двупоточного приложения, а я-то ещё хэндлы даже искать во втором потоке не начал. Отлаживать проблемно будет.
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    GetInfoTable - это обертка вокруг NtQuerySystemInformation



    вот код на Си (взят из ms-rem'ной программы henum)


    Код (Text):
    1. PVOID GetInfoTable(
    2.           IN ULONG ATableType
    3.           )
    4. {
    5.     ULONG    mSize = 0x8000;
    6.     PVOID    mPtr;
    7.     NTSTATUS status;
    8.     do
    9.     {
    10.         mPtr = HeapAlloc(hHeap, 0, mSize);
    11.  
    12.         if (!mPtr) return NULL;
    13.  
    14.         memset(mPtr, 0, mSize);
    15.  
    16.         status = NtQuerySystemInformation(ATableType, mPtr, mSize, NULL);
    17.        
    18.         if (status == STATUS_INFO_LENGTH_MISMATCH)
    19.         {
    20.             HeapFree(hHeap, 0, mPtr);
    21.             mSize = mSize * 2;
    22.         }
    23.  
    24.     } while (status == STATUS_INFO_LENGTH_MISMATCH);
    25.  
    26.     if (NT_SUCCESS(status)) return mPtr;
    27.  
    28.     HeapFree(hHeap, 0, mPtr);
    29.  
    30.     return NULL;
    31. }
     
  9. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    slow

    Да, точно, и у меня это есть оказывается. Это хорошо, что здесь только API - проще на асм переделывать. Вот только как отлаживать эту хрень не понятно, я же многопоточное приложение делаю, а Olly глючит.
     
  10. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    OB_TYPE_PROCESS = ?

    Не нашёл нигде.
     
  11. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Object type process?

    зависит от ОС, на ХР = 5
     
  13. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    cresta

    Неужели всё так плохо? Мне надо чтобы код работал на всех NT безупречно.

    Придётся ждать Ms-Rem'а.
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    NullSessi0n



    А что тут плохого?

    Можно собрать заранее константы для разных ОС и зашить их в ехе.

    Можно определить тип хэндла динамически: открыть какой-нибудь процесс, наверняка владеющий хэндлом искомого типа. Например csrss. И перечислять все его хэндлы, для каждого из хэндлов запрашивать его тип через ZwQueryObject. Как найдешь хэндл типа "процесс" - запомни его Object Type Number в глобальной переменной. И всё. И не нужно никого ждать.
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Нужно с помощью Duplicatehandle создать из псевдохендла своего процесса (-1) обычный хендл, а затем перечислить хендлы и сохранить тип. Никакой другой процесс открывать не стоит. ZwQueryObject тоже ненужен. Пример динамического определения типа хендла есть в http://www.wasm.ru/pub/21/files/lockfileswork/henum.rar
     
  16. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Так нет, я хочу закрыть все дескрипторы, которые указывают на мой процесс. Чтобы обломать WriteProcessMemory и т.д. Понятно, что перехватить API многого не стоит, но попробовать отделатся можно.
     
  17. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Есть идея для полчуения OB_TYPE_XXX - надо открыть собственный же процесс, а потом получить информацию о полученном дескрипторе, в поле TYPE будет OB_TYPE_PROCESS.

    А точно нет нормального способа?
     
  18. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Толку от этого мало однако. Ладно, хотя бы смог все хэндлы закрыть.
     
  19. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    NullSessi0n

    На мой взгляд, вместо грубого препятствования дампу, можно просто открывать доступ к нужным страницам, в нужное время (VirtualProtect), и запрещать его после. Такой метод правда работает в основном с редакторами памяти, не известно решаться ли дамперы читать из страниц с аттрибутами PAGE_NOACCESS.
     
  20. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    А что, им сложно будет попытаться прочитать? ReadProcessMemory ошибку не вернёт.