|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 15, 2004 18:30:24 Отладочные регистры |
|
|
Дата: Апр 15, 2004 18:32:17 |
|
|
Дата: Апр 15, 2004 18:32:42 народ как мне отлавливать обращения к данным через DR я понял а вот как полноценно настроить чтоб после прерывания начал мой код выполняться... примеры есть - чтоб народ не боломутить можно на мыло... swan@mne.ru |
|
|
Дата: Апр 15, 2004 18:38:28 да описания есть.. мне б примерчик... я вот хочу отслеживать с каких адресов идет обращение к моим данным... сделал драйверок ring0 а что то с IDTR пока не получается... походу прерывание номер 2 а как настроить чтоб мой код выполнялся я пока рабочее не получил... MAX делись опытом !!! |
|
|
Дата: Апр 15, 2004 19:06:44 Объяснения архи-хреновые. Я абсолютно ничего не понял. Примеры использования DR-регистров есть в rootkit. Примеры лежат в секции софта на этом же сайте - искать ты совсем ничего не умеешь. Основной смысл -> в наложении правильной маски на DR7. Потом пихаешь свой адрес в DR0-3 и будет тебе счастье. |
|
|
Дата: Апр 17, 2004 13:23:37 · Поправил: Безпощадный даос 1. необходимо при обращении (чтении/записи) к определенным ячейкам памяти определить какие процессы обращаются к этим ячейкам. 2. для этого написан драйвер RING_0 (чтоб на ring_0 и работать) иначе привелегированные команды вызовут исключения. 3. настроил я DR0 на нужный адрес, настроил я DR7 на нужный тип. 4. теперь смотрю кудаже настроена шлюз-ловушка. если не путаю то сработает 2-е прерывание. 5. смотрю IDTR чтоб понять куда пойдет выполнение. 6. разобрал эти 8 байт - посмотрел (8 селектор, смещение, база). все идет на код 32 с фрагом доступа RE. 7. делаю в своем драйвере подпрограмму и пытаюсь настроить 2-е прерывание в таблице IDTR на адрес моей подпрограммы 8. - все помирает...естественно... - интересно кто нить таким баловался... - интересно можт настроить GDT? или не шлюз-ловушку а через TSS должно работать... в общем я хочу чтоб при обращении к ячейке памяти - вызывающий процесс остановился и начал выполняться мой код на ring_0/ теперь понятно.... пиши swan@mne.ru |
|
|
Дата: Апр 19, 2004 18:22:55 · Поправил: volodya 1/2 - понятно. 3 - понятно - см. функцию int dbProtect (int reg, int addr, int len, int protection) в dbprotect.c - утилита PatchFinder for Windows 2000 - rootkit.com 4 - когда происходит это твое прерывание? DR возбуждает int 1! 5 - на адрес обработчика в IDT 7 - на хера тебе 2 прерывание? |
|
|
Дата: Апр 19, 2004 19:22:27 · Поправил: Безпощадный даос ОК ...мылом значит не хочешь.. ну пусить народ над нами смеется :) 1/2 - понятно. (поздравляю) 3 - понятно - см. функцию int dbProtect (int reg, int addr, int len, int protection) в dbprotect.c - утилита PatchFinder for Windows 2000 - rootkit.com (замечательно - зачем это надо ? я на асме делаю...и какую проблему это решает...) 4 - когда происходит это твое прерывание? DR возбуждает int 1! (круто - есть еще int 0, так что я написал 2 прерывание - посчету..."прерывание отладки" мнемоника DB) 5 - на адрес обработчика в IDT (- не обязательно - можт TSS или LDT - доки полистай !!!) 7 - на хера тебе 2 прерывание? (да уж....) итого я хотел узнать что то - узнал что пальцы веером... :) ты мне скажи как мне после выполнения вот этого в драйвере попасть на метку...(go:) SIDT diskr; jmp rrr assa db 1 diskr db 0,0,0,0,0,0,0,0 rrr: mov eax,offset assa mov dr0,eax mov eax,dr7 or eax,0000B0003h mov dr7,eax mov assa,al jmp xxx go: |
|
|
Дата: Апр 19, 2004 20:09:10 · Поправил: Quantum swan_pro Зачем было заполнять IDTR через sidt, если эта таблица дальше не используется? Чтоб зарегистрировать обработчик 2го прерывания, так? Тогда где этот код??? Должно быть что-то в этом роде: mov eax,dword ptr [diskr+2] add eax,16 ; 2е прерывание ; тут желательно сохранить адрес ; оригинального обработчика int 2 mov edx,go mov word ptr [eax],dx shr edx,16 mov word ptr [eax+6],dx |
|
|
Дата: Апр 19, 2004 20:12:07 · Поправил: volodya Quantum Абсолютно верно!
void setIntHandler (int vec, int newHandler) {
IDTR idtr;
PIDTGATE idt;
__asm {
cli;
sidt idtr;
}
idt = (PIDTGATE) idtr.base;
idt[vec].off2 = newHandler >> 16;
idt[vec].off1 = newHandler & 0xffff;
__asm{
sti;
}
}
|
|
|
Дата: Апр 19, 2004 20:14:06 А последовательность действий простая. 1) Узнать адрес обработчика 2) Поставить свой обработчик 3) Поставить адрес в DR0-3 4) Маску в DR7 5) Ждать... Код: origDebugHandler = getIntHandler (NT_DEBUG_INT); setIntHandler (NT_DEBUG_INT, (int)NewDebugHandler1); dbProtect (DB_DR0, (int)getIntGateAddr(NT_DEBUG_INT), DB_LEN_4B, DB_PROT_WRITE); |
|
|
Дата: Апр 19, 2004 20:51:20 volodya Спасибо! Статьи Black Fenix'а кое в чём просвещают и переводчика :-) |
|
|
Дата: Апр 19, 2004 20:53:35 Переводчик тоже не просто переводит ;) Трудолюбивый попался ;) |
|
|
Дата: Апр 20, 2004 21:30:35 Зачем было заполнять IDTR через sidt, если эта таблица дальше не используется? Чтоб зарегистрировать обработчик 2го прерывания, так? Тогда где этот код??? Должно быть что-то в этом роде: (прости но SIDT не заполняет регистр а читает из него. - это не важно потому как все крутится на RING 0 и это я делаю только затем чтоб разобраться - смотрю чо там через софтайс :) mov eax,dword ptr [diskr+2] - согласен add eax,16 ; 2е прерывание - согласен ; тут желательно сохранить адрес ; оригинального обработчика int 2 mov edx,go - ну можт ofset адрес в общем... mov word ptr [eax],dx shr edx,16 mov word ptr [eax+6],dx - все верно... теперь вопросы... 1. мы не посмотрели в EAX+5 поле TYPE в котором может быть не 1111 (в битах) а 0101 (в битах) - и тогда переключение задачи будет не через дискриптор типа шлюза прерывания, а через дискрипрор шлюза задачи... тоесть DW по EAX+2 содержит селектор TSS а почти все остальное зарезервировано... но мы так делать не будем - неудобно с TSS ?? 2. акромя offset (0-15) и offset (31-16) - как в твоем коде.... еще необходимо настроить DW по EAX+2 - там должен лежать selector - селектор целевого сегмента для шлюза задачи !!! - соответственно, если я правильно понимаю я должен определить селектор своего кода и вписать туда его-же... и будет все ОК 3. там еще с защитой сегментов не все ладно... но посмотрим.... я нелюблю базары... потому и спрашиваю... кто нить этим занимался... рабочий код у когото был....? ну ладненько получу - выдам...а пока кто то чего то недочитал недоучил - давайте мылом...чего позориться.... swan@mne.ru |
|
|
Дата: Апр 21, 2004 03:29:36 swan_pro прости но SIDT не заполняет регистр а читает из него. Имеется в виду копия IDTR. Нечего придираться к таким пустякам! mov edx,go - ну можт ofset адрес в общем... На masm32 в данном случае offset не нужен. теперь вопросы... 1. мы не посмотрели в EAX+5 поле TYPE и т.д. Можно конечно перестраховаться и посмотреть остальные поля структуры, но вышеприведенный код у меня прекрасно работает AS IS. Проверял пока только на 9x. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067 |