Показаны сообщения с ярлыком kernel. Показать все сообщения
Показаны сообщения с ярлыком kernel. Показать все сообщения

2009-05-10

hki - кейлогер

Отладил наконец-то свой кейлогер. Работает через перехват IRP. В лог-файл (по умолчанию C:\124.txt) пишет коды клавиш, и заголовок активного окна. Тестировался на Windows Vista SP1 и Windows XP Sp2 на двухядерном прцессоре. В комплекте простой парсер лог-файлов, парсер написан на коленке и скорей всего будет передалан, но как-нибудь в другой раз. При написании парсера использовалась часть кода из r0keylog barton'а.

Конечно код далёк от совершенства, но тем-не менее, вот сcылка для скачивания:
http://cid-eea2a7c767291ff9.skydrive.live.com/self.aspx/.Public/hki.rar

2009-04-22

Linux kernel debugging

Всем известно, что в vmware 6-й ветки появилась возможность отлаживать ядро гостевой операционной системы. Для включения отладки необходимо в конфиг виртуальной машины (файл *.vmx) добавить строку debugStub.listen.guest32=1 либо debugStub.listen.guest64=1. Vmware откроет порт 8832 (или 8864 для 64-битных систем) на главной системе(хосте):
>netstat -an | grep 88
TCP 127.0.0.1:8832 0.0.0.0:0 LISTENING

Как видим, подключиться можно только с локалхоста. Используеться протокол gdb, соответственно, берём gdb (версию для Windows в сети найти не трудно), и подключаемся:
> gdb -q
(gdb) target remote localhost:8832

Для удобного ковыряния в ядре, потребуеться собрать ядро с отладочными сиволами, обчычно ядра, установленные в различных дистрибутивах по умолчанию собраны без отладочных символов (что и не удевительно, поскольку включение символов несколько увеличивает размер образа ядра). Чтобы пересобрать ядро используя текущюю рабочюю конфигурацию, переходим в каталог исходников ядра (обычно /usr/src/linux), и выролняем:
make oldconfig
make menuconfig

В меню включаем отладочные символы:
Kernel hacking  --->
[*] Compile the kernel with debug info

или "CONFIG_DEBUG_KERNEL=y" в конфиге ядра (/usr/src/linux/.config). На стадии конфигурирования ядра желательно отключить всё лишнее (например можно отключть поддержку IPv6, если она не нужна, и ненужные драйвера), и всё что возможно вкомпилить в ядро, а не в виде модулей. Однако netfilter и драйвера сетевых интерфейсов я бы посоветовал всё-таки собрать в виде модулей. Можно вместо make oldconfig, сделать make defconfig, что-бы создать минимальный конфиг по умолчанию для данной архитектуры, а потом в make menuconfig включать необходимые опции, и добавить нужные драйвера (lspci может в этом помоч). Далее собираем ядро:
make
make modules_install

Файл /usr/src/linux/vmlinux - это несжатый образ ядра, его переносим с гостевой системы на основную. Желательно так-же иметь на основной стсиеме исходные коды ядра соответсвующей версии. Кладём файл vmlinux на основную систему в папку где находяться исходники ядра (у меня D:\kernel\). Устанавливаем новое ядро и перезагружаем гостевую систему. Теперь можно спокойно отлаживать ядро загрузив в gdb несжатый образ ядра с отладочнымм символами:
> gdb -q
(gdb) target remote localhost:8832
<...>
(gdb) file vmlinux

P.S.
по этой ссылке http://wiki.opennet.ru/Linux_kernel_debug рекомендуют включить в ядре такие опции:
Kernel hacking  --->
[*] Compile the kernel with debug info
[*] Compile the kernel with frame pointers

2008-12-12

SDT

Осваиваюсь с внутреним устройством Windows, вот, набросал кодес для получения данных из SDT. Например получим номер функции NtCreateProcessEx которая в Windows Vista SP1 находиться по адрессу 0x826a8fea, а в Windows XP SP2 - 0x805c5c32:

#include <ntddk.h>

extern PUSHORT NtBuildNumber;
extern PVOID KeServiceDescriptorTable;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegPath)
{
unsigned long t, t2, p, pNtCreateProcessEx;
int i,j;

switch(*NtBuildNumber){
case 2600: //winxp
pNtCreateProcessEx = 0x805c5c32;
break;

case 6001: //vista (at least sp1)
pNtCreateProcessEx = 0x826a8fea;
break;
}

DbgPrint("[+] Driver successfuly loaded\n");
DbgPrint("SDT addr: %x\n", KeServiceDescriptorTable);

t = *((PULONG)KeServiceDescriptorTable);
for (i=j=0;j<=391;i+=4,j++){
t2 = *((PULONG)(t+i));
if(t2 == pNtCreateProcessEx){
DbgPrint("NtCreateProcess index: %d addr:%x\n", j,t2);
}
}
return STATUS_DEVICE_CONFIGURATION_ERROR;
}

Архив