Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   ядерная заглушка (https://forum.antichat.xyz/showthread.php?t=196474)

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

Цитата:

Сообщение от gold-goblin
Спасибо за хп версию.
Но она так же бсодит по тем же адресам.

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

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

gold-goblin 15.04.2010 19:38

Цитата:

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

sn0w 15.04.2010 19:49

Цитата:

Сообщение от gold-goblin
Да дело в вмваре. на чистой системе работает =)) Молодец!
И спасибо за разъяснение =)

работает то, это гуд) пробовал с чем? просто в сухую (без ничего) ето тоже что и 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

Цитата:

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

в данном случае он никуда не внедряется сам. Ну а проактивка (у меня на Kaspersky CRYSTAL) абсолютно не палит загрузку драйвера. Но аутпост палит

slesh 15.04.2010 22:05

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

Nightmarе 15.04.2010 22:08

Цитата:

Сообщение от slesh
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

Цитата:

Сообщение от _antony
да оно и так бсодит.
хп сп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

Цитата:

Сообщение от slesh
Мдауж. За сброс 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

Цитата:

Сообщение от _antony
так она не должна быть чистой))

:D Имею ввиду без файрвола и антивиря :D

slesh 16.04.2010 12:07

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


Время: 09:50