Перехват CreateProcess (моя версия вопроса :))

Тема в разделе "WASM.WIN32", создана пользователем tylerdurden, 20 дек 2006.

  1. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Написал след. простейший драйвер (см. код). Падает на DbgPrint (это я о том что если убрать оттуда DbgPrint, или поставить его _ДО_ вызова оригинального CreateProcess то все ок.

    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. typedef unsigned long DWORD;
    4. typedef unsigned short WORD;
    5. typedef unsigned char BYTE;
    6.  
    7. typedef struct _SYSTEM_SERVICE_TABLE{
    8.     DWORD *ServiceTable;
    9.     DWORD *CounterTable;
    10.     DWORD ServiceLimit;
    11.     BYTE *ArgumentTable;
    12. }SYSTEM_SERVICE_TABLE;
    13.  
    14. typedef struct _SERVICE_DESCRIPTOR_TABLE{
    15.     SYSTEM_SERVICE_TABLE ntoskrnl;
    16.     SYSTEM_SERVICE_TABLE win32k;
    17.     SYSTEM_SERVICE_TABLE unused1;
    18.     SYSTEM_SERVICE_TABLE unused2;
    19. }SERVICE_DESCRIPTOR_TABLE;
    20.  
    21. #define pSDT(fnNumber) KeServiceDescriptorTable->ntoskrnl.ServiceTable[fnNumber]
    22. #define intOff __asm cli
    23. #define intOn __asm sti
    24.  
    25. typedef NTSTATUS (*pNtCreateProcess)(DWORD ProcessDWORD,DWORD DesiredAccess,DWORD ObjectAttributes,DWORD InheritFromProcessDWORD,DWORD InheritDWORDs,DWORD SectionDWORD,DWORD DebugPort,DWORD ExceptionPort);
    26.  
    27. extern SERVICE_DESCRIPTOR_TABLE *KeServiceDescriptorTable;
    28. extern WORD *NtBuildNumber;
    29.  
    30. DWORD idNtCreateProcess=0x7a;
    31. pNtCreateProcess origNtCreateProcess;
    32.  
    33. NTSTATUS newNtCreateProcess(DWORD ProcessDWORD,DWORD DesiredAccess,DWORD ObjectAttributes,DWORD InheritFromProcessDWORD,DWORD InheritDWORDs,DWORD SectionDWORD,DWORD DebugPort,DWORD ExceptionPort){   
    34.     DWORD dwStatus;
    35.             dwStatus=origNtCreateProcess(ProcessDWORD,DesiredAccess,ObjectAttributes,InheritFromProcessDWORD,InheritDWORDs,SectionDWORD,DebugPort,ExceptionPort);
    36.          DbgPrint("Process started");
    37.     return dwStatus;
    38. }
    39.  
    40. NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject){
    41.     intOff;
    42.     pSDT(idNtCreateProcess)=(DWORD)origNtCreateProcess;
    43.     intOn;
    44.     DbgPrint("Stoped");
    45.     return STATUS_SUCCESS;
    46. }
    47.  
    48. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){  
    49.     origNtCreateProcess=(pNtCreateProcess)pSDT(idNtCreateProcess);
    50.     intOff;
    51.     pSDT(idNtCreateProcess)=(DWORD)newNtCreateProcess;
    52.     intOn;
    53.     DbgPrint("Started");
    54.     DriverObject->DriverUnload=DriverUnload;
    55.     return STATUS_SUCCESS;
    56. }
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    а эти new/origNtCreateProcess - они __stdcall ?
    по тексту не очень понятно
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Походу 0x7a это OpenProcess :) Сори, бывает... Это все потому что прошил, надо с ntdll.dll брать dword после 0xb8 и дело в шляпе...