Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прицип работы CreateProcess на ринг0, объясните плз 
V
    Опции темы
AugMaster
Дата 7.3.2010, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.8.2006

Репутация: нет
Всего: 1



ситуация такова.
Есть процесс a.exe, который при помощи CreateProcess запускает процесс b.exe(происходит в юзермоде,в  XP), получает его хэндл и творит зло.
Задача - возвратить процессу a.exe инвалидный хэндл. При перехвате из ядра NtCreateProcessEx можно выставить возвращаемый хэндл=NULL или другое левое значение, но тогда система убивает процесс b.exe . То есть надо перехватывать какую-то более высокую функцию, чтобы система знала,что процесс запущен и все ок, но при этом a.exe получал мусор. Может ли кто-то подсказать,как именно работает CreateProcess и на каком этапе (желательно в ядре) и что именно надо перехватывать, чтобы и процесс запустился,и чтобы запускающий его процесс остался без целевого хэндла

Это сообщение отредактировал(а) AugMaster - 7.3.2010, 01:51
PM MAIL   Вверх
bra1ny
Дата 7.3.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



для справки.
1. Открытие образа и создание раздела.
2. Создание EPROCESS , KPROCESS , АП процесса , формирование PEB.
3.Создается первичный поток. формирование ETHREAD.
4.csrss уведомляется о новом процессе.
5.запуск первичного потока.
6.Выполнение KiThreadStartup.
Не очень детально , на память уже все тонкости не припомню(Руссинович вам поможет).

Код перехвата покажите.


Это сообщение отредактировал(а) bra1ny - 7.3.2010, 02:05
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
AugMaster
Дата 7.3.2010, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.8.2006

Репутация: нет
Всего: 1



Код

#include <ntddk.h>
#include <ntdef.h>

typedef PVOID* PNTPROC;
typedef DWORD (ULONG);
typedef DWORD*    PDWORD;
#define WORD unsigned short
#define BOOL unsigned long
typedef unsigned char (BYTE);
typedef BYTE* PBYTE;

typedef struct _SYSTEM_SERVICE_TABLE
{
    PNTPROC ServiceTable; 
    PDWORD  CounterTable; 
    ULONG   ServiceLimit; 
    PBYTE   ArgumentTable; 
}

SYSTEM_SERVICE_TABLE ,
* PSYSTEM_SERVICE_TABLE ,
* * PPSYSTEM_SERVICE_TABLE ;


typedef struct _SERVICE_DESCRIPTOR_TABLE {
   SYSTEM_SERVICE_TABLE ntoskrnl;  //SST aey ntoskrnl.exe
   SYSTEM_SERVICE_TABLE win32k;    //SST aey win32k.sys
   SYSTEM_SERVICE_TABLE unused1;   //ia eniieucoaony
   SYSTEM_SERVICE_TABLE unused2;   //ia eniieucoaony
}
SERVICE_DESCRIPTOR_TABLE ,
* PSERVICE_DESCRIPTOR_TABLE,
* * PPSERVICE_DESCRIPTOR_TABLE ;

#define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]
extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
extern PUSHORT NtBuildNumber;
ULONG NtCreateProcessExId;

typedef NTSTATUS 
(NTAPI *PNtCreateProcessEx) (
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    IN HANDLE ParentProcess,
    IN BOOLEAN InheritObjectTable,
    IN HANDLE SectionHandle OPTIONAL,
    IN HANDLE DebugPort OPTIONAL,
    IN HANDLE ExceptionPort OPTIONAL,
    IN HANDLE Unknown);

PNtCreateProcessEx TrueNtCreateProcessEx;

NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(    IN HANDLE ProcessHandle,
    IN DWORD ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength
    );

#define PROCNAMELEN     20
#define NT_PROCNAMELEN  16
ULONG gProcessNameOffset;

void GetProcessNameOffset()
{
    PEPROCESS curproc;
    int i;
    curproc = PsGetCurrentProcess();
    for( i = 0; i < 3*PAGE_SIZE; i++ )
    {
        if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
        {
            gProcessNameOffset = i;
        }
    }
}

BOOL GetProcessName(PCHAR name)
{
    PEPROCESS       curproc;
    char            *nameptr;
    ULONG           i;
    KIRQL           oldirql;

    if( gProcessNameOffset )
    {
        curproc = PsGetCurrentProcess();
        nameptr   = (PCHAR) curproc + gProcessNameOffset;
        strncpy( name, nameptr, NT_PROCNAMELEN );
        name[NT_PROCNAMELEN] = 0; 
        return TRUE;
    }
    return FALSE;
}

NTKERNELAPI NTSTATUS PsLookupProcessByProcessId (IN PVOID ProcessId,OUT PEPROCESS   *Process);

NTSYSAPI PUCHAR NTAPI PsGetProcessImageFileName(PEPROCESS Process );


NTSTATUS NewNtCreateProcessEx(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    IN HANDLE ParentProcess,
    IN BOOLEAN InheritObjectTable,
    IN HANDLE SectionHandle OPTIONAL,
    IN HANDLE DebugPort OPTIONAL,
    IN HANDLE ExceptionPort OPTIONAL,
    IN HANDLE Unknown)
{
    NTSTATUS rc;
    CHAR ProcessName[PROCNAMELEN];
    PUNICODE_STRING Name;
    PCHAR procImageName = NULL;
    PEPROCESS aaa=NULL;
    NTSTATUS status;
    CHAR bff[260];
PROCESS_BASIC_INFORMATION pbi;
   DbgPrint("NewNtCreateProcessEx():%d zapustil \n", PsGetCurrentProcessId()); 

        
    rc = TrueNtCreateProcessEx(ProcessHandle,DesiredAccess,ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown); 
ZwQueryInformationProcess(*ProcessHandle,0,&pbi,sizeof(PROCESS_BASIC_INFORMATION),NULL);
DbgPrint("%d \n",pbi.UniqueProcessId);
status=PsLookupProcessByProcessId((HANDLE)pbi.UniqueProcessId,&aaa);
if (NT_SUCCESS(status)) {
            procImageName=PsGetProcessImageFileName(aaa);
                ObDereferenceObject(ProcessHandle);
                if (procImageName)    DbgPrint("%s \n",procImageName);
             [color=crimson]   if (_stricmp(procImageName,"b.exe")==0) *ProcessHandle=0;[/color]

                }
        else DbgPrint("Unsuc");
    return rc;
}

NTSTATUS HookProc()
{
    ULONG CR0Reg;
    switch (*NtBuildNumber)
    {
        case 2600 : //win xp
         NtCreateProcessExId = 0x0030;
         break;
        
        default :
         return STATUS_NOT_IMPLEMENTED;
         break;
    }
    

    TrueNtCreateProcessEx = NTCALL(NtCreateProcessExId);

    __asm
    {
        cli                     
        mov eax, cr0
        mov CR0Reg,eax
        and eax,0xFFFEFFFF        
        mov cr0, eax
    }

    NTCALL(NtCreateProcessExId) = NewNtCreateProcessEx;

    __asm
    {
        mov eax, CR0Reg    
        mov cr0, eax           
        sti                    
    }

    return STATUS_SUCCESS;
}

void UnHookProc()
{
    ULONG CR0Reg;
    __asm
    {
        cli                     
        mov eax, cr0
        mov CR0Reg,eax
        and eax,0xFFFEFFFF    
        mov cr0, eax
    }

    NTCALL(NtCreateProcessExId) = TrueNtCreateProcessEx;

    __asm
    {
        mov eax, CR0Reg    
        mov cr0, eax            
        sti                     
    }
}


void DriverUnload (PDRIVER_OBJECT pDriverObject)
{
    UnHookProc();
    DbgPrint("Driver stoped.");
    return;
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath)
{
    NTSTATUS rc = STATUS_SUCCESS;
    DbgPrint("Driver started.");
    GetProcessNameOffset();
    HookProc();
    pDriverObject->DriverUnload  = DriverUnload;
    return  rc;
}

код рабочий,бсодов не дает, дебуг-сообщения выводит правильно. Просто если подсовываешь неправильный хэндл - убивает процесс b.exe

Это сообщение отредактировал(а) AugMaster - 7.3.2010, 02:18
PM MAIL   Вверх
AugMaster
Дата 7.3.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 3.8.2006

Репутация: нет
Всего: 1



почитал Руссиновича, расстроило. Судя по всему, перехват, который я хочу реализовать, в ринг0 неуспех  -  надо перехватывать CreateProcessW , который является функцией юзермодной kernel32.dll . Полностью код ,вшитый в длл, не разобрал, но в любом случае после NtCreateProcessEx, вызываемой в теле функции CreateProcessInternalW (кажется так), еще идет тысяча и одна  инструкция по выделению памяти и т.д., требующие валидный хэндл процесса. Тема закрыта.

Это сообщение отредактировал(а) AugMaster - 7.3.2010, 20:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.