Перехват NtWriteVirtualMemory

Discussion in 'WASM.NT.KERNEL' started by krabz, May 29, 2010.

  1. krabz

    krabz New Member

    Blog Posts:
    0
    Короче, я уже голову сломал. Или лыжи не едут...

    Собственно перехватываем NtWriteVirtualMemory с целью защиты от инжекта таким спосообом. И нужно определить не является ли процесс, в АП которого происходит вторжение одним из тех, которые мы хотим прикрыть. Соответственно, необходимо найти PID, чтобы плясать дальше... , для этого используется ProcessHandle, который приходит в первом параметре.

    Пробовал найти PID таким образом:
    Code (Text):
    1. ObReferenceObjectByHandle (ProcessHandle, 0, NULL, KernelMode, &eprocess, NULL);
    2. pid = PsGetProcessId (eprocess);
    вроде бы нормальный способ, но PID возвращаются какие-то странные. Смотрю в ProcessExplorer и там замечаю, что 100 < PID < 9999. однако мне приходит то 0, то какие-то большие числа, явно больше 9999.

    Решил попробовать иначе:

    Code (Text):
    1. ZwQueryInformationProcess (ProcessHandle, ProcessBasicInformation, &pbi, sizeof (pbi), &suc);
    возвращает STATUS_OBJECT_TYPE_MISMATCH. Я так понимаю, что хэндлы которые я туда сую - не хэндлы процессов, а какие-то левые хэндлы. Я в шоке.

    Просмотрел значения приходящих хэндлов: есть такие типа 0x8000345 - это я так понял KernelHandle , а есть юзермодные типа 0x0000124...

    Просто как бэ NtWriteVirtualMemory хавает и те и другие нормально...

    Как же мне получить PID из этих хэндлов?
     
  2. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    квери может и не сработать - права на запись АП не обязательно будут соседствовать с правами на получение инфы.
    хендл может быть открыт только с правами на запись ап. в любом случае, это логически не правильно.

    референс + PsGetProcessId нормальный способ. а у тебя где-то что-т не так, если получаешь кривые числа. давай полный исходник.

    без разницы какие хендлы.
     
  3. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Great
    Он результат исполнения ObReferenceObjectByHandle() не проверяет, левые числа это произвольные значения из стека, где локальные переменные не зануляются.
    krabz
    Желательно тип обьекта указать и тип доступа к нему.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    krabz
    Смотрите, что возвращает ObReferenceObjectByHandle. Может она ошибкой завершается?
    У меня такое подозрение, что вы передаете неверный хендл.
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Clerk
    я думал это псевдокод. если и правда не проверяет, тогда говорить не о чем)
     
  6. krabz

    krabz New Member

    Blog Posts:
    0
    Да что вы, проверяю конечно - STATUS_SUCCESS там, и указатель как бэ адекватный...

    А ZwQueryInformationProcess рекомендуете фтопку?

    Ну тогда щас попробую снова тот способ реализовать - если что выложу код
     
  7. Clerk

    Clerk Забанен

    Blog Posts:
    0
    krabz
    Если всё исполняется какбэ успешно, тоесть по внешнему виду скрипта определить ошибку нельзя, то выкиньте нафиг свой компилятор. Ну или не приводите более этих скриптов.
     
  8. krabz

    krabz New Member

    Blog Posts:
    0
    Дико извиняюсь, но баг был совершенно в другом месте. Оказывается была перехвачена другая функция :) поскольку там было такое же количество параметров, то ничего не рушилось.
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    krabz
    Я был прав, сказав что хендл неверный (как бы само значение не подходит под хендл).
     
  10. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Ну сообщала ведь винда, что тип не соответствует. Стоит больше доверять статусу результата:)

    // написано с мобилы