|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 20, 2004 17:48:46 Вот возник просто вопросик как бы мне из вне либо там из подгружаемой дллки... второе наверно удобнее... перехватить участок кода то бишь в программе есть фнутренние функции ... что собвенно очевидно есть в любой... программе +)... ну вот я бы хотел .. перехватить момент её вызова с получением значений регистров... и вопрос номер два... как нибуть вызвать бы эту функцию с параметрами.. причём в качестве параметров там выступают регистры.... |
|
|
Дата: Май 20, 2004 19:25:52 В подгружаемой DLL'ке: mov reg1, parameter1 .... mov regN, parameterN call адрес_функции ; add esp, .... ; поправить стек если нужно |
|
|
Дата: Май 21, 2004 04:08:08 · Поправил: Funbit а перехватить можешь, пропатчив (с сохранением старых байтов) первые байты нужной ф-ции на jmp на свой кусочек кода, в котором сделаешь все что тебе нужно. после, восстановливай затертые jmp'ом байты и прыгай обратно на начало ф-ции... вроде это спрашивал ? |
|
|
Дата: Май 21, 2004 21:30:19 Угу это то да... а вот наткнулся на забавный способ с помощью Дебаг АПИ +) спасибо вообщем всё буду тестить |
|
|
Дата: Май 22, 2004 05:22:31 1) устанавливаем собственный обработчик структурных исключений (как именно устанавливаем - в статье "об упаковщиках в последний раз") 2) вызываем исключение, например, обратившить по нулевому поинтеру 3) через контекст дотягиваемся до отладочных регистров 4) устаналиваем аппаратную точку останова на... ну на что нам там нужно ее установить 5) за сим все! |
|
|
Дата: Май 30, 2004 15:41:56 kaspersky это работает??? 8) В смысле есть доступ к dr регистрам??? И под хр?? А то помнится был прикольный баг в мастдае - в обработчике исключения можно было cs менять (если не ошибаюсь изобретение Z0mbie) :) Может тут тоже че-нить можно замутить подобное =) |
|
|
Дата: Май 30, 2004 19:15:57 > это работает??? а чего ему не работать? тот же tElock так и устроен. кстати говоря, описание этого приема есть на wasm'e в статье про упаковищики. довольно распростаненный прием. диспетчер исключений отличает прерывания от исключений, а отладочное исключение это именно исключение, а не прерывание, поэтому если у тебя есть зарегистренный обработчик исключений, ядро передает на него управление. > В смысле есть доступ к dr регистрам??? конечно. кстати, это не единственный способ доступа к ним. вот тот же ms vc studio debugger с юзерскими правами может ставить аппаратные точки останова (см. файл dm.dll в \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin). > И под хр?? а что XP? ты же ставишь точку останова в "своем" адресном пространстве, ну или в адресном пространстве доступного тебе процесса. можно обойтись и без исключений, воспользовавщись SetThreadContext, но во-первых она не без ограничений, а во-вторых ее вызов слищком заметен ;) > А то помнится был прикольный баг в мастдае - в > обработчике исключения можно было cs менять (если не в NT тоже можно. только толку с этого. > Может тут тоже че-нить можно замутить подобное =) в своем адресном пространстве можно делать все. чуть сложнее забраться в чужое, в частности в адресное простарство системы. есть несколько дырок, позволяющих записать в произвольную точку ядра свой код, правда эти дырки обычно прекрываются после их обнародования. легально это можно сделать только череp ASPI/SPTI они действительно позволяют делать что угодно, в смысле позволяют добиться, чтобы блок данных, возвращенный устройством перезаписал память ядра, даже если она только на чтение (DMA чихать на атрибуты страниц). правда, лично мне не удалось создать мобильный код, т.к. содержимое ядра у каждой системы свое и меняется от билда к билду. единственное, что приходит на ум - писать для каждой оси свою реализацию кода, но в моем распоряжении нет столько разных осей ;-( зато вызвать голубой экран смерти с пользовательского уровя - ноу проблем ;) |
|
|
Дата: Май 31, 2004 16:52:27 > в NT тоже можно. только толку с этого. неа нельзя. я пробовал. давно правда, но вроде сегментный регистр обнуляется после подобных попыток ;). А толку что??? Можно изменить cpl (он ведь в селекторе задается ;)) |
|
|
Дата: Май 31, 2004 17:22:50 > неа нельзя. я пробовал. давно правда, > но вроде сегментный регистр обнуляется после подобных попыток ;). > Можно изменить cpl (он ведь в селекторе задается ;)) я, наверное, не совсем понял вопрос. загрузить в cs один из доступных селектров - можно, изменить cpl таким образом - нельзя. |
|
|
Дата: Май 31, 2004 19:54:37 Может я чего не так понял? Я тормоз? Вот вырезка из Зубкова: 10.4.2. Селектор Селектор — это 16-битное число следующего формата: биты 16 – 3: номер дескриптора в таблице (от 0 до 8191) бит 2: 1 — использовать LDT, 0 — использовать GDT биты 1 – 0: запрашиваемый уровень привилегий при обращении к сегменту и текущий уровень привилегий для селектора, загруженного в CS |
|
|
Дата: Май 31, 2004 20:04:01 kaspersky ТЫ ЧЕГО ЛЮДЕЙ ДУРИШЬ???? В смысле есть доступ к dr регистрам??? конечно. кстати, это не единственный способ доступа к ним. вот тот же ms vc studio debugger с юзерскими правами может ставить аппаратные точки останова (см. файл dm.dll в \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin) Доступа к DR-регистрам НАПРЯМУЮ НЕТ. Опосредованно, через структуру CONTEXT для ring-3 и проверкой содержимого в ring-0 - это есть, это да. И аппаратную точку останова можно поставить из ring-3, это да. Но на некоторые биты в DR7 принудительно налагается маска в ring-0. |
|
|
Дата: Май 31, 2004 20:06:32 R4DX А то помнится был прикольный баг в мастдае - в обработчике исключения можно было cs менять А как эту фразу понимать? Менять на что? |
|
|
Дата: Май 31, 2004 20:24:38 > ТЫ ЧЕГО ЛЮДЕЙ ДУРИШЬ???? > Доступа к DR-регистрам НАПРЯМУЮ НЕТ. никого я не дурю. и не надо так кричать. вернись немного назад и почитай, что я предлагал: зарегистрировать свой обработчик, возбудить исключение и исправить контекст, а чуть позже пояснил границы применимости данного метода - свое адресное пространство, или адресное пространство отлаживаемого процесса (но тогда уже нужно действовать SetThrdCntx), даже дал ссылку на dll, в которой это все реализовано - на тот случай, если кто-то не проверит. а использовать mov drx, xxx я и не предлагал, не надо выставлять меня идиотом. > Опосредованно, через структуру CONTEXT для ring-3 и > проверкой содержимого в ring-0 - это есть, ну и покажи мне эту проверку? нету ее в ядре. нету. потому что до чужого адресного пространства ты таким образом все равно не дотянешься (что тут проверять), а про чужое - ясен пень, что тутда руками нельзя. > И аппаратную точку останова можно поставить из ring-3, это да. вот я об этом и говорю. чел. спросил будет ли это работать в XP с прикладного уровя. я ответил, что будет. если ты найдешь XP в которой это не работает (при условии, что там нет левых защитных драйверов), я съем свои лыжи. > Но на некоторые биты в DR7 принудительно налагается маска в ring-0. биты в студию или я не пойму о чем речь. |
|
|
Дата: Май 31, 2004 20:31:10 > Может я чего не так понял? Я тормоз? не знаю. загрузить в cs селктор 23 можно, работать он будет, т.к. оба указывюат на одни и теже ячейки памяти, но это ровным счетом ничего не даст. загрузить в cs селектор 08 тоже можно, но при первом к нему обращении ядро это просечет и даст по лапкам, чтобы не хакерствовали. вот поэтому я и говорю, что это ничего не даст |
|
|
Дата: Май 31, 2004 20:33:38 ну и покажи мне эту проверку? нету ее в ядре. нету. Значит так, разуваем глаза и идем смотреть код NtContinue. На, прямо исходниками тебе в нос.
//
// Set debug register state if specified. If previous mode is user
// mode (i.e. it's a user frame we're setting) and if effect will be to
// cause at least one of the LE (local enable) bits in Dr7 to be
// set (i.e. at least one of Dr0,1,2,3 are active) then set DebugActive
// in the thread object to true. Otherwise set it to false.
//
if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) {
TrapFrame->Dr0 = SANITIZE_DRADDR(ContextFrame->Dr0, PreviousMode);
TrapFrame->Dr1 = SANITIZE_DRADDR(ContextFrame->Dr1, PreviousMode);
TrapFrame->Dr2 = SANITIZE_DRADDR(ContextFrame->Dr2, PreviousMode);
TrapFrame->Dr3 = SANITIZE_DRADDR(ContextFrame->Dr3, PreviousMode);
TrapFrame->Dr6 = SANITIZE_DR6(ContextFrame->Dr6, PreviousMode);
TrapFrame->Dr7 = SANITIZE_DR7(ContextFrame->Dr7, PreviousMode);
if (PreviousMode != KernelMode) {
KeGetPcr()->DebugActive = KeGetCurrentThread()->DebugActive =
(BOOLEAN)((ContextFrame->Dr7 & DR7_ACTIVE) != 0);
}
}
И еще:
//
// Masks for Dr7 and sanitize macros for various Dr registers.
//
#define DR6_LEGAL 0x0000e00f
#define DR7_LEGAL 0xffff0155 // R/W, LEN for Dr0-Dr4,
// Local enable for Dr0-Dr4,
// Le for "perfect" trapping
#define DR7_ACTIVE 0x00000055 // If any of these bits are set, a Dr is active
#define SANITIZE_DR6(Dr6, mode) ((Dr6 & DR6_LEGAL));
#define SANITIZE_DR7(Dr7, mode) ((Dr7 & DR7_LEGAL));
#define SANITIZE_DRADDR(DrReg, mode) ( \
(mode) == KernelMode ? \
(DrReg) : \
(((PVOID)DrReg <= MM_HIGHEST_USER_ADDRESS) ? \
(DrReg) : \
(0) \
) \
)
А теперь я хотел бы насладится зрелищем того, как ты будешь есть свои лыжи :))) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054 |