Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых)

 eXeL@B —› Программирование —› Перехват прерываний и исключений
. 1 . 2 . 3 . 4 . 5 . 6 . 7 . >>
Посл.ответ Сообщение

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 15:35
· Личное сообщение · #1

Руководствуясь Хоглундом и Батлером на тему перехват прерываний и исключений , написать и запустить драйвер получается но перехват не выходит, пытался перехватить как 0x04 OF так и 0x13 ошибки доступа к памяти, запускал на VB xp 32 с одним процессором, но увы, не опытность даёт знать, вот код на Си который вышел:

init.c:
Code:
  1. #include <ntddk.h>
  2. #include "IDT.c"
  3.  
  4. #define MAKELONG( a , b )( ( LONG ) ( ( ( USHORT ) ( a ) ) | ( ( ULONG ) ( ( USHORT ) ( b ) ) ) << 16 ) )
  5.  
  6. #define NT_SYSTEM_SERVICE_INT 0x13
  7.  
  8. ULONG RealSystemPtr;
  9.  
  10. void MyInt()
  11. {
  12.          __asm
  13.          {
  14.                  pushad
  15.                  pushfd
  16.                  push fs
  17.                  mov bx , 0x30
  18.                  mov fs , bx
  19.                  push ds
  20.                  push es
  21.          }
  22.          
  23.          DbgPrint("Is MyInt");
  24.          
  25.          __asm
  26.          {
  27.                  pop es
  28.                  pop ds
  29.                  pop fs
  30.                  popfd
  31.                  popad
  32.                  jmp RealSystemPtr;
  33.          }
  34. }
  35.  
  36. void Hook()
  37. {
  38.          IDTINFO idt_info;
  39.          IDTENTRY * idt_entries;
  40.          IDTENTRY * int2_entry;
  41.          
  42.          __asm sidt idt_info
  43.          
  44.          idt_entries = ( IDTENTRY * ) MAKELONG( idt_info.LowIDTbase , idt_info.HiIDTbase );
  45.          
  46.          RealSystemPtr = MAKELONG( idt_entries[ NT_SYSTEM_SERVICE_INT ].LowOffset ,
  47.                                                                              idt_entries[ NT_SYSTEM_SERVICE_INT ].HiOffset );
  48.                                                                                     
  49.          int2_entry = &idt_entries[ NT_SYSTEM_SERVICE_INT ];
  50.          
  51.          __asm
  52.          {
  53.                  cli
  54.                  lea eax , MyInt
  55.                  mov ebx , int2_entry
  56.                  mov [ ebx ] , ax 
  57.                  shr eax , 16
  58.                  mov [ ebx + 6 ] , ax
  59.                  sti
  60.          }
  61.  
  62. void DriverUnload( IN PDRIVER_OBJECT DriverObject );
  63.  
  64. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject , IN PUNICODE_STRING RegPath )
  65. {
  66.          DriverObject -> DriverUnload = DriverUnload;
  67.          Hook();
  68.          return STATUS_SUCCESS;
  69. }
  70.  
  71. void DriverUnload( IN PDRIVER_OBJECT DriverObject )
  72. {
  73.          DbgPrint("Bye!\n");
  74. }


IDT.c
Code:
  1. typedef struct
  2. {
  3.          USHORT IDTLimit;
  4.          USHORT LowIDTbase;
  5.          USHORT HiIDTbase;
  6. }        IDTINFO ;
  7.  
  8. #pragma pack( push , 1 )
  9. typedef struct
  10. {
  11.          USHORT LowOffset;
  12.          USHORT selector;
  13.          UCHAR   unused_lo;
  14.          unsigned char unused_hi : 5;
  15.          unsigned char DPL : 2;
  16.          unsigned char P : 1;
  17.          USHORT HiOffset;
  18. } IDTENTRY ;
  19. #pragma pack( pop )




Ранг: 44.8 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 16:15
· Личное сообщение · #2

погугли, кода перехвата ISR в инете валом
на первый взгляд не вижу iretd

| Сообщение посчитали полезным: MickeyBlueEyes

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 16:25
· Личное сообщение · #3

Ну функция перехвата как минимум не срабатывает.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 09 декабря 2013 16:29 · Поправил: ARCHANGEL
· Личное сообщение · #4

MickeyBlueEyes
Проверьте, правильно ли установился перехват. Например, через RKU посмотрите, каков теперь адрес у перехваченного обработчика. Далее каждый процессор имеет свою idt, вы уверены, что перехватили её на том, на котором исполняете код и ждёте срабатывания?

SegFault пишет:
на первый взгляд не вижу iretd

Code:
  1.          __asm
  2.          {
  3.                  pop es
  4.                  pop ds
  5.                  pop fs
  6.                  popfd
  7.                  popad
  8.                  jmp RealSystemPtr; // какбэ намекает
  9.          }


-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: MickeyBlueEyes


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 09 декабря 2013 16:29 · Поправил: Dr0p
· Личное сообщение · #5

MickeyBlueEyes

1. Каждый камень имеет свои таблицы IDT, GDT, TSS, KPCR(софтверная). Посему нужно на всех камнях их изменить. Тут есть множество методов, основные:
IDT.
o В цикле енум аффинитета(KeQueryActiveProcessors() -> KAFFINITY), установка его для текущего потока(KeSetSystemAffinityThread()). Затем модификация IDT.
o Посылка межпроцессорных прерываний(IPI). KeIpiGenericCall etc. Выполняется в синхронной манере, но не универсально(нет экспорта в младших версиях). Это использует ядро для загрузки например msr.
o Получение списка IDT. Тут метод тоже несколько, из GDT, из PCR, из массивов HAL или KiAbiosGdt[]. Во всех случаях нужен парсер кода.
o Ожидание свича на новый камень. Где то в произвольном коде ожидается переключение потока на новый камень и блокировка переключения(raise irql/cli).

Используйте первый метод, так как он прост.

2. т-процессинг:
- На стеке IRET-фрейм. Для трапов сохраняется код ошибки. Посему необходимо выделить поле на стеке для приведения к одной структуре.
- Сохраняем RGP.
- Сохраняем селекторы.
- Загружаем ссылку на KPCR(Fs: KGDT_R0_PCR).
- Выравниваем стек. Если происходит переключение мода(r3 -> r0), стек загружается из KTSSS.Esp0. Если свича нет(фолт/интеррапт в кернел), то стек используется текущий. А он может быть не выравнен. Что далее может вызвать проблемы.
- Заканчиваем список SEH-фреймов: PCR.ExceptionList -> -1, иначе фолт может быть развёрнут вне текущего кода. Также сех не будет обработан если стек не выравнен(r0).

Следует использовать структуру KTRAP_FRAME, это системный контекст. Её даже необходимо использовать, так например окончание обработки(Kei386EoiHelper()) потребует эту структуру. Да и нельзя вне её юзать системный функционал.

Также нужно сохранить предыдущий вектор.

Для #PF бессмысленно юзать дбгпринт, система захлебнётся в лучшем случае, в хучшем будет синь из за оверфлова стека, память отгружаема.

| Сообщение посчитали полезным: MickeyBlueEyes

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 17:01
· Личное сообщение · #6

Dr0p пишет:
Для #PF бессмысленно юзать дбгпринт, система захлебнётся в лучшем случае, в хучшем будет синь из за оверфлова стека, память отгружаема.

А если своя обёртка для записи в файл типа LogWrite , так можно?




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 09 декабря 2013 17:04
· Личное сообщение · #7

MickeyBlueEyes

Для этого вектора - нет.



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 17:05
· Личное сообщение · #8

ARCHANGEL пишет:
Далее каждый процессор имеет свою шidt, вы уверены, что перехватили её на том, на котором исполняете код и ждёте срабатывания?
Ну запускаю VM с одним процессором, проверял в kernel mode , то всегда доступен только 1 процессор.



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 17:07
· Личное сообщение · #9

Dr0p
Понял, спасибо.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 декабря 2013 17:14
· Личное сообщение · #10

XP x86, что мешает взять отладчик и посмотреть свой же кодес?



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 17:24
· Личное сообщение · #11

Archer
Нету навыков отладки ядра.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 09 декабря 2013 17:25 · Поправил: Dr0p
· Личное сообщение · #12

Archer

Так а что смотреть то, дескриптор не корректный. 1000111X должны быть i[15%8]. Либо его адрес(IDT_BASE[N*8], база через sidt/pcr получается).



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 09 декабря 2013 19:56
· Личное сообщение · #13

Пока начал ковырять этот же вариант, испробывал перехватывать прерывания от клавиатуры, то тут перехват получается, а с 0x04 нет, с вызовом фций в перехватчике то виснет виртуалка, не БСОД. Короче да вызывать ничего не получится, если только фильтр какойто.
Упростил код, вышло щас так так:

Code:
  1. #define NT_SYSTEM_SERVICE_INT 0x31
  2.  
  3. #define MAKELONG( a , b )( ( LONG ) ( ( ( USHORT ) ( a ) ) | ( ( ULONG ) ( ( USHORT ) ( b ) ) ) << 16 ) )
  4.  
  5. ULONG RealSystemPtr;
  6.  
  7. typedef struct
  8. {
  9.          USHORT IDTLimit;
  10.          USHORT LowIDTbase;
  11.          USHORT HiIDTbase;
  12. }        IDTINFO ;
  13.  
  14. #pragma pack( push , 1 )
  15. typedef struct
  16. {
  17.          USHORT LowOffset;
  18.          USHORT selector;
  19.          UCHAR   unused_lo;
  20.          unsigned char unused_hi : 5;
  21.          unsigned char DPL : 2;
  22.          unsigned char P : 1;
  23.          USHORT HiOffset;
  24. } IDTENTRY ;
  25. #pragma pack( pop )
  26.  
  27.  
  28. __declspec( naked ) MyInt()
  29. {
  30.          __asm
  31.          {
  32.                  pushad
  33.                  pushfd
  34.                  
  35.                  //Тута код
  36.                  
  37.                  popfd
  38.                  popad
  39.                  jmp RealSystemPtr;
  40.          }
  41. }
  42.  
  43.  
  44. void UnHook()
  45. {
  46.          IDTINFO info;
  47.          IDTENTRY * entries;
  48.          
  49.          __asm sidt info
  50.          
  51.          entries = ( IDTENTRY * ) MAKELONG( info.LowIDTbase ,info.HiIDTbase );
  52.          
  53.          __asm cli
  54.          
  55.          entries[ NT_SYSTEM_SERVICE_INT ].LowOffset = ( USHORT )RealSystemPtr;
  56.          entries[ NT_SYSTEM_SERVICE_INT ].HiOffset = ( USHORT )( ( ULONG )RealSystemPtr >> 16 );
  57.          
  58.          __asm sti
  59.          
  60. }
  61.  
  62. void Hook()
  63. {
  64.          IDTINFO idt_info;
  65.          IDTENTRY * idt_entries;
  66.          
  67.          __asm sidt idt_info
  68.          
  69.          idt_entries = ( IDTENTRY * ) MAKELONG( idt_info.LowIDTbase , idt_info.HiIDTbase );
  70.          
  71.          RealSystemPtr = MAKELONG( idt_entries[ NT_SYSTEM_SERVICE_INT ].LowOffset ,
  72.                                                                              idt_entries[ NT_SYSTEM_SERVICE_INT ].HiOffset );
  73.  
  74.          DbgPrint("%u", RealSystemPtr);
  75.  
  76.          __asm cli
  77.  
  78.          idt_entries[ NT_SYSTEM_SERVICE_INT ].LowOffset = ( USHORT )MyInt;
  79.          idt_entries[ NT_SYSTEM_SERVICE_INT ].HiOffset =  ( USHORT )( ( ULONG )MyInt >> 16 );
  80.          
  81.          __asm sti


Мне нужно обратывать исключения 0x04, наверное есть же специальная ф-ция ? Может кто знает её index в STD , буду признателен, или подскажите пжл отладчик ядра ( Syser loader? или есть ищё что то?).
0x04 должна же обрабатывать такое как если я в UserMode установил в програме определёный участок памяти VirtualProctect - PAGE_NOACCESS , и к нему попытаюься обратится.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 09 декабря 2013 23:59 · Поправил: Dr0p
· Личное сообщение · #14

MickeyBlueEyes

> Короче да вызывать ничего не получится

Получится после формирования тфрейма. Тогда можно даже размаскировать прерыванья.

> Мне нужно обратывать исключения 0x04, наверное есть же специальная ф-ция ? Может кто знает её index в STD

Что значит обрабатывать, это ловушка для Into.

> подскажите пжл отладчик ядра

Виндбг на виртуалке, я например его очень редко использую, обычно хватает сиськи.

> VirtualProctect - PAGE_NOACCESS

Нет, это не тот вектор. Вам нужен #PF(14-й дескриптор).

Лучше задачу огласите, что это вы делаете ?

Если вы хотите отслеживать в юзермодной памяти пэйджфолт, то универсальный способ для этого - в юзермоде обработать в VEH. Это и недетект и совместимо с x64, да и ядро трогать не нужно



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 декабря 2013 11:58
· Личное сообщение · #15

Да 0x14 , то уже путаться начал. Ну таким способом хочу установить перехват необходимых ф-ций нужного мне процесса, не затрагивая сам процесс , ну чтобы без палева ) Не знаю пока, реально ли )



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 10 декабря 2013 12:52
· Личное сообщение · #16

MickeyBlueEyes пишет:
установить перехват необходимых ф-ций нужного мне процесса


MickeyBlueEyes пишет:
PAGE_NOACCESS


Быстродействие процесса сильно просядет, особенно если функция частоиспользуемая, или будет находиться на одной странице с таковой.



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 декабря 2013 13:01
· Личное сообщение · #17

Veliant пишет:
Быстродействие процесса сильно просядет, особенно если функция частоиспользуемая, или будет находиться на одной странице с таковой.

Используется примерно 1-2 раза в секунду.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 10 декабря 2013 13:11
· Личное сообщение · #18

Veliant

Никак на быстродействии не скажется если маршрутизировать.

MickeyBlueEyes

Что за функа ?



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 декабря 2013 13:16 · Поправил: MickeyBlueEyes
· Личное сообщение · #19

.



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 декабря 2013 22:56
· Личное сообщение · #20

Ошибка была в невнимательности ))) Вместо того чтобы использовать 14, я сунул 0x14 )))) Итого потратил 2 дня, зато многое познаётся в таких вот банальных и смешных ошибках ))) Лучше руководства как потратить 2 дня и не придумаешь ) Сейчас всё работает, всем спасибо ) Будьте внимательны )




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 11 декабря 2013 00:36 · Поправил: Dr0p
· Личное сообщение · #21

MickeyBlueEyes

И как вы планируете выполнять код в N/A памяти, трассировать и снимать/ставить атрибуты страницы ?

Как быть с многопоточностью ?

Извращенье полнейшее, не нужно в ядро лезть для сей задачи. Поточная маршрутизация рулит, один экспорт - один фолт.

И си у вас ну никак не катит для реализации.

df92_11.12.2013_EXELAB.rU.tgz - Reloc.zip

| Сообщение посчитали полезным: MickeyBlueEyes

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 декабря 2013 10:30
· Личное сообщение · #22

Dr0p пишет:
И как вы планируете выполнять код в N/A памяти, трассировать и снимать/ставить атрибуты страницы ?

Пока не знаю )
Dr0p пишет:
Поточная маршрутизация рулит, один экспорт - один фолт.

В двух словах, если не сложно )
Dr0p пишет:
И си у вас ну никак не катит для реализации.

Значить будет asm )



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 11 декабря 2013 11:03
· Личное сообщение · #23

MickeyBlueEyes пишет:
В двух словах, если не сложно )

Если в кратце посмотреть приложенные сорцы, то предлагается сделать в памяти копию модуля в котором находится функция, установить VEH обработчик, поставить N/A на страницу памяти с функцией и при срабатывании сравнивать адрес в VEH. Если совпало - менять адрес EIP на копию, для того чтоб выполнялось дальше без срабатывания N/A.

Вообще проще тогда хардварный бряк+VEH сделать. Или если это API-функция, то подменить адрес в таблице импорта на свой обработчик.

| Сообщение посчитали полезным: Dr0p

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 декабря 2013 11:21
· Личное сообщение · #24

Veliant пишет:
Или если это API-функция, то подменить адрес в таблице импорта на свой обработчик.

Да, но нельзя, авер запалит.
Попробую для начала с бряком так как проще.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 11 декабря 2013 11:22 · Поправил: Dr0p
· Личное сообщение · #25

Veliant

В целом так, но код избыточен - обычно нет необходимости релоцировать модуль, можно просто как строку в буфер всю секцию кода скопировать(так как нет относительных ветвлений за пределы проекции; IAT в той же секции. Для нтдлл так не желательно, есть очень большая вероятность что код модифицирован относительным ветвлением. Так же user32 и kernel32 не релокабельны, лодер выведет сообщение о фейле).




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 11 декабря 2013 11:30
· Личное сообщение · #26

MickeyBlueEyes

Железячные точки останова - нестабильность. Хотя бы потому, что их EMET юзает, они уже используются для защиты.



Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 декабря 2013 11:41
· Личное сообщение · #27

Dr0p
Железячные точки останова - нестабильность. Хотя бы потому, что их EMET юзает, они уже используются для защиты.
Тогда всё таки лучше в этой теме разобраться?
Если в кратце посмотреть приложенные сорцы, то предлагается сделать в памяти копию модуля в котором находится функция, установить VEH обработчик, поставить N/A на страницу памяти с функцией и при срабатывании сравнивать адрес в VEH. Если совпало - менять адрес EIP на копию, для того чтоб выполнялось дальше без срабатывания N/A.




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 11 декабря 2013 11:44 · Поправил: Dr0p
· Личное сообщение · #28

MickeyBlueEyes

Поточная маршрутизация в этом случае самый норм метод. Если фолт в диапазоне адресов N/A страницы, то корректируем rEip на дельту адресов. Это просто, быстро и недетект.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 11 декабря 2013 11:51 · Поправил: Veliant
· Личное сообщение · #29

Dr0p пишет:
Это просто, быстро

Что-то у меня большие сомнения по этому поводу. Архитектурно права доступа ставятся на всю страницу (как правило 4кб) и если в этой странице будут еще какие-нибудь функции для работы с памятью/файлами, которые часто дергаются, то у тебя просядет все же быстродействие из-за постоянных переключений в ядро/обратно и проверки адреса.

Хотя признаю, идея передавать управление копии страницы гениальна, и это значительно разгрузит процессор.

| Сообщение посчитали полезным: MickeyBlueEyes

Ранг: 51.6 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 декабря 2013 11:54
· Личное сообщение · #30

Dr0p
Спасибо, буду пробовать.


. 1 . 2 . 3 . 4 . 5 . 6 . 7 . >>
 eXeL@B —› Программирование —› Перехват прерываний и исключений
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати