PDA

Просмотр полной версии : ядерная заглушка


sn0w
15.04.2010, 17:35
для чего: порой встречаются системы защиты, работающие в режиме ядра. т.е. они перехватывают ряд ядерных функций (КИС, КАВ, разные античиты и тд), в результате чего мы, например, не можем выполнить некоторые действия. например сделать инжект в процесс и тд и тп. так вот. предлагаю вашему вниманию драйвер, суть его работы заключена в том, что при загрузке он проверяет наличие таких перехватов и если находит, то перехватывает самого перехватчика, таким образом работая как заглушка. драйвер защиты думает что он перехватил что надо и все нормально, но в данный момент его обработчик сам перехвачен заглушкой которая передает управление оригинальным функциям.

естественно в этом случае мы можем творить в режиме пользователя что угодно.

данная версия обезвреживает (не повреждая систему защиты):

NtOpenProcess <---> OpenProcess
NtProtectVirtualMemory <---> VirtualProtect
NtWriteVirtualMemory <---> WriteProcessMemory
NtCreateThread <---> CreateRemoteThread
NtAllocateVirtualMemory <---> VirtualAllocEx

те после запуска драйвера мы по идее можем инжектить что угодно и куда угодно.

НУЖНО ПРОВЕРИТЬ. если у кого есть возможность, с проактивными антивирами (разными) и тд, затестьте и отпишитесь.

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

НО! не выгружайте драйвер ранее того как будет выгружена система защиты. иначе бсод.


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

самое элементарное, кто в кс гамит - запустите маяк, затем лоадер и любой чит, например senses fail

таргет билды (оч важно, исходите из установленной ОС)
все они под х86 (не 64битные)

Windows 7:
http://www.sendspace.com/file/y3zprp

Windows XP:
http://www.sendspace.com/file/5az3wg

gold-goblin
15.04.2010, 17:39
ОгО! Сейчас проверю!

gold-goblin
15.04.2010, 18:41
Первый запуск норм. На втором бсод.... Сейчас включу запись ошибок и повторю. (антивиря нет)

sn0w
15.04.2010, 18:43
винда как указано? что стоит (антивир или гуард какой)

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

ззы и желательно проверить таблицу sdt какаимнить rku или avz - есть ли какие хуки

зззы весь дебаг принт я у него вырезал дабы алгоритм не палить, он тока выводит када загрузился и када выгрузился

gold-goblin
15.04.2010, 18:53
винда как указано? что стоит (антивир или гуард какой)
Винда хр. Авирей нет, брендмауэр отключен.
зы ОК надо давить только тада када сделаешь все операции. просто если есть другой драйвер, который перехватывает ядро, то наш - перехватывает его обработчики. и если нас выгрузить (нажав ОК) то с его обработчиков проц будет улетать в ебеня. собсна смысл бсода.
Это я понял =) бсод выскакивает до кнопки ок.
STOP 0x0000007E
jammer.sys - adress F7B0226E base at F7B01000

sn0w
15.04.2010, 19:00
обновил первый пост - и 7 и хп

M_script_
15.04.2010, 19:16
sn0w, может посоветуешь, что почитать по разработке драйверов?

gold-goblin
15.04.2010, 19:27
обновил первый пост - и 7 и хп
Спасибо за хп версию.
Но она так же бсодит по тем же адресам.
STOP 0x0000007E
jammer.sys - adress F7B0226E base at F7B01000
Возможно это из-за вмваре.

sn0w
15.04.2010, 19:27
Хоглунда (rootkit.com) , васм.ру, руткитс.су... Солдатов ВП - программирование драйверов Windows. но в целом эта инфа более складывается из исследования и отдельных людей. те это какбы мозговой торрент чтоли) мне в этом деле например помогал ранее довольно известный тут человек, kez)

да и кстати грейта!)

Ins3t
15.04.2010, 19:29
2 M_script_:
https://forum.antichat.ru/thread91797.html

sn0w
15.04.2010, 19:33
Спасибо за хп версию.
Но она так же бсодит по тем же адресам.

Возможно это из-за вмваре.

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

gold-goblin
15.04.2010, 19:38
напомню - среда должна быть 32разрядной, попробуй не на виртуалке)
Да дело в вмваре. на чистой системе работает =)) Молодец!
И спасибо за разъяснение =)

sn0w
15.04.2010, 19:49
Да дело в вмваре. на чистой системе работает =)) Молодец!
И спасибо за разъяснение =)

работает то, это гуд) пробовал с чем? просто в сухую (без ничего) ето тоже что и mov eax, eax; =)

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

AlexTheC0d3r
15.04.2010, 19:55
sn0w, как всегда на высоте!

slesh
15.04.2010, 20:33
эм каким методом снимаешь хуки?
Восстановление SDT или сплайсинг хуков антивиря с последующей передачей управления на оригинальные адреса?

sn0w
15.04.2010, 20:35
хуки не снимаются, вслучае если я вижу что в сдт энтри не тот адрес, те адрес стороннего обработчика, я просто перехожу к нему и пишу на начале тела джамп к себе (с созданием трамплина пролога и тд). у себя на этот момент я имею адекватные Nt адреса, куда и передается упраление.

slesh
15.04.2010, 21:15
Мдауж. За сброс WP бита Great бы

Я буду долго бить ногами за аппаратное отключение CR0. WP и уж тем более за запрет прерываний.


Когда нужно хукнуть SDT то делаю так:

// функция установки и снятия перехвата
BOOL SetHook(USHORT id, ULONG NewAddr, PULONG OldAddr)
{
BOOL ret = false;
ULONG Addr;
PHYSICAL_ADDRESS PhysicalAddr;
ULONG VirtualAddr;

Addr = (ULONG)KeServiceDescriptorTable->ServiceTable; // получаем адрес таблицы сервисов
if (Addr) // если нет ошибки
{
Addr += 4 * id; // вычислим адрес функции которую необходимо перехватить
if (OldAddr) // если указана память для сохранения старого значения
{
*(ULONG*)OldAddr = *(ULONG*)Addr; // сохраним старый адрес
}

// получим физический адрес, зная виртуальный
PhysicalAddr = MmGetPhysicalAddress((void*)Addr);
if (PhysicalAddr.QuadPart)
{
// выделим себе виртуальную память по физ. адресу
VirtualAddr = (ULONG)MmMapIoSpace(PhysicalAddr, 4, 0);
if (VirtualAddr)
{
*(ULONG*)VirtualAddr = NewAddr; // установим перехват
ret = true;
MmUnmapIoSpace((void*)VirtualAddr, 4); // освободим вирт. страницу памяти
}
}
}

return ret;
}

Если не хукать SDT а просто писать куда-либо то достаточно будет просто сделать копию страници и записать туда данные

А вообще тут даже запрет прерываний не поможет.
Если ты вписываешь JMP XX XX XX XX то как не крути, нужно записать 5 байт. При атомарном доступе максимум 4. Оставшийся байт ты можеш не успеть записать если второе ядро успеет попасть на эту функцию. Маловероятное событие, но всё же.

_antony
15.04.2010, 21:28
да оно и так бсодит.
хп сп2 + касперский.

могу и минидамп залить если надо.


************************************************** *****************************
* *
* Bugcheck Analysis *
* *
************************************************** *****************************

Use !analyze -v to get detailed debugging information.

BugCheck 7E, {c0000005, b1b236ee, f89a3980, f89a367c}

*** ERROR: Module load completed but symbols could not be loaded for jammer.sys
Probably caused by : jammer.sys ( jammer+6ee )

Followup: MachineOwner
---------

kd> !analyze -v
************************************************** *****************************
* *
* Bugcheck Analysis *
* *
************************************************** *****************************

SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: b1b236ee, The address that the exception occurred at
Arg3: f89a3980, Exception Record Address
Arg4: f89a367c, Context Record Address

Debugging Details:
------------------


EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

FAULTING_IP:
jammer+6ee
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch]

EXCEPTION_RECORD: f89a3980 -- (.exr 0xfffffffff89a3980)
ExceptionAddress: b1b236ee (jammer+0x000006ee)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 0000003c
Attempt to read from address 0000003c

CONTEXT: f89a367c -- (.cxr 0xfffffffff89a367c)
eax=f89a3ae4 ebx=00000000 ecx=000005ce edx=806830e0 esi=00000000 edi=00000000
eip=b1b236ee esp=f89a3a48 ebp=f89a3a60 iopl=0 nv up ei ng nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00210292
jammer+0x6ee:
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch] ds:0023:0000003c=????????
Resetting default scope

PROCESS_NAME: System

ERROR_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

EXCEPTION_PARAMETER1: 00000000

EXCEPTION_PARAMETER2: 0000003c

READ_ADDRESS: 0000003c

FOLLOWUP_IP:
jammer+6ee
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch]

BUGCHECK_STR: 0x7E

DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE

LAST_CONTROL_TRANSFER: from b1b23c67 to b1b236ee

STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
f89a3a60 b1b23c67 00000000 b1b242e2 00000000 jammer+0x6ee
f89a3a98 b1b23d27 00000000 82301da0 00000000 jammer+0xc67
f89a3ab8 b1b24097 00000000 804d7000 f89a3ae4 jammer+0xd27
f89a3c74 b1b234b9 f89a3d4c 805a2ead 82301da0 jammer+0x1097
f89a3c7c 805a2ead 82301da0 81bda000 00000000 jammer+0x4b9
f89a3d4c 805a3182 00000b2c 00000001 00000000 nt!IopLoadDriver+0x66c
f89a3d74 804e426b 00000b2c 00000000 823c68b8 nt!IopLoadUnloadDriver+0x45
f89a3dac 8057cfce f877fcdc 00000000 00000000 nt!ExpWorkerThread+0x100
f89a3ddc 804f88fa 804e4196 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16


SYMBOL_STACK_INDEX: 0

SYMBOL_NAME: jammer+6ee

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: jammer

IMAGE_NAME: jammer.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 4bc72969

STACK_COMMAND: .cxr 0xfffffffff89a367c ; kb

FAILURE_BUCKET_ID: 0x7E_jammer+6ee

BUCKET_ID: 0x7E_jammer+6ee

Followup: MachineOwner
---------




И не много не понятно в чем новизна метода?)

Nightmarе
15.04.2010, 21:52
Вещь безусловно роскошная (на первый взгляд), но можно ли уточнить один вопрос, этот метод внедряется в систему (не важно каким способом) полностью без палева какой-либо проактивной защиты, или по тому-же принципу что и руткит? (то есть руткита словит проактивка, но если разрешить ему все действия, то его уже ничто не остановит, но в самом начале он запалится)

ntldr
15.04.2010, 22:00
Вещь безусловно роскошная (на первый взгляд), но можно ли уточнить один вопрос, этот метод внедряется в систему (не важно каким способом) полностью без палева какой-либо проактивной защиты, или по тому-же принципу что и руткит? (то есть руткита словит проактивка, но если разрешить ему все действия, то его уже ничто не остановит, но в самом начале он запалится)
в данном случае он никуда не внедряется сам. Ну а проактивка (у меня на Kaspersky CRYSTAL) абсолютно не палит загрузку драйвера. Но аутпост палит

slesh
15.04.2010, 22:05
2 Nightmarе судя по тому что драйвер прописывается в системе по обычному, в SYSTEM\CurrentControlSet\Services\jammer то палится любыми проактивками.

Nightmarе
15.04.2010, 22:08
2 Nightmarе судя по тому что драйвер прописывается в системе по обычному, в SYSTEM\CurrentControlSet\Services\jammer то палится любыми проактивками.
А без этого в теории нельзя? не прописываясь в реестр, просто запустить, залочить касхера и после этого прописаться.

cheater_man
15.04.2010, 22:15
DSOD'ит пострашному вируалка WIXP SP2 чистая

_antony
15.04.2010, 22:22
так она не должна быть чистой))

gold-goblin
15.04.2010, 22:39
хп сп2 + касперский.
Да к стати. С кисом бсодит а с касперский анти хакер норм.

slesh
15.04.2010, 22:49
2 Nightmarе я ж написал, что идет простое добавление записи в реестр. Никаких хитростей нет. Если нужны беспаливные методы, то реверси руткиты

sn0w
16.04.2010, 11:24
да оно и так бсодит.
хп сп2 + касперский.

могу и минидамп залить если надо.


************************************************** *****************************
* *
* Bugcheck Analysis *
* *
************************************************** *****************************

Use !analyze -v to get detailed debugging information.

BugCheck 7E, {c0000005, b1b236ee, f89a3980, f89a367c}

*** ERROR: Module load completed but symbols could not be loaded for jammer.sys
Probably caused by : jammer.sys ( jammer+6ee )

Followup: MachineOwner
---------

kd> !analyze -v
************************************************** *****************************
* *
* Bugcheck Analysis *
* *
************************************************** *****************************

SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)
This is a very common bugcheck. Usually the exception address pinpoints
the driver/function that caused the problem. Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: b1b236ee, The address that the exception occurred at
Arg3: f89a3980, Exception Record Address
Arg4: f89a367c, Context Record Address

Debugging Details:
------------------


EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

FAULTING_IP:
jammer+6ee
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch]

EXCEPTION_RECORD: f89a3980 -- (.exr 0xfffffffff89a3980)
ExceptionAddress: b1b236ee (jammer+0x000006ee)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 0000003c
Attempt to read from address 0000003c

CONTEXT: f89a367c -- (.cxr 0xfffffffff89a367c)
eax=f89a3ae4 ebx=00000000 ecx=000005ce edx=806830e0 esi=00000000 edi=00000000
eip=b1b236ee esp=f89a3a48 ebp=f89a3a60 iopl=0 nv up ei ng nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00210292
jammer+0x6ee:
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch] ds:0023:0000003c=????????
Resetting default scope

PROCESS_NAME: System

ERROR_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

EXCEPTION_PARAMETER1: 00000000

EXCEPTION_PARAMETER2: 0000003c

READ_ADDRESS: 0000003c

FOLLOWUP_IP:
jammer+6ee
b1b236ee 8b433c mov eax,dword ptr [ebx+3Ch]

BUGCHECK_STR: 0x7E

DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE

LAST_CONTROL_TRANSFER: from b1b23c67 to b1b236ee

STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
f89a3a60 b1b23c67 00000000 b1b242e2 00000000 jammer+0x6ee
f89a3a98 b1b23d27 00000000 82301da0 00000000 jammer+0xc67
f89a3ab8 b1b24097 00000000 804d7000 f89a3ae4 jammer+0xd27
f89a3c74 b1b234b9 f89a3d4c 805a2ead 82301da0 jammer+0x1097
f89a3c7c 805a2ead 82301da0 81bda000 00000000 jammer+0x4b9
f89a3d4c 805a3182 00000b2c 00000001 00000000 nt!IopLoadDriver+0x66c
f89a3d74 804e426b 00000b2c 00000000 823c68b8 nt!IopLoadUnloadDriver+0x45
f89a3dac 8057cfce f877fcdc 00000000 00000000 nt!ExpWorkerThread+0x100
f89a3ddc 804f88fa 804e4196 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16


SYMBOL_STACK_INDEX: 0

SYMBOL_NAME: jammer+6ee

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: jammer

IMAGE_NAME: jammer.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 4bc72969

STACK_COMMAND: .cxr 0xfffffffff89a367c ; kb

FAILURE_BUCKET_ID: 0x7E_jammer+6ee

BUCKET_ID: 0x7E_jammer+6ee

Followup: MachineOwner
---------




И не много не понятно в чем новизна метода?)

сенкс за крашдамп, понял где, но почему...

sn0w
16.04.2010, 11:30
Мдауж. За сброс WP бита Great бы


Когда нужно хукнуть SDT то делаю так:

// функция установки и снятия перехвата
BOOL SetHook(USHORT id, ULONG NewAddr, PULONG OldAddr)
{
BOOL ret = false;
ULONG Addr;
PHYSICAL_ADDRESS PhysicalAddr;
ULONG VirtualAddr;

Addr = (ULONG)KeServiceDescriptorTable->ServiceTable; // получаем адрес таблицы сервисов
if (Addr) // если нет ошибки
{
Addr += 4 * id; // вычислим адрес функции которую необходимо перехватить
if (OldAddr) // если указана память для сохранения старого значения
{
*(ULONG*)OldAddr = *(ULONG*)Addr; // сохраним старый адрес
}

// получим физический адрес, зная виртуальный
PhysicalAddr = MmGetPhysicalAddress((void*)Addr);
if (PhysicalAddr.QuadPart)
{
// выделим себе виртуальную память по физ. адресу
VirtualAddr = (ULONG)MmMapIoSpace(PhysicalAddr, 4, 0);
if (VirtualAddr)
{
*(ULONG*)VirtualAddr = NewAddr; // установим перехват
ret = true;
MmUnmapIoSpace((void*)VirtualAddr, 4); // освободим вирт. страницу памяти
}
}
}

return ret;
}

Если не хукать SDT а просто писать куда-либо то достаточно будет просто сделать копию страници и записать туда данные

А вообще тут даже запрет прерываний не поможет.
Если ты вписываешь JMP XX XX XX XX то как не крути, нужно записать 5 байт. При атомарном доступе максимум 4. Оставшийся байт ты можеш не успеть записать если второе ядро успеет попасть на эту функцию. Маловероятное событие, но всё же.

найс, но поэтому прерывания и снимаются (раньше все одноядерные были). кстати неплохо, правда мне больше нравится перехватывать сами Nt а не таблицу.

ща на 7 попробую с кисом.

cheater_man
16.04.2010, 11:58
так она не должна быть чистой))
:D Имею ввиду без файрвола и антивиря :D

slesh
16.04.2010, 12:07
Кстати вообще когда-то была идея по изменению кода, которая могла заменять до 4 килобайт кода сразу и без разницы скольки ядерная система была. Без запрета прерываний и тому подобных вещей. Но что-то руки не дошли попробовать реализовать. А идея такая:
1) выделяешь себе одну страницу не выгружаемой памяти (4096 байт)
2) в неё копируешь страницу памяти в которой нужно сделать изменения
3) в своей копии ты делаешь изменения.
4) для своей копии ты получаешь адрес физической страницы закрепленной за ней.
5) в PTE подменяешь адрес физической страницы для виртуальной страницы в которой нужно было сделать изменения. И заменяш этот адрес на свою физ страницу.
Таким образом не трогая виртуальную страницу, ты просто подменяешь для неё физическую. И это будет мгновенно, но должно быть условие: код подменяемой виртуальной страницы не должен выполняться в момент подмены.