Хук в SDT

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 31 май 2008.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Давайте разберемся. Вы хоть и даос, но все равно "ради... и красивости jmp" звучит немого под детски.
    Инструкция
    Код (Text):
    1. push imm32
    2. retn 0
    занимает в памяти 6 байт.
    Инструкция
    Код (Text):
    1. mov ecx, Imm32
    2. jmp ecx
    занимает 7 байт.
    Инструкция
    Код (Text):
    1. jmp imm32
    занимает 5 байт, Но! значение imm32 надо еще высчитать, что займет много больше 1-го байта. И где Ваш выйгрыш?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Aspire
    Та какая разница, 5 или 10 байт ?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    неужели ты это будешь вычислять там же куда и jmp кладешь?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    n0name Great
    Насколько я понимаю, перехват осуществляется патчингом SDT, а не сплайсингом на push/ret. А push/ret - это всего лишь возврат из перехватчика. Так что в данном случае использование push/ret ИМХО вполне оправдано. И также обсуждение замены push/ret на jmp для данного случая ИМХО надуманное.
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    l_inc
    Спасибо.
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    В итоге, все получилось следующим образом:
    Код (Text):
    1. newOpenProcess proc C
    2. mov ecx, dword ptr [esp+10h]
    3. mov ecx, dword ptr [ecx]
    4. cmp ecx,PROTECT_PID
    5. mov eax, STATUS_ACCESS_DENIED
    6. je @f
    7. push trueOP
    8. retn 0
    9. @@:
    10. retn 4*4
    11. newOpenProcess  endp
    - рабочий;
    Код (Text):
    1. newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword
    2. mov ecx, pclient_id
    3. mov ecx,dword ptr [ecx]
    4. cmp ecx, 1836   ; ID процесса
    5. mov eax, STATUS_ACCESS_DENIED
    6. jne @f
    7. push trueOP
    8. retn 0
    9. @@:
    10. retn 4*4
    11. newOpenProcess  endp
    - не рабочий, хотя, вроде должен делать тоже самое...
    В связи с этим, у меня вопрос.
    Каким образом можно отладить подобную процедуру?
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    je <-> jne.
    Я отлаживаю WinDBG на варе. Тема поднималась не раз.
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Код (Text):
    1. newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword
    2. mov ecx, pclient_id
    - это НЕ чистый ассемблер! Компилятор здесь своевольничает:
    Код (Text):
    1. newOpenProcess:
    2.     push ebp
    3.     mov  ebp, esp
    4.     mov  ecx, [ebp+14h]
    5.     ...
    Соответственно стек оказывается разбалансированным за счёт лишнего ebp...
     
  9. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    n0name Да, я знаю, опечатался, но это влияет только на то какой процесс нельзя открыть (только его или все кроме него). Во втором случае, я наблюдаю БСОД.
    Я отлаживаю в сисере на варе. Проблема в том, что эту функцию мы попадаем только когда вызывается ntOpenProcess. Как поставить бряк, (если такое вообще возможно), для того, чтобы посмотреть какие параметры передаются в стеке?

    diamond
    Т.е., Вы хотите сказать, что если я пишу mov ecx, pclient_id, то в есх запихивается совсем не то? Ну и что, что компилятор своевольничает? Он же меняет при этом указатели на параметры?
     
  10. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    diamond
    "Лишнее" ebp при этом убирается инструкцией leave
     
  11. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Aspire
    В ecx запихивается то, что нужно - соответствующий параметр, переданный функции. Но достигается это ценой некоторого кода, вставляемого компилятором. В нормальных случаях это не мешает. Но если идут нетипичные возвраты (не туда, откуда была вызвана функция), это нужно учитывать.
    При использовании "ret" - да, компилятор про неё знает. При использовании "retn" - нет. Но в обоих случаях достигается не то, что нужно: если компилятор вставит leave или mov esp,ebp/pop ebp (второе вероятнее), то ret вернётся совсем не на trueOP; если не вставит, то в стеке останется лишнее двойное слово со всеми вытекающими для параметров и адреса возврата последствиями.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Как бы надо указывать что понимается под рабочим вариантом.
    в сисере - хз. в WinDBG - "bp nt!NtOpenProcess".

    В принцпе diamond все объяснил. Попробуй нарисовать на бумажке стек, и посмотри что происходит. Если с отладчиком не получается.
     
  13. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Спасибо,diamond, за подробное объяснение.
    Второй вопрос остался без ответа, поэтому продублирую его.

    Я отлаживаю в сисере на варе. Проблема в том, что эту функцию мы попадаем только когда вызывается ntOpenProcess. Как поставить бряк, (если такое вообще возможно), для того, чтобы посмотреть какие параметры передаются в стеке?