Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Interrupt Descriptor Table - формат, перехват, изменение dpl
. 1 . 2 . >>
Посл.ответ Сообщение


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

Создано: 08 января 2009 22:15 · Поправил: ARCHANGEL
· Личное сообщение · #1

Всем hello, вопрос такой - пишу драйверок для модификации IDT. Драйверок на асме, а документацию нашёл только с примерами на С++ (любимый и ненаглядный язык, как он мне дорог:s1. Может кто поможет доками на асме? Меня интересует структура IDT entrie, т.е. что такое:
Code:
  1. typedef struct
  2. {
  3.       unsigned short LowOffset;
  4.       unsigned short selector;
  5.       unsigned char unused_lo;
  6.       unsigned char segment_type:4; //0x0E is interrupt gate
  7.       unsigned char system_segment_flag:1;
  8.       unsigned char DPL:2; // descriptor privilege level
  9.       unsigned char P:1; // present
  10.       unsigned short HiOffset;
  11. } IDTENTRY;

Можно ли это лицезреть на асме? И на асме примеры с перехватом и модификацией dpl.

Added
В общем, ситуация не много изменилась. Теперь вопрос в обходе антиотладочного трюка, основанного на Int 2D, под олькой.

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




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

Создано: 08 января 2009 22:27 · Поправил: SLV
· Личное сообщение · #2

[deleted]

-----
Shalom ebanats!




Ранг: 8.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 января 2009 22:30
· Личное сообщение · #3

вот толковая статья http://www.wasm.ru/article.php?article=ia32int по прерываниям. синтаксис Фасм.




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

Создано: 08 января 2009 22:30
· Личное сообщение · #4

SLV
Очень содержательно

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





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

Создано: 08 января 2009 22:54
· Личное сообщение · #5

Возник следующий вопрос по сабжу - если изменить бит присутствия для какого-либо прерывания, то при вызове его из ринг-3 будет ли возникать исключение, которое бы возможно было бы обработать через SEH? И не вызовет ли это бсод в случае вызова этого прерывания из ядра?

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





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 января 2009 23:17
· Личное сообщение · #6

половино кода на асме , остальное легко перевести. А вообще как раз для тебя! Половино си половино асм. Постепенно будешь привыкать

717d_08.01.2009_CRACKLAB.rU.tgz - direct_hooking_src.zip

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 января 2009 23:25
· Личное сообщение · #7

Или вот так =) , мож поможет, но по первому примеру лучше. Он не бсодит)

Code:
  1. proc SetInt,INT_ADR,IntNum,Int_alt,option
  2. pushad
  3. ;*********************************************
  4. ;*********** установка обработчика прерывания*
  5. ;*********************************************
  6. cli
  7. mov eax,cr0
  8. push eax
  9. and eax,0xFFFEFFFF ; clear WP
  10. mov cr0,eax
  11. mov al,byte[option]
  12. mov byte[.opt+1],al
  13. ; вычисление адреса
  14. mov eax,[INT_ADR]
  15. mov [.IAdressAll],eax
  16. mov ax,word[.IAdressAll]
  17. mov [.ladr],ax
  18. mov ax,word[.IAdressAll+2]
  19. mov [.hadr],ax
  20. mov [.seg],cs
  21. push ebx      ; получить адрес IDT
  22. sidt [esp-2]
  23. pop  ebx
  24. xor eax,eax
  25. mov al,byte[IntNum]              ; номер прерывания
  26. mov ah,8h
  27. mul ah
  28. add ebx,eax ;8*ints ; адрес int xx
  29. ;сохраним старый адрес Exception
  30. mov edi, [Int_alt]
  31. mov esi, ebx
  32. movsd
  33. movsd
  34. ;установим новый адрес Exception
  35. mov edi, ebx
  36. mov esi, .Int_new
  37. movsd
  38. movsd
  39. sti
  40. pop eax
  41. mov cr0,eax ; restore WP
  42. popad
  43. return
  44. ;*********************************************
  45. ;*********************************************
  46. ;*********************************************
  47. .IAdressAll dd 0
  48. .Int_new:
  49. .ladr        dw 0
  50. .seg         dw 0           ; p AC Type
  51. .opt         db 00000000b,11101110b; 1|11|0|1110|
  52. ;Type GrapG16 -0111; GrapG32 -1111; IntG32 -1110; CallG32 - 1100;
  53. .hadr        dw 0
  54. endp
  55. proc RestoreInt,IntNum,Int_alt
  56. pushad
  57. ;**********************************************************
  58. ;*****************востановим обработчик прерывания*********
  59. ;**********************************************************
  60. cli
  61. mov eax,cr0
  62. push eax
  63. and eax,0xFFFEFFFF ; clear WP
  64. mov cr0,eax
  65. mov [.seg],cs
  66. push ebx      ; получить адрес IDT
  67. sidt [esp-2]
  68. pop  ebx
  69. xor eax,eax
  70. mov al,byte[IntNum]              ; номер прерывания
  71. mov ah,8h
  72. mul ah
  73. add ebx,eax ;8*ints ; адрес int xx
  74. ;восстановим старый адрес Exception
  75. mov edi, ebx
  76. mov esi, [Int_alt]
  77. movsd
  78. movsd
  79. sti
  80. pop eax
  81. mov cr0,eax ; restore WP
  82. popad
  83. return
  84. ;**********************************************************
  85. ;**********************************************************
  86. ;**********************************************************
  87. .IAdressAll dd 0
  88. .Int_new:
  89. .ladr        dw 0
  90. .seg         dw 0           ; p AC Type
  91. .opt         db 00000000b,11101110b; 1|11|0|1110|
  92. ;Type GrapG16 -0111; GrapG32 -1111; IntG32 -1110; CallG32 - 1100;
  93. .hadr        dw 0
  94. endp


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 8.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 января 2009 23:26
· Личное сообщение · #8

>если изменить бит присутствия для какого-либо прерывания
тогда при его вызове будет #NP генерироваться.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 08 января 2009 23:33
· Личное сообщение · #9

Code:
  1. //! IDT entry structure.
  2.  typedef struct idt_entry
  3.  {
  4.          word offset0_15;
  5.          word selector;
  6.          byte paramcnt;
  7.          byte attribs;
  8.          word offset16_31;
  9.  } idt_entry_t;


=) не могу найти мои записи по идт , но это вроде структура, и хранится она в interrupt.h , можешь сам поискать

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





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

Создано: 08 января 2009 23:41
· Личное сообщение · #10

mak
Да, структура, она самая. В Прерываниях в защищенном режиме процессора IA-32 тоже самое, только там расписано, но не обьявлено. Вроде, пошло дело.

_frmn
Ну, будет генерироваться, а дальше-то что?

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




Ранг: 8.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 января 2009 23:56
· Личное сообщение · #11

>Ну, будет генерироваться, а дальше-то что?
в юзермоде можно СЕХом словить. в ядре наверно бсоднет, попробуй




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

Создано: 09 января 2009 11:44
· Личное сообщение · #12

Сейчас изменил dpl и бит присутствия для прерывания int 2Dh, теперь под непатченной олькой без всяких плагинов получаем исключение, но проблема в том, что каким-то образом это всё равно не помогает пройти антиотладку, а вот если использовать фантик с одной только опцией custom handler exception, то всё прекрасно, в чём, блин, разница?

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




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 09 января 2009 14:23 · Поправил: Clerk
· Личное сообщение · #13

ARCHANGEL
Я так понял что конечная цель обработка в юзермоде. Кроме исключения ничего не будет. С такимже успехом можно заюзоть любое из прерываний, для которого DPL = 0, а не юзоть именно KiDebugService. Если нужно сгенерировать STATUS_ACCESS_VIOLATION(ядро разворачивает именно это исключение, если сегмент не присутствует), то можно заюзоть NtRaiseException, либо какуюнибудь инструкцию которая вызовет подобное исключение. Если не секрет, как это связано с антиотладкой ?



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 09 января 2009 14:28 · Поправил: Clerk
· Личное сообщение · #14

Да и есчо, вероятно если блокировать какимлибо образом дескриптор 0x2D прерывания, это приведёт к краху юзермодной оболочки и всей системы, ибо данное прерывание юзоется для вывода отладочных сообщение, к примеру тотже лоадер печатает отладочные сообщения, в данном случае это приведёт к исключению с невозможностью корректного исполнения кода.




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

Создано: 09 января 2009 15:18
· Личное сообщение · #15

Clerk
Цитата из Anti-Reverse Engineering Guide:

The INT 2D instruction can be used as a general purpose debugger detection method, because when executing the instruction, if no debugger is present, an exception will occur. However, if a debugger is present, no exception will occur, and things get interesting based on the debugger you are using. OllyDBG will actually skip a byte in its disassembly and will cause the analysis to go wrong.

Вот так вот это можно заюзать как антидебаг. И правда - в непатченно ольке это прерывание не вызывает исключения, хотя если подпатчить dpl, то исключение всё же вызовется. И пропускать один байт после этого прерывания прога не будет, но что-то не то. А вот про блокировку этого прерывания никто и не говорит, я вообще с битовой маской не разбирался, сделал так -
byte paramcnt;
byte attribs;
вот это вот я инвертировал через not, и записал полученное значение в IDT, и всё работало - и отладчик, и софт всякий, никаких бсодов.

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




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

Создано: 09 января 2009 15:20
· Личное сообщение · #16

ARCHANGEL пишет:
проблема в том, что каким-то образом это всё равно не помогает пройти антиотладку

Проблема не в том, что int2D не генерирует исключение, проблема в том, что олька не верно хэндлит это исключение.
Чтобы пройти антиотладку, надо из плагина подменить код исключения, либо юзать фантом




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

Создано: 09 января 2009 15:30
· Личное сообщение · #17

Psalmopoeus Pulcher
Ну, с фантиком я антидебаг уже прошёл. Ну тут суть показать, как это сделать чисто своими руками. И что значит Проблема не в том, что int2D не генерирует исключение? Получается, что исключение есть, но олька его сама обрабатывает, и поэтому внешне его как бы нет? Т.е., я имею ввиду, что я снимаю галочку на обрботке каких-либо исключений в ольке, стоя на Int 2D жму F7, и в ольке с фантомом оказываюсь в недрах ntdll.dll, а в нетронутой прохожу на EIP+3. Но исключение и в том, и в том случае происходит?

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





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 09 января 2009 15:56 · Поправил: Hellspawn
· Личное сообщение · #18

да, исключение будет в любом случае
Code:
  1. DebugEvent:
  2. dwDebugEventCode 00000001
  3. ...
  4. u.Exception.pExceptionRecord.ExceptionCode    80000003
  5. u.Exception.pExceptionRecord.ExceptionAddress 00453E48
  6. ...
  7. 00453E41    . NOP
  8. 00453E46    . CD 2D                INT 2D
  9. 00453E48    . NOP


-----
[nice coder and reverser]




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 09 января 2009 16:02
· Личное сообщение · #19

"Anti-Reverse Engineering Guide" жалкий ман для школьнегов, фтопку.
Несколько вопросов.
1. Что есть отладка ?
Всмысле, что под ней понимать: трассировку посредством TF, DR, Int3 и пр.
2. Что есть антиотладка ?
Вопрос изходя из вопроса #1
2. Как вызываетсо Int 0x2D ?
Насчёт детекта трассировки, тема заежженая. Тут у вас какието гнилые и не универсальные методы.
Курим всей конторой это:
wasm.ru/forum/viewtopic.php?id=28576&p=1
wasm.ru/forum/viewtopic.php?id=29922&p=1
www.virustech.org/f/viewtopic.php?id=45
А потом вот это:
www.virustech.org/f/viewtopic.php?id=56
Моё ИМХО оля кривая. Я использую Сисер.
Насчёт прерывания:
> Парсить шлюз следует на всех IDT всех процессоров. Исполняется посредством посылки IPI и исполнения парсящего кода на всех процессорах, посылкой DPC, перечислением бит аффинитета потока в цикле и установка его, получение спика указателей на IDT чтением KPCR, что лучше следует выбрать в зависимости от требований к коду.
> Следует установить свой хэндлер, а не просто повысить DPL в шлюзе. В случае повышения DPL, укозатель на ISR будет находится в системном адресном пространстве, а эта память не доступна для юзермода, поэтому при вызове подобного прерывания возникнет исключение по доступу к памяти и хэндлер не будет вызван. Бессмысленные действия это.
оказываюсь в недрах ntdll.dll
Прерывание 0x2D в виндоз криво реализовано и требует на входе определённые параметры, которые передаются через регистры. Документированы следующие сервисы данного прерывания:
#define BREAKPOINT_BREAK 0
#define BREAKPOINT_PRINT 1
#define BREAKPOINT_PROMPT 2
#define BREAKPOINT_LOAD_SYMBOLS 3
#define BREAKPOINT_UNLOAD_SYMBOLS 4
#define BREAKPOINT_COMMAND_STRING 5
А в недрах нтдлл - следует поставить бряк на KiUserExceptionDispatcher(), в стеке контекст диспетчера будет содержать адрес и причину исключения, это так к слову.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 09 января 2009 16:15 · Поправил: Hellspawn
· Личное сообщение · #20

Clerk пишет:
Моё ИМХО оля кривая. Я использую Сисер.


а сусер типо не глючный?? )) по юзабилити сусер нервно курит в сторонке.

да забыл, я в своём примере юзал BREAKPOINT_BREAK
Code:
  1. lea ecx,some_string
  2. mov ecx,[ecx]
  3. xor edx,edx
  4. mov eax,0                  //    ; Service Type here defined as BREAKPOINT_BREAK = 0


-----
[nice coder and reverser]





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

Создано: 09 января 2009 16:29
· Личное сообщение · #21

Hellspawn
Если я тебя правильно понял, то ты хотел сказать, что при dwDebugEventCode=00000001, когда u.Exception.pExceptionRecord.ExceptionCode=80000003 нужно, чтоб u.Exception.pExceptionRecord.ExceptionAddress=EIP+2, так?

Clerk
Syser неплох, но по функционалу до ольки не дотягивает, да и глючит жёстко, во всяком случае у меня.

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




Ранг: 8.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 января 2009 16:33
· Личное сообщение · #22

Clerk, тут чото типа анти-антиотладки делают как йа понил.. тобишь есть антиотладка на основе int2d, они хотят её пройти без проколов



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 января 2009 00:58
· Личное сообщение · #23

_frmn
И это можно назвать антиотладкой хех ))
Я зашёл в этот топик, думол реально механизм достойный внимания обсуждается, оказалось очередной пиар, который не имеет смысла, я до сих пор не понял зачем нужно лезть в дескрипторные таблицы. Кстати, Гордон это ты чтоли, ник сокращённый, сразу не узнать..
All
Сисер значит до ольки по вашему не дотягивает. Ну да, багов хватает, например инструкция std выносит его. Но у кого руки не стого места растут, тому и он плохим будет. Гибкость не сравнить с олей. Тут недавно элито вылажела какойто детский крякми, само собой интересно было взглянуть. Оказалось для ольки это проблема, сисер с этим за пару минут разобралсо..



Ранг: 8.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 января 2009 01:19
· Личное сообщение · #24

Clerk, огаога, тупенький механизм, все детали практически в trap.asm можно глянуть + маны интело. да, это я, полный ник занит должен быть, а к сокращенному без _ йа потерял пасс




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

Создано: 10 января 2009 01:35 · Поправил: ARCHANGEL
· Личное сообщение · #25

_frmn пишет:
тут чото типа анти-антиотладки делают как йа понил.. тобишь есть антиотладка на основе int2d, они хотят её пройти без проколов
Вообще-то да. Именно это и требуется.

Clerk пишет:
думол реально механизм достойный внимания обсуждается, оказалось очередной пиар, который не имеет смысла, я до сих пор не понял зачем нужно лезть в дескрипторные таблицы
Может и не нужно, но я просто не знал, с чего начать. Глянул вышеупомянутый Anti-Reverse Engineering Guide, решил, что проблема в том, что под дебагером Int 2D не генерит исключения, поэтому решил заменить dpl чтоб в юзермоде даже под олькой было исключение. Это, в общем, удалось. Теперь даже под непатченной олькой, если стоя на Int 2D нажать F7, то окажусь в недрах ntdll.dll, но этого мало, а что нужно сделать Hellspawn написал только на понятном ему языке. Я, конечно, просмотрел форум из вышеупомянутых постов, но форум есть форум, там много для моей проблемы ненужного, а может кто-то по делу что-то рабочее предложить?

Added
Хотя нет, не буду так категоричен, полезное и по делу было, понял сказанное, KiUserExceptionDispatcher - то, что нужно. Clerk, Hellspawn - спасибо. Пошёл курить статьи...

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





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 10 января 2009 01:41
· Личное сообщение · #26

ARCHANGEL

я написал не что нужно делать, а с чем это нужно делать, это же исключение, знаачит надо его обработать.

-----
[nice coder and reverser]




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 января 2009 01:46
· Личное сообщение · #27

_frmn
Насчёт трап.асм ты прав. Кстати у меня влетает Int2D с определёнными параметрами в бсод, айпи какойто странный и крэшдамп не могу открыть. Стоит взглянуть, на вт отпощу если это не баги в хуках тогоже сисера.
ARCHANGEL
Безнадёжно. Что есть дебуггер так я и не понял. Удачи.)




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

Создано: 10 января 2009 01:59
· Личное сообщение · #28

Clerk пишет:
А в недрах нтдлл - следует поставить бряк на KiUserExceptionDispatcher(), в стеке контекст диспетчера будет содержать адрес и причину исключения
Но я так понимаю, делать это надо не в ольке - т.к. там бряк такой не сработает при Step into на Int 2D, а как, другой дебаггер подключать?

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




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 января 2009 02:32
· Личное сообщение · #29

хз я не понял что нужно сделоть, уже несколько раз спросил. Заюзой NtContinue и забудь про дебугапи, либо похукай APC-диспетчер и исполняйся в потоке который принадлежит отладчику




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

Создано: 10 января 2009 10:31
· Личное сообщение · #30

Clerk
Дело в том, что мне нужно не пройти отладку в принципе, Syser её так проходит и ничего делать не надо. Надо пройти антидебаг под олькой, причём непатченной и без всяких плагинов для сокрытия последней. Так что забыть про дебаг АПИ не получится. Но я так понимаю, что ольку надо править при обработке событий через WaitForDebugEvent, т.е. её цикл обработки этих самых ивентов, я прав?

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



. 1 . 2 . >>
 eXeL@B —› Программирование —› Interrupt Descriptor Table - формат, перехват, изменение dpl
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати