Сейчас на форуме: 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 )





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

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

Veliant

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

> функции для работы с памятью/файлами

Например сайд - все сервисы в системе генерят фолт, но визуально это не заметно даже на моей бородатой машине




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

Создано: 12 декабря 2013 04:01
· Личное сообщение · #3

MickeyBlueEyes

Ну что, получилось ?

Как решили реализовать ?



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

Создано: 14 декабря 2013 15:12 · Поправил: MickeyBlueEyes
· Личное сообщение · #4

Dr0p

Ну что, получилось ?

Как решили реализовать ?


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



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

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

Вообщем

Я перехватываю KiDispatchException и в перехватчике мне надо воспользоватся NtOpenProcess() для процесса где произошло исключение, ну и потом поставить на страницу нужные мне права и return, но я не могу по странной как по мне причине вызвать NtOpenProcess(). PsGetCurrentProcess() - возвращает процесс где произошло исключения, всё норм.
Вообщем сразу как происходит исключение, я в перехватчике делаю так:
Code:
  1. __asm cli
  2. UnHook("KiDispatchException");
  3. __asm sti


Потом мне нужно открыть этот процесс.
Вызываю так:

Code:
  1. OBJECT_ATTRIBUTES oa = { sizeof ( oa ) };
  2. CLIENT_ID cid = { PsGetCurrentProcessId( ) , 0 };
  3. HANDLE hTarget = 0;
  4. NtOpenProcess( &hTarget , 0x08 , &oa , &cid );


NtOpenProcess - возвращает не STATUS_SUCCESS.

И тут главное, если убрать это:
Code:
  1. __asm cli
  2. UnHook("KiDispatchException");
  3. __asm sti

И переполнение стека будет как я понял и вылетает система.

!analyze -v
Code:
  1. STACK_TEXT:  
  2. f2645050 f2689a5c f264507c 00000008 f2645080 nt!_SEH_prolog+0x1a
  3. WARNING: Stack unwind information not available. Following frames may be wrong.
  4. f26450a8 8053e081 f26450c4 00000000 f2645118 initDriver+0xa5c
  5. f2645110 8053e032 f264526c 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  6. f2645118 805c12d6 badb0d00 f26452b4 00000000 nt!KiExceptionExit+0x18a
  7. f264526c f2689a5c f2645298 00000008 f264529c nt!NtOpenProcess+0x40
  8. f26452c4 8053e081 f26452e0 00000000 f2645334 initDriver+0xa5c
  9. f264532c 8053e032 f2645488 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  10. f2645334 805c12d6 badb0d00 f26454d0 00000000 nt!KiExceptionExit+0x18a
  11. f2645488 f2689a5c f26454b4 00000008 f26454b8 nt!NtOpenProcess+0x40
  12. f26454e0 8053e081 f26454fc 00000000 f2645550 initDriver+0xa5c
  13. f2645548 8053e032 f26456a4 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  14. f2645550 805c12d6 badb0d00 f26456ec 00000000 nt!KiExceptionExit+0x18a
  15. f26456a4 f2689a5c f26456d0 00000008 f26456d4 nt!NtOpenProcess+0x40
  16. f26456fc 8053e081 f2645718 00000000 f264576c initDriver+0xa5c
  17. f2645764 8053e032 f26458c0 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  18. f264576c 805c12d6 badb0d00 f2645908 00000000 nt!KiExceptionExit+0x18a
  19. f26458c0 f2689a5c f26458ec 00000008 f26458f0 nt!NtOpenProcess+0x40
  20. f2645918 8053e081 f2645934 00000000 f2645988 initDriver+0xa5c
  21. f2645980 8053e032 f2645adc 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  22. f2645988 805c12d6 badb0d00 f2645b24 00000000 nt!KiExceptionExit+0x18a
  23. f2645adc f2689a5c f2645b08 00000008 f2645b0c nt!NtOpenProcess+0x40
  24. f2645b34 8053e081 f2645b50 00000000 f2645ba4 initDriver+0xa5c
  25. f2645b9c 8053e032 f2645cf8 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  26. f2645ba4 805c12d6 badb0d00 f2645d40 00000000 nt!KiExceptionExit+0x18a
  27. f2645cf8 f2689a5c f2645d24 00000008 f2645d28 nt!NtOpenProcess+0x40
  28. f2645d50 8053e081 f2645d6c 00000000 f2645dc0 initDriver+0xa5c
  29. f2645db8 8053e032 f2645f14 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  30. f2645dc0 805c12d6 badb0d00 f2645f5c 00000000 nt!KiExceptionExit+0x18a
  31. f2645f14 f2689a5c f2645f40 00000008 f2645f44 nt!NtOpenProcess+0x40
  32. f2645f6c 8053e081 f2645f88 00000000 f2645fdc initDriver+0xa5c
  33. f2645fd4 8053e032 f2646130 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  34. f2645fdc 805c12d6 badb0d00 f2646178 00000000 nt!KiExceptionExit+0x18a
  35. f2646130 f2689a5c f264615c 00000008 f2646160 nt!NtOpenProcess+0x40
  36. f2646188 8053e081 f26461a4 00000000 f26461f8 initDriver+0xa5c
  37. f26461f0 8053e032 f264634c 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  38. f26461f8 805c12d6 badb0d00 f2646394 00000000 nt!KiExceptionExit+0x18a
  39. f264634c f2689a5c f2646378 00000008 f264637c nt!NtOpenProcess+0x40
  40. f26463a4 8053e081 f26463c0 00000000 f2646414 initDriver+0xa5c
  41. f264640c 8053e032 f2646568 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  42. f2646414 805c12d6 badb0d00 f26465b0 00000000 nt!KiExceptionExit+0x18a
  43. f2646568 f2689a5c f2646594 00000008 f2646598 nt!NtOpenProcess+0x40
  44. f26465c0 8053e081 f26465dc 00000000 f2646630 initDriver+0xa5c
  45. f2646628 8053e032 f2646784 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  46. f2646630 805c12d6 badb0d00 f26467cc 00000000 nt!KiExceptionExit+0x18a
  47. f2646784 f2689a5c f26467b0 00000008 f26467b4 nt!NtOpenProcess+0x40
  48. f26467dc 8053e081 f26467f8 00000000 f264684c initDriver+0xa5c
  49. f2646844 8053e032 f26469a0 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  50. f264684c 805c12d6 badb0d00 f26469e8 00000000 nt!KiExceptionExit+0x18a
  51. f26469a0 f2689a5c f26469cc 00000008 f26469d0 nt!NtOpenProcess+0x40
  52. f26469f8 8053e081 f2646a14 00000000 f2646a68 initDriver+0xa5c
  53. f2646a60 8053e032 f2646bbc 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  54. f2646a68 805c12d6 badb0d00 f2646c04 00000000 nt!KiExceptionExit+0x18a
  55. f2646bbc f2689a5c f2646be8 00000008 f2646bec nt!NtOpenProcess+0x40
  56. f2646c14 8053e081 f2646c30 00000000 f2646c84 initDriver+0xa5c
  57. f2646c7c 8053e032 f2646dd8 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  58. f2646c98 805002c3 f2646cf8 f2646d78 81f58020 nt!KiExceptionExit+0x18a
  59. f2646dd8 f2689a5c f2646e04 00000008 f2646e08 nt!KiContinue+0x99
  60. f2646e30 8053e081 f2646e4c 00000000 f2646ea0 initDriver+0xa5c
  61. f2646e98 8053e032 f2646ff4 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  62. f2646ee4 80535788 f2646fe4 00000030 f2646fd0 nt!KiExceptionExit+0x18a
  63. f2646ff4 f2689a5c f2647020 00000008 f2647024 nt!_global_unwind2+0x18
  64. f264704c 8053e081 f2647068 00000000 f26470bc initDriver+0xa5c
  65. f26470b4 8053e032 f2647210 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  66. f2647100 80535788 f2647200 80530030 f26471ec nt!KiExceptionExit+0x18a
  67. f2647210 f2689a5c f264723c 00000008 f2647240 nt!_global_unwind2+0x18
  68. f2647268 8053e081 f2647284 00000000 f26472d8 initDriver+0xa5c
  69. f26472d0 8053e032 f264742c 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  70. f2647364 805e6038 00100020 e16c3d48 e16c3d48 nt!KiExceptionExit+0x18a
  71. f264742c f2689a5c f2647458 00000008 f264745c nt!SepAccessCheck+0x1bc
  72. f2647484 8053e081 f26474a0 00000000 f26474f4 initDriver+0xa5c
  73. f26474ec 8053e032 f2647648 805c12d6 badb0d00 nt!CommonDispatchException+0x4d
  74. f2647504 f842a4b1 e1369008 00100020 f2647860 nt!KiExceptionExit+0x18a
  75. f2647648 f2689a5c f2647674 00000008 f2647678 Ntfs!NtfsOpenAttributeInExistingFile+0x528
  76. f26476a0 8053e081 f26476bc 00000000 f2647710 initDriver+0xa5c
  77. f2647708 8053e032 f2647864 805c12d6 badb0d00 nt!CommonDispatchException+0x4d


Таким образом я понял что исключения происходит ещё и в NtOpenProcess , NtOpenProcess + 0x40 , дальше пока не стал смотреть, вырубает ) Много догадок, но хз ) Буду реально очень признателен если кто поможет.




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

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

А кто обещал, что других исключений не будет? Хочется ядру, оно и кидает. Не говоря о том, что PageFault может происходить в куче мест. И может всё же освоить уже отладку ядра, всяко пригодится?
З.Ы. И 1 этого топика, пожалуй, хватит.



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

Создано: 31 декабря 2013 19:05
· Личное сообщение · #7

Да, необходимо.



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

Создано: 02 января 2014 18:38 · Поправил: MickeyBlueEyes
· Личное сообщение · #8

Джжж вышло, поток то пользовательский Nt* непоюзаешь, нужно же либо Zw* , либо свой переходник писать и через прерывания вызывать уже ядерный Nt*.



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

Создано: 04 января 2014 17:57
· Личное сообщение · #9

MickeyBlueEyes

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

> Джжж вышло, поток то пользовательский Nt* непоюзаешь, нужно же либо Zw* , либо свой переходник писать и через прерывания вызывать уже ядерный Nt*.

> Да и нельзя вне её юзать системный функционал.

> UnHook("KiDispatchException")

Зачем каждый раз снимать патч, это нестабильность, темболее после снятия фолты пойдут вне вашего хэндлера. Вдобавок мне кажется что патч то у вас не атомарный, это значит что высока вероятность синева.

Далее в ядре обычно манипулируют не описателями обьектов, а указателями. Это в юзермоде описатели приводятся к указателям. Снижает быстродействие, особенно в таких тяжёлых по времени кодах. PsLookupProcessByPID etc вам нужно.

Ну а в целом полное извращенье



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

Создано: 04 января 2014 21:47
· Личное сообщение · #10

Пока шишек не набью не пойму походу )



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 05 января 2014 00:22
· Личное сообщение · #11

Мы как-то с Волком спорили на тему безопасных хуков через сплайсинг. Основная проблема которая возникает при работе со сплайсами против хотпатчей то, что в нашем коде делается полезная работа, т.к. мы вынуждены были воровать байты с тела функции, которую мы сплайсили. Хук должен сниматься минимальной модификацией байт. Я придумывал механизм кардонов, чтобы процессы, которые уже налетели на код нашего хука, смогли безопасно выйти из хука, когда мы его уже снимем (т.е. сложность на самом деле в том, что кто-то уже мог вызвать функцию в тот момент, когда мы решили снять хук). Но это всего лишь теория, на практике я этого не делал, хотя знаю, что сделать можно. В реальной жизни нет никакой необходимости выгружать драйвер, предназначенный для задач реверс-инженерии, равно как и убирать последствия каких-то отдельных задач драйвера, таких как сплайсинг.

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

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

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

Создано: 05 января 2014 17:39 · Поправил: Dr0p2
· Личное сообщение · #12

int

Нет нужды что то там городить - маршрутизация позволяет это порешить. Вариантов много, можно например найти инструкцию достаточного размера, либо раскрыть косвенные ссылки если есть. Для этого нужен только LDE. Проблема не в этом. Сам по себе патч - порча целостности кода, это не должно использоваться. Лишь только в целях отладки. Обычно есть другие методы, но они гораздо более сложнны, посему и не юзаются.

Выгрузка кода это довольно сложная задача, без полной остановки система она не решается(если патч не атомарный).

В данном случае патчить приватную KiDispatchException(не говоря вообще про N/A страницы, как их тс юзает - это полный ппц) извращенье. Есть годная KDR, причём полноценный код со всеми нюансами и реализациями в сайд моторе. Бери дамп и юзай(микод же).

MickeyBlueEyes

Zw стабы формируют т-фрейм, после чего вызывают Nt-апи. Вне фрейма их нельзя дёргать(в общем случае, нужно хотя бы превмод задать соответствующий). Дальше наверно будет вопрос про вызов сисколов из ядра(на такое все натыкаются, идём на аверлаб)



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

Создано: 06 января 2014 00:00 · Поправил: Rockphorr
· Личное сообщение · #13

Dr0p я вот читаю ваши куски матчасти -- системненько так, читать приятно (определения и т.д.)-- вот бы полную версию получить матчасти в вашем изложении (в приватик можно ссыль кинуть)

reversecode пишет:
на васме матами этой части полно не ну без шуток же
ну и последние сурсы с елито форума там же тоже выкладывали, полагаю они тоже основаны на тех же мата нах


не, мне ту теорию где матов нету а есть ясные определения
словарь появился еще на руткитсах по моей просьбе но это очень малая толика --- походу обломс -- вопрос исчерпан -- будем сушить воду из книг




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 января 2014 01:39 · Поправил: reversecode
· Личное сообщение · #14

на васме матами этой части полно не ну без шуток же
ну и последние сурсы с елито форума там же тоже выкладывали, полагаю они тоже основаны на тех же мата нах

Rockphorr пишет:
не, мне ту теорию где матов нету а есть ясные определения

клерко словарь ? он на клерко форуме есть




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

Создано: 06 января 2014 16:22
· Личное сообщение · #15

Rockphorr

Не знаю о какой матчасте вы говорите. Что не скажу, вы наверно рассматриваете как некую цитату из несуществующих доков

> матами этой части полно

У меня корешь есть, так если с ним что то техническое перетирать когда он пьян, то говорит "не ругайся, тише"

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

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

Создано: 06 января 2014 23:13
· Личное сообщение · #16

Dr0p я имею ввиду что когда вы описываете какуюто технику это довольно занятно -- так вот хотелось бы все писаные вами статьи почитать особенно начиная с древнейших




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

Создано: 12 января 2014 16:47
· Личное сообщение · #17

Rockphorr

Я не писал статьи, за всё время пару штук. Была попытка, но я забил, так как моё же восприятие устаревает(deprecated) для меня



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

Создано: 12 января 2014 23:39 · Поправил: MickeyBlueEyes
· Личное сообщение · #18

Тута пытаюсь int 1 перехватывать, прямо из IDT, делаю такой трюк

Code:
  1. UINT MyAddr = 0x00;
  2.  
  3. __declspec( naked ) MyDebug()
  4. {
  5.   __asm pushad
  6.   PsGetCurrentProcess(); //БСОД
  7.   __asm popad
  8.   __asm iretd
  9. }
  10.  
  11. __declspec( naked ) TrapDebug()
  12. {
  13.   __asm push eax   
  14.   __asm mov eax , [ esp + 4 ]
  15.   __asm cmp eax , MyAddr
  16.   __asm pop eax
  17.   __asm je YES
  18.  
  19.   YES:
  20.   __asm push ss
  21.   __asm push esp
  22.   __asm pushfd
  23.   __asm push cs
  24.   __asm push MyDebug
  25.   __asm iretd
  26. }


Дык почему нельзя то )
!analyze -v
Code:
  1. KERNEL_MODE_EXCEPTION_NOT_HANDLED
  2.  
  3. CLI_FAULT_INSTR:
  4. nt!KiServiceExit2+0
  5. fa cli


Сорь если очередная тупая ошибка ) Ну некоторые API прокатывают, а в случае из PsGetCurrentProcess() или PsGetCurrentProcessId() синь.




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

Создано: 13 января 2014 09:50
· Личное сообщение · #19

Да ты утомил уже. Не хочешь ман почитать всё же? Или хотя бы тупо в гугле поискать готовые примеры, коих овер 9000. Там лажа на лаже сидит. Не просто 1-2 ошибки, там вообще всё неправильно. Что отсутствие подготовки сегментных регистров. Что подготовка параметров для iret.



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

Создано: 13 января 2014 16:18
· Личное сообщение · #20

Ман?о На эту тему сколько не рыл ничего путнего не нашёл, а что с сегментами ище может быть не так то? А для iretd там всё вроде как сформировано, всё 5 аргументов для продолжения работы приложения сидит там.




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

Создано: 13 января 2014 17:00
· Личное сообщение · #21

Сколько ни рыл-значит, нисколько не рыл. Ну давай поищу и потыкаю сам-http://deroko.phearless.org/doer_src.zip
Примеров кода с перехватом прерываний полно, хоть 3 местами сразу есть можно. И там эти сегментные регистры заполняются нормально, чем у тебя и не пахнет. И как только PsGetCurrentProcess полезет по fs, у тебя всё накрывается.
И открой уже ман интела/амд и почитай про iret, сколько там вообще параметров, когда и какие.

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

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

Создано: 13 января 2014 17:31
· Личное сообщение · #22

ух спс, постараюсь в следующий раз сам находить такие ответы )

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

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 13 января 2014 17:59
· Личное сообщение · #23

Дероковский код это сказочный пи***ц, приводить его в пример не особо круто. Хотя автор темы тоже совершает ошибку, делая код не читаемым. Поясню.

MickeyBlueEyes
Вы делаете ассемблерные вставки. Зачем они вам в коде? Писать асм-вставками не кошерно. Есть два приема чтобы этого НЕ делать. Первый прием заключается в том, чтобы делать кросс-проекты, состоящие из ASM и C исходников. Потом все это собирается в объектные файлы и уже далее компонуется. Второй прием использовать специальные функции компиляторов, не входящие по объективным причинам ни в какие стандарты (т.к. платформ-зависимые), позволяющие не создавать помойку из кода, а использовать недоступные без ассемблера инструкции через intinsic-функции или по-другому "интринсики". Ну т.е. делать вы конечно можете как угодно и что угодно. Но если вас прикалывает писать на каждой строке __asm - тут уж ничего не поделать. Это все равно что смешивать всю еду на тарелке мясорубкой, заливать сверху чаем и только потом употреблять в пищу.

К сожалению действительно стоящей документации и примеров нет. (Тут конечно сейчас набежит толпа народа для холивара, но я буду защищаться ). Можно (и нужно) читать маны AMD/Intel. Но это очень абстрактные документы. В них есть много недостатков. Первый который напрашивается, так это то, что при изучении любой предметной области иногда возникают вопросы "а почему"? Ну так вот ответов во всяком случае у Intel на вопросы "почему?" нет. Частично эти ответы есть здесь: --> Link <--. Например, именно там я нашел ответ на вопрос, почему сегментный дескриптор выглядит, как будто его укуренные архитекторы изобретали. Оказалось, что это архитектурный памятник отделения травматологии и ортопедии.

Что там дальше по документации. Приближаясь к kermel-mode программированию в контексте винды еще есть Руссинович, Рихтер, Мэт Питтрек, Шрайбер и многие другие. Но чтение этих книжек это как хождение по минному полю, о примерах здесь. А проблема кроется в монопольной политике компании M$. Разработка драйверов превращена в геморрой в связи с отсутствием документации. Это сейчас на MSDN начали появляться функции, которые уже давно всеми используются. В своем стремлении все закрыть и все спрятать, M$ ограничила возможности разработчиков драйверов не дав нормальной документации. В итоге почти вся документация, что сейчас накопилась - это труды реверс-инженерии. Набор статей, полных фраз "я думаю что так" (а то и без этих фраз - просто как есть даются неверные, не совсем верные или неполные утверждения). К счастью, есть утекшие сырки Win NT (жутко устарело и не стоит тратить на них время, если только в целях общего развития), Win 2000. А еще по студенческой программе M$ таки сама открыла часть ядра ОС. Я был на лекции двух сотрудников Microsoft, которые говорили об этой проблеме так "мы будучи студентами изучали ОС под призмой UNIX, тяжело было переучиваться, уже работая в компании, поэтому для универсализации университетских программ WRK очень поможет". Не важно, что там у них произошло с идеологией и почему они так сделали. Но WRK есть и его надо изучать, если вы лезете в ядро.

По поводу сегментных регистров, согласен с Archer'ом. Это вам надо маны по процессорам почитать (том 3, если конкретнее), а также перенести эти знания "на призму Windows", т.е. понять куда указывают сегментные регистры в режиме ядра и какими они должны быть.

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

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

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

Как грамотно изложили. По поводу асма полностью с вами согласен, уже отложена книга в ящик, а точнее пару глав с неё по написанию модулей на АСМе и дальнейшей компоновкой. Просто сейчас приоритетней kernel mode, вот и пишу пока как получается ) До манов интелов ещё не добирался ) Сейчас читаю известный четырёх томник "Микропроцессор i486. Архитектура и программирование", нравится, очень хорошо расписано, аналогов походу нету, книга хоть и 93 года, но актуальна как по мне. Руссиновича с первого раза не потянул, бегал со стороны в сторону, щас вроде как уже норм, осилить смогу.
Люкмор с селекторами убил ) У меня у самого сложилось чтото вроде этого после прочтения главы по сегментам из "Микропроцессор i486. Архитектура и программирование".



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 13 января 2014 18:20
· Личное сообщение · #25

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

MickeyBlueEyes пишет:
Да 0x14 , то уже путаться начал.

Только я обратил внимание на ошибку? 0x14=20 = #VE Virtualization Exception. А вот #PF это 0x0E = 14.

Опять-таки, ман интела, том 3. Глава 6.3, там есть таблица "Table 6-1. Protected-Mode Exceptions and Interrupts". В ней перечислены все аппаратно генерируемые исключения и прерывания.



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

Создано: 13 января 2014 18:32 · Поправил: MickeyBlueEyes
· Личное сообщение · #26

Да эта ошибка была замечена почти сразу



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

Создано: 13 января 2014 19:49 · Поправил: dosprog
· Личное сообщение · #27

int,
Например, можно так:
- - - - - - - - - - - - - - - ->8
__asm
{
pushfd
mov ecx,eax
..................
..............
popfd
}
- - - - - - - - - - - - - - - ->8

- и не придётся заморачиваться с раздельной компиляцией C/ASM.
Всё равно переносимость тут и не нужна.

MickeyBlueEyes,
))) если имеете в виду четырёхтомнк Григорьева - да, книга хорошая (можно сказать, единственная в своём роде),
но безобразная вёрстка таблиц, опечатки, и в первом томе все 6 примеров кода (в конце) никуда не годятся. Побиты при вёрстке и безграмотном наборе. Работают только после изменения ~30% кода, так что не обольщайтесь.
И - да, напрягает, что всюду в той книге номера прерываний в десятичной системе.
Зато - хорошее, передранное из интеловских мануалов, описание системы команд.




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

Создано: 13 января 2014 20:11
· Личное сообщение · #28

И каким это образом избавит от необходимости раздельно компилировать с\асм, если это не покатит под х64 по природе кода? И +в х64 асм-вставки в студии запрещены. Разговор шёл про нормальный портабельный код, а не клеркокостыли, работающие на единственной платформе, а то и единственном билде ОС.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 13 января 2014 20:14
· Личное сообщение · #29

dosprog
Это довольно убогий стиль. Речь шла не про переносимость. Проблем с раздельной компиляцией нет - для этого надо просто настроить проект.

Archer
+1, я пытался вспомнить почему в Visual Studio нельзя использовать __asm, действительно, причина кроется именно в x64 версии. И вот тогда будет действительно сложно заниматься переносом каши из кода на сях и на ассемблере, не говоря уже о необходимости поддерживать нововведения x64. Такой код просто выбрасывается на помойку и все.

У Зубкова кстати тоже тексты битые в электронной книге. Но что-то мне подсказывает, что в оригинале тоже были проблемы (в смысле в бумажной версии).

Archer
Инди делает технологии. И по крайней мере не занимается смешиванием двух видов кода, а делает его на православном ассемблере. По поводу переносимости кода между ОС вопроса нет. В линуксе до сих пор даже близко нет аналога SoftICE. Быть может потому, что он никому на фиг не сдался? Весь код открыт, отладить все можно в gdb. Тем более смешно наблюдать, как некоторые товарищи жалуются, что у них в маке проблемы с инструментами. В маке даже защитить от крекеров проги сложно, там достаточно IDA для любого взлома. Что касается переносимости кода между билдами ОС, это не проверенная информация, а в основном лозунги тех, у кого что-то не получилось запустить. Объективных баг-репортов не было. А критиковать каждый может. QU например, тоже As Is поставляется, но не лишен багов.

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

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

Создано: 13 января 2014 20:25 · Поправил: dosprog
· Личное сообщение · #30

int,
Зубков... Там практически ни один пример без правки не работает. (В бумаге всё так же, как и в эл.версии).
Особенно меня развеселил примерчик с "нереальным 86" режимом.
Там не опечатки, а то-ли дралось откуда-попадя, то-ли специально так сделано (не верится,хотя...).
"Нереальный 86" мне обошёлся в неделю времени с этим самым Григорьевым в зубах. Какой там интернет...

Archer,да.
P.S. и присоединяюсь к сказанному int'ом в предыдущем посте.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

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

dosprog
Про Зубкова я вспомнил, т.к. сам по нему учился. А потом, блин, переучивался, когда понял что этой книгой можно обтираться. Если ты что-то пишешь, найти рецензента адекватного, чтобы сказал хотя бы, стоит ли публиковать ошибки с текстом.


<< . 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 » Выход » ЛС
   Для печати Для печати