· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Отладочные регистры

. 1 . 2 . >>

Посл.отвђт Сообщен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.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067