замена обработчика прерывания

Тема в разделе "WASM.BEGINNERS", создана пользователем Lenok____, 15 июн 2008.

  1. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Zhelezka
    Вот шелкодес(бинарь), под SP1, SP2, SP3, SP4, Vista, Win7. Тестил только в SP2(варю неохото запускать).
    http://narod.ru/disk/3779076000/Int.rar.html
    [
    Туплю, исправте в хидере:
    Entry:
    include Dump.inc
    ]
    Great
    Ладно, забудь. Скажи лучше чего фалеги не ципляютсо ?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не скажу.. сам не знаю.)
     
  3. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Чета нипонял, каким таким чудесным образом, код улетает в Ring 0?
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    bugaga
    Например из дрова юзаетсо. А юзермодному коду есть необходимость в создании шлюза ? Кто его обработает ?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    CrystalIC
    ну как бы есть. раньше так делали когда в physicalmemory писать можно было ))
     
  6. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Почемуто непонятно почему тут по дефолту предполагается юзермод. Вопрос про режим ядра, поэтому первое незачем затрагивать. Аналогично былобы спросить каким образом в KeAttachProcess код улетает в кернелмод :)))
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    просто у людей обычно это ассоциируется с шеллкодами, эксплоитами и escalation privileges'ами
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    CrystalIC наверна я в танке, еще раз глянул как
    редиректит прерывания, и чето нихрена не втупил (из за замороченой писанины кстате) какую дыру юзоет этот "шеллкодес", уж не SEH ли часом? А то насчот KeAttachProcess , в "шелкодесе" даже нистрочки :)

    насчот вопроса
    могу немного расказать...
    а чо нет то? Например тупо взяли и перехватили все прерывания (на предмет допустим быстрого мониторинга) используя подобной "engine"
    Код (Text):
    1. {$apptype console}
    2. program xtest; uses windows;
    3.  
    4. var
    5.     xz: integer =0;
    6.     ex: integer =0;
    7.  
    8. procedure op;
    9.     procedure sti; asm sti
    10.                    end;          
    11. var i: integer;
    12. begin
    13.     sti; //enable hardware int's
    14. repeat   //block & lock
    15.     xz := xz + 1;
    16. until ex <> 0;
    17. end;
    18.  
    19. procedure R0jmp;//(_eax:pointer); stdcall;
    20. asm pop ecx  //get return address
    21.     pop edx  //get param (stdcall conv)
    22.     int $2a  //exec  xchg ecx, esp; jmp ecx
    23.     push fs  
    24.     push 30h //bsod by irql_not_less_or_equal
    25.     pop  fs  //fix
    26.     call edx
    27.     pop  fs
    28.     iretd
    29. end;
    30.  
    31. procedure thrd1 (c: integer);  stdcall;
    32. begin
    33. repeat
    34.      writeLn (xz);
    35.      Sleep (10);
    36. until ex <> 0;
    37. end;
    38.  
    39. var
    40.   dwThreadId : dword;
    41.  
    42. begin
    43.     CreateThread(nil,0,@R0jmp,@op,0,dwThreadId);
    44.     CreateThread(nil,0,@thrd1,nil,0,dwThreadId);
    45.     ReadLn;
    46.     ex :=1;
    47.     sleep (5);
    48. end.
    а то малоли как там базы в PIC-ах и APIC-ax стоят. ;-D
     
  9. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    bugaga
    Ужос, как всё запущено...
    Шеллкод - это код, для которого не имеет значения адрес, по которому он расположен.
    И причём тут дыры ?
    Ты когданибудь прерывания перехватывал, или только на словах ?
    И что это за пример кода, не пойму.
     
  10. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    а что непонятного?
    использует DPL3 дыру на патченом ядре (или перехват by дров), запускает две зацикленых подпрограммы .

    Первая в R0 инкрементит переменную xz, другая в R3 считывает её значение.
    Выход из цикла когда ex = 1, а на то время пока R0 цикл не завершиться прога вся как бы вся блокированая, и хрен ее скинет куданить там в свп, поэтому данные в переменных (хоть локальных, хоть глобальных) держуться жестко :) ничто не мешает на время её работы, сохранить в них копию оригинальной IDT, и подменять ее обработчики своими.
     
  11. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    bugaga
    И что за ядро ?
    На нормальном это работать не будет. Теперь по пунктам.
    > pop ecx ;@op
    > pop edx ;Тут будет ноль.
    > int 2a ;Вернёт в Edx:Eax число тиков.
    Код предельно прозрачный на стороне ядра:
    mov eax,dword ptr cs:[_KeTickCount]
    mul dword ptr cs:[_ExpTickCountMultiplier]
    shrd eax,edx,24
    iretd
    > push 30h
    > pop fs
    Для этого селектора база 0xFFDFF000. Эта память из юзермода не доступна(в дескрипторе DPL=0).
    Как следствие, попытка загрузки этого селектора вызовет исключение, при входе в него макрос ENTER_TRAP сохранит в стеке значение текущее fs, тоесть 0x3B и загрузит 0x30 в этот регистр. По возврату из исключения в юзермод в fs будет загружен именно 0x3B. Дальнейший код выполнен не будет.
    Даже если пропустить это, то следующий вызов:
    > call edx
    Изза того что в Edx случайное значение тоже ни к чему не привидёт, кроме как возникновению исключения.
    А на счёт процедуры op(), так там на sti исключение возникнет, привилегированная инструкция ведь.
    Ерунда полная, какойто мусор, впрочем как и комментарии))).
    Вобще ппц.. Это дельфи видимо.
    Great ты что думаешь ?
     
  12. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    CrystalIC
    Тут будет указатель на op
     
  13. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Ну да, BaseThreadStart вызывает через Call. Впрочем какая разница. После Int2a там будет случайное значение.
     
  14. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    ёлки, скобачки зобыл в коменте
    Код (Text):
    1. //exec  xchg ecx, [esp]; jmp ecx
    w2k/sp2

    и да!11 Код предельно прозрачный на стороне "моего" ядра
    Код (Text):
    1. -    ntoskrnl.exe    
    2. -.00464DBC: 870C24  xchg        ecx,[esp]
    3. -.00464DBF: FFE1      jmp         ecx
     
  15. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Тупые у тебя шутки какието, а я серьёзно говорил.
     
  16. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    Не получается сделать, что-бы загрузчик(работа без ОС) работал.

    Он должен поменять адрес аппаратного прерывания.
    Программа постоянно должна менять второй символ на экране.
    Но при нажатии любой клавиши,
    она должна перейти на свой обработчик прерывания,
    который поменяет третий символ на экране.
    Второй символ меняется постоянно.
    Когда нажимаю любую клавишу на клавиатуре,
    ничего не изменяется:
    отсуда следует, что программа продолжает работать,
    меняя второй символ, но обработчик прерывания не работает.

    Код (Text):
    1. ;Сохраняем адрес обработчика прерывания 09h
    2. mov ax,[0x0009*0x04]
    3. mov word [int_0x09_old], ax
    4. mov ax,[0x0009*0x04+0x0002]
    5. mov word [int_0x09_old+0x0002], ax
    6.  
    7. ;Подставляем новый адрес обработчика прерывания 09h
    8. pushf
    9. cli
    10. mov word [0x0009*0x02], int_0x09
    11. mov word [0x0009*0x02+0x0002], 0
    12. popf
    13.  
    14. ; Код постоянно меняющий второй символ на экране
    15. @@:
    16. mov ax, 0xB800
    17. mov es, ax
    18. add byte [es:0x0002], 0x01
    19. jmp @B
    20.  
    21. ;Новый обработчик прерывания 09h
    22. int_0x09:
    23. push es
    24. push ax
    25. mov ax, 0xB800
    26. mov es, ax
    27. add byte [es:0x0004], 0x01
    28. pop ax
    29. pop es
    30. iret
    31.  
    32. ;Адрес старого обработчика прерывания 09h
    33. int_0x09_old dd ?
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кристалегу не прёт счас в чужом говне ковырятьсо, могу пикод для установки вектора без IPI дать. Насчёт прерывания:
    Для IA32 не катит.))
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Zhelezka
    1) чему равен ds, когда читаешь адрес старого обработчика и пишешь адрес своего? нулю?
    2) чему равен cs? нулю?
    3) обрати внимание на множители, когда читаешь адрес он равен 4, когда пишешь - 2.
    4) обработчик обязан содержать
    Код (Text):
    1. mov al,20h
    2. out 20h,al
     
  19. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    1) ну если пишешь в сегмент ds, то да. его надо обнулить
    2) с какой стати 0.
    3) а с какой стати он 2? вы вообще представляете куда пишите-то?
    4) о Вы обязаны сообщить о краже в милицию если стали свидетелем оной? хотя в принципе не обязаны, но должны! а вообще контроллеру прерываний лучше сообщить, что прерывание обработано.