Zhelezka Вот шелкодес(бинарь), под SP1, SP2, SP3, SP4, Vista, Win7. Тестил только в SP2(варю неохото запускать). http://narod.ru/disk/3779076000/Int.rar.html [ Туплю, исправте в хидере: Entry: include Dump.inc ] Great Ладно, забудь. Скажи лучше чего фалеги не ципляютсо ?
bugaga Например из дрова юзаетсо. А юзермодному коду есть необходимость в создании шлюза ? Кто его обработает ?
Почемуто непонятно почему тут по дефолту предполагается юзермод. Вопрос про режим ядра, поэтому первое незачем затрагивать. Аналогично былобы спросить каким образом в KeAttachProcess код улетает в кернелмод ))
CrystalIC наверна я в танке, еще раз глянул как редиректит прерывания, и чето нихрена не втупил (из за замороченой писанины кстате) какую дыру юзоет этот "шеллкодес", уж не SEH ли часом? А то насчот KeAttachProcess , в "шелкодесе" даже нистрочки насчот вопроса могу немного расказать... а чо нет то? Например тупо взяли и перехватили все прерывания (на предмет допустим быстрого мониторинга) используя подобной "engine" Code (Text): {$apptype console} program xtest; uses windows; var xz: integer =0; ex: integer =0; procedure op; procedure sti; asm sti end; var i: integer; begin sti; //enable hardware int's repeat //block & lock xz := xz + 1; until ex <> 0; end; procedure R0jmp;//(_eax:pointer); stdcall; asm pop ecx //get return address pop edx //get param (stdcall conv) int $2a //exec xchg ecx, esp; jmp ecx push fs push 30h //bsod by irql_not_less_or_equal pop fs //fix call edx pop fs iretd end; procedure thrd1 (c: integer); stdcall; begin repeat writeLn (xz); Sleep (10); until ex <> 0; end; var dwThreadId : dword; begin CreateThread(nil,0,@R0jmp,@op,0,dwThreadId); CreateThread(nil,0,@thrd1,nil,0,dwThreadId); ReadLn; ex :=1; sleep (5); end. а то малоли как там базы в PIC-ах и APIC-ax стоят. ;-D
bugaga Ужос, как всё запущено... Шеллкод - это код, для которого не имеет значения адрес, по которому он расположен. И причём тут дыры ? Ты когданибудь прерывания перехватывал, или только на словах ? И что это за пример кода, не пойму.
а что непонятного? использует DPL3 дыру на патченом ядре (или перехват by дров), запускает две зацикленых подпрограммы . Первая в R0 инкрементит переменную xz, другая в R3 считывает её значение. Выход из цикла когда ex = 1, а на то время пока R0 цикл не завершиться прога вся как бы вся блокированая, и хрен ее скинет куданить там в свп, поэтому данные в переменных (хоть локальных, хоть глобальных) держуться жестко ничто не мешает на время её работы, сохранить в них копию оригинальной IDT, и подменять ее обработчики своими.
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 ты что думаешь ?
Ну да, BaseThreadStart вызывает через Call. Впрочем какая разница. После Int2a там будет случайное значение.
ёлки, скобачки зобыл в коменте Code (Text): //exec xchg ecx, [esp]; jmp ecx w2k/sp2 и да!11 Код предельно прозрачный на стороне "моего" ядра Code (Text): - ntoskrnl.exe -.00464DBC: 870C24 xchg ecx,[esp] -.00464DBF: FFE1 jmp ecx
Не получается сделать, что-бы загрузчик(работа без ОС) работал. Он должен поменять адрес аппаратного прерывания. Программа постоянно должна менять второй символ на экране. Но при нажатии любой клавиши, она должна перейти на свой обработчик прерывания, который поменяет третий символ на экране. Второй символ меняется постоянно. Когда нажимаю любую клавишу на клавиатуре, ничего не изменяется: отсуда следует, что программа продолжает работать, меняя второй символ, но обработчик прерывания не работает. Code (Text): ;Сохраняем адрес обработчика прерывания 09h mov ax,[0x0009*0x04] mov word [int_0x09_old], ax mov ax,[0x0009*0x04+0x0002] mov word [int_0x09_old+0x0002], ax ;Подставляем новый адрес обработчика прерывания 09h pushf cli mov word [0x0009*0x02], int_0x09 mov word [0x0009*0x02+0x0002], 0 popf ; Код постоянно меняющий второй символ на экране @@: mov ax, 0xB800 mov es, ax add byte [es:0x0002], 0x01 jmp @B ;Новый обработчик прерывания 09h int_0x09: push es push ax mov ax, 0xB800 mov es, ax add byte [es:0x0004], 0x01 pop ax pop es iret ;Адрес старого обработчика прерывания 09h int_0x09_old dd ?
Кристалегу не прёт счас в чужом говне ковырятьсо, могу пикод для установки вектора без IPI дать. Насчёт прерывания: Для IA32 не катит.))
Zhelezka 1) чему равен ds, когда читаешь адрес старого обработчика и пишешь адрес своего? нулю? 2) чему равен cs? нулю? 3) обрати внимание на множители, когда читаешь адрес он равен 4, когда пишешь - 2. 4) обработчик обязан содержать Code (Text): mov al,20h out 20h,al
1) ну если пишешь в сегмент ds, то да. его надо обнулить 2) с какой стати 0. 3) а с какой стати он 2? вы вообще представляете куда пишите-то? 4) о Вы обязаны сообщить о краже в милицию если стали свидетелем оной? хотя в принципе не обязаны, но должны! а вообще контроллеру прерываний лучше сообщить, что прерывание обработано.