Не могу отловить NtCreateFile.

Тема в разделе "WASM.WIN32", создана пользователем hawk, 27 дек 2008.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте. Вот нашел исходник , подработал под свои задачи , а он не работает. Пои идеи когда я буду пытаться прочитать test.txt блокнот его не откроет , но такого не происходит .Вот код.
    Код (Text):
    1. #include <ntddk.h>
    2. //#include <winnt.h>      
    3. #include "Driver.h"
    4.  
    5.  
    6.  
    7. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject);
    8. NTSTATUS Create_File_IRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    9. NTSTATUS Close_HandleIRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    10. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    11. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    12.  
    13. KSPIN_LOCK MySpinLock;  
    14.  
    15.  
    16.  
    17. typedef PVOID* PNTPROC;
    18. typedef DWORD (ULONG);
    19. typedef DWORD*    PDWORD;
    20. typedef unsigned char (BYTE);
    21. typedef BYTE* PBYTE;
    22.  
    23. typedef struct _SYSTEM_SERVICE_TABLE
    24. {
    25.     PNTPROC ServiceTable;
    26.     PDWORD  CounterTable;
    27.     ULONG   ServiceLimit;
    28.     PBYTE   ArgumentTable;
    29. }
    30. SYSTEM_SERVICE_TABLE ,
    31. * PSYSTEM_SERVICE_TABLE ,
    32. * * PPSYSTEM_SERVICE_TABLE ;
    33.  
    34.  
    35. typedef struct _SERVICE_DESCRIPTOR_TABLE {
    36.    SYSTEM_SERVICE_TABLE ntoskrnl;  //SST для ntoskrnl.exe
    37.    SYSTEM_SERVICE_TABLE win32k;    //SST для win32k.sys
    38.    SYSTEM_SERVICE_TABLE unused1;   //не используется
    39.    SYSTEM_SERVICE_TABLE unused2;   //не используется
    40. }
    41. SERVICE_DESCRIPTOR_TABLE ,
    42. * PSERVICE_DESCRIPTOR_TABLE,
    43. * * PPSERVICE_DESCRIPTOR_TABLE ;
    44.  
    45. //макрос для простого доступа к SST ядра
    46. #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]
    47.  
    48. //импортируем указатель на SDT
    49. extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
    50.  
    51. //импортируем версию ядра NT
    52. extern PUSHORT NtBuildNumber;
    53.  
    54. //обьявляем прототип True функции для перехватываемой функции
    55. typedef NTSTATUS (*NtCreateFile) (OUT PHANDLE             FileHandle,
    56.   IN ACCESS_MASK          DesiredAccess,
    57.   IN POBJECT_ATTRIBUTES   ObjectAttributes,
    58.   OUT PIO_STATUS_BLOCK    IoStatusBlock,
    59.   IN PLARGE_INTEGER       AllocationSize OPTIONAL,
    60.   IN ULONG                FileAttributes,
    61.   IN ULONG                ShareAccess,
    62.   IN ULONG                CreateDisposition,
    63.   IN ULONG                CreateOptions,
    64.   IN PVOID                EaBuffer OPTIONAL,
    65.   IN ULONG                EaLength );
    66.  
    67.  
    68. //обьявляем True функцию
    69. NtCreateFile TrueNtCreateFile;
    70.  
    71. //номер системного вызова NtOpenProcess
    72. ULONG OpenProcId;
    73. ULONG PID=20320;
    74.  
    75.  
    76. //функция - обработчик перехвата
    77. NTSTATUS NewNtCreateFile (
    78. OUT PHANDLE             FileHandle,
    79.   IN ACCESS_MASK          DesiredAccess,
    80.   IN POBJECT_ATTRIBUTES   ObjectAttributes,
    81.   OUT PIO_STATUS_BLOCK    IoStatusBlock,
    82.   IN PLARGE_INTEGER       AllocationSize OPTIONAL,
    83.   IN ULONG                FileAttributes,
    84.   IN ULONG                ShareAccess,
    85.   IN ULONG                CreateDisposition,
    86.   IN ULONG                CreateOptions,
    87.   IN PVOID                EaBuffer OPTIONAL,
    88.   IN ULONG                EaLength )
    89. {
    90.     PWCHAR wcsFileName;
    91.     NTSTATUS status;
    92.     wchar_t *pdest;
    93.     wchar_t ch = '\\';
    94.     void* pMdl1;
    95.     void* pMdl2;
    96.     void* pMdl3;
    97.     UNICODE_STRING uniFileName, uniHideDirFile;
    98.     BOOLEAN locked1 = FALSE, locked2 = FALSE, locked3 = FALSE;
    99.  
    100.     RtlInitUnicodeString(&uniHideDirFile, L"test.txt");
    101.     DbgPrint("Started");
    102.     if (ExGetPreviousMode() == UserMode) {
    103.         pMdl1 = IoAllocateMdl(ObjectAttributes, sizeof(ObjectAttributes), FALSE, FALSE, NULL);
    104.         if (pMdl1 == NULL)
    105.             goto done;
    106.         __try {
    107.             MmProbeAndLockPages(pMdl1, KernelMode, IoModifyAccess);
    108.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    109.             DbgPrint("bla-bla-bla1: error");
    110.             goto done;
    111.         }
    112.         locked1 = TRUE;
    113.         pMdl2 = IoAllocateMdl(ObjectAttributes->ObjectName, sizeof(UNICODE_STRING), FALSE, FALSE, NULL);
    114.         if (pMdl2 == NULL)
    115.             goto done;
    116.         __try {
    117.             MmProbeAndLockPages(pMdl2, KernelMode, IoModifyAccess);
    118.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    119.             DbgPrint("bla-bla-bla2: error");
    120.             goto done;
    121.         }
    122.         locked2 = TRUE;
    123.         pMdl3 = IoAllocateMdl(ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Length, FALSE, FALSE, NULL);
    124.         if (pMdl3 == NULL)
    125.             goto done;
    126.         __try {
    127.             MmProbeAndLockPages(pMdl3, KernelMode, IoModifyAccess);
    128.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    129.             DbgPrint("bla-bla-bla3: error");
    130.             goto done;
    131.         }
    132.         locked3 = TRUE;
    133.    
    134. // Start
    135.         wcsFileName = ObjectAttributes->ObjectName->Buffer;
    136.         pdest = wcsrchr(wcsFileName, ch);
    137.         if (pdest > 0) {
    138.             RtlInitUnicodeString(&uniFileName, pdest+1);
    139.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0){
    140.                 status = STATUS_OBJECT_NAME_NOT_FOUND;
    141.                 goto done;
    142.             }
    143.         } else {
    144.         if (wcslen(wcsFileName) > 0)
    145.             RtlInitUnicodeString(&uniFileName, wcsFileName);
    146.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    147.                 status = STATUS_OBJECT_NAME_NOT_FOUND;
    148.                 goto done;
    149.             }
    150.     }
    151. // End
    152.  
    153. // End
    154. done:
    155.         if (locked1)
    156.                  MmUnlockPages(pMdl1);
    157.         if (locked2)
    158.             MmUnlockPages(pMdl2);
    159.         if (locked3)
    160.                      MmUnlockPages(pMdl3);
    161.             if (pMdl1 != NULL)
    162.             IoFreeMdl(pMdl1);
    163.         if (pMdl2 != NULL)
    164.                      IoFreeMdl(pMdl2);
    165.             if (pMdl3 != NULL)
    166.             IoFreeMdl(pMdl3);
    167.     }
    168. if (status == STATUS_SUCCESS)
    169.     TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
    170.                     AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    171.                             CreateOptions,EaBuffer,EaLength);
    172. return status;
    173. //    return TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
    174. //                    AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    175.                             CreateOptions,EaBuffer,EaLength);
    176. }
    177.  
    178.  
    179.  
    180.  
    181. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    182. {
    183.  
    184.  
    185.  
    186. ULONG CR0Reg;
    187. NTSTATUS status;
    188. UNICODE_STRING    fullFileName;
    189. HANDLE fileHandle;
    190. IO_STATUS_BLOCK    iostatus;
    191. OBJECT_ATTRIBUTES    oa;
    192. UNICODE_STRING devName;
    193.        
    194. PDEVICE_OBJECT fdo;
    195. PEXAMPLE_DEVICE_EXTENSION dx;
    196. UNICODE_STRING symLinkName;
    197.  
    198.  
    199.  
    200.  
    201. DriverObject->DriverUnload=UnloadRoutine;
    202. DriverObject->MajorFunction[IRP_MJ_CREATE]=Create_File_IRProcessing;
    203. DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close_HandleIRProcessing;
    204. DriverObject->MajorFunction[IRP_MJ_READ]=ReadWrite_IRPhandler;
    205. DriverObject->MajorFunction[IRP_MJ_WRITE]=ReadWrite_IRPhandler;
    206.  
    207. DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceControlRutine;
    208.  
    209.  
    210.  
    211.  
    212.  
    213.  
    214.  
    215.  
    216.  
    217.  
    218. RtlInitUnicodeString(&devName,L"\\Device\\EXAMPLE");
    219. status=IoCreateDevice(DriverObject,sizeof(EXAMPLE_DEVICE_EXTENSION), &devName,FILE_DEVICE_UNKNOWN,
    220.                       0,
    221.                       FALSE,
    222.                       &fdo);
    223. dx=(PEXAMPLE_DEVICE_EXTENSION) fdo->DeviceExtension;
    224. dx->fdo=fdo;
    225.  
    226. #define SYM_LINK_NAME L"\\DosDevices\\Example"
    227. RtlInitUnicodeString(&symLinkName,SYM_LINK_NAME);
    228. dx->ustrSymLinkName=symLinkName;
    229. status=IoCreateSymbolicLink(&symLinkName,&devName);
    230.  
    231. KeInitializeSpinLock(&MySpinLock);
    232.  
    233.  
    234.  
    235. RtlInitUnicodeString(&fullFileName,L"\\??\\C:\\make my driver.txt");
    236. InitializeObjectAttributes(&oa,
    237.                 &fullFileName,
    238.                 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    239.                 NULL,
    240.                 NULL);
    241.  
    242. status=ZwCreateFile(&fileHandle,
    243.             GENERIC_WRITE | SYNCHRONIZE,
    244.             &oa,
    245.             &iostatus,
    246.             0,
    247.             FILE_ATTRIBUTE_NORMAL,
    248.             FILE_SHARE_WRITE,
    249.             FILE_OPEN_IF,
    250.             FILE_SYNCHRONOUS_IO_NONALERT,
    251.             NULL,
    252.             0);
    253. ZwClose(fileHandle);
    254.  
    255.  
    256.  
    257.  
    258.  
    259.  
    260.  
    261.  
    262.  
    263.  
    264.  
    265.     //определяем версию ядра системы
    266.     switch (*NtBuildNumber)
    267.     {
    268.         case 2195 :  //win 2k
    269.          OpenProcId = 0x06A;
    270.          break;
    271.        
    272.         case 2600 : //win xp
    273.          OpenProcId = 0x026;
    274.          break;
    275.        
    276.         default :
    277.          return STATUS_NOT_IMPLEMENTED;
    278.          break;
    279.     }
    280.    
    281.     //устанавливаем перехват    
    282.         TrueNtCreateFile  = NTCALL(OpenProcId);
    283.  
    284.     __asm
    285.     {
    286.         cli                     // запрещаем прерывания
    287.         mov eax, cr0
    288.         mov CR0Reg,eax
    289.         and eax,0xFFFEFFFF      // сбросить WP bit
    290.         mov cr0, eax
    291.     }
    292.  
    293.     NTCALL(OpenProcId) = NewNtCreateFile;
    294.  
    295.     __asm
    296.     {
    297.         mov eax, CR0Reg    
    298.         mov cr0, eax            // востановить содержимое CR0
    299.         sti                     // разрешаем прерывания
    300.     }
    301.    
    302.  
    303.  
    304.  
    305.  
    306.  
    307.  
    308.  
    309.  
    310. return status;
    311.  
    312. }
    313.  
    314.  
    315.  
    316. NTSTATUS CompleteIrp(PIRP Irp,NTSTATUS status,ULONG info)
    317. {
    318.     Irp->IoStatus.Status=status;
    319.     Irp->IoStatus.Information=info;
    320.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
    321.     return status;
    322. }
    323.  
    324. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    325. {
    326.     ULONG BytesTdx=0;
    327.     NTSTATUS status=STATUS_SUCCESS;
    328.     return CompleteIrp(Irp,status,BytesTdx);
    329. }
    330.  
    331. NTSTATUS Create_File_IRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    332. {
    333.     PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    334.     return CompleteIrp(Irp,STATUS_SUCCESS,0);
    335. }
    336.  
    337. NTSTATUS Close_HandleIRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
    338.  
    339.     return CompleteIrp(Irp,STATUS_SUCCESS,0);
    340. }
    341.  
    342. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    343. {
    344. NTSTATUS status=STATUS_SUCCESS;
    345. PEXAMPLE_DEVICE_EXTENSION dx;
    346. PIO_STACK_LOCATION IrpStack;
    347. KIRQL irql;
    348. KIRQL currentIrql;
    349. ULONG BytesTdx=0;
    350. ULONG ControlCode;
    351. ULONG method;
    352. IrpStack=IoGetCurrentIrpStackLocation(Irp);
    353. IrpStack=IoGetCurrentIrpStackLocation(Irp);
    354. dx=(PEXAMPLE_DEVICE_EXTENSION) fdo->DeviceExtension;
    355. ControlCode=(ULONG)(IrpStack->Parameters.DeviceIoControl.IoControlCode);
    356. method=ControlCode & 0x03;
    357. irql=KeGetCurrentIrql();
    358. currentIrql=KeGetCurrentIrql();
    359. KeAcquireSpinLock(&MySpinLock,&irql);
    360.  
    361. PID=ControlCode;
    362. KeReleaseSpinLock(&MySpinLock,irql);
    363. return CompleteIrp(Irp,status,BytesTdx);
    364.  
    365. }
    366.  
    367. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    368. {
    369.  
    370.  
    371. ULONG CR0Reg;
    372.  
    373.  
    374.     //снимаем перехват
    375.     __asm
    376.     {
    377.         cli                     // запрещаем прерывания
    378.         mov eax, cr0
    379.         mov CR0Reg,eax
    380.         and eax,0xFFFEFFFF     // сбросить WP bit
    381.         mov cr0, eax
    382.     }
    383.  
    384.     NTCALL(OpenProcId) = TrueNtCreateFile;
    385.  
    386.     __asm
    387.     {
    388.         mov eax, CR0Reg    
    389.         mov cr0, eax            // востановить содержимое CR0
    390.         sti                     // разрешаем прерывания
    391.     }
    392.  
    393.     return;
    394.  
    395. }
    Запускаю dryver.sys с помощью DriverMonitor.
    Подскажите пожалуйста , в чем ошибка?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Отладчик желательно применить..
    Для начала нужно знать устанавливаетсо ли хук ?
    И есчо вполне возможно что блокнот юзоет NtOpenFile :)
    Хуки в пограничном режиме слишком хлипкие, нужно глубже..
     
  3. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Для начала нужно знать устанавливаетсо ли хук ?

    Да.Перехват осуществляется.

    И есчо вполне возможно что блокнот юзоет NtOpenFile :)

    Также пробывал удалять файлы-DeleteFile-реакции никакой.

    Немоглибы Вы пожалуйста точно описать , что вы имели ввиду под выражением "Хуки в пограничном режиме слишком хлипкие, нужно глубже.."?
    Спасибо
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Поясняю: Хуки в сст ненадёжны и не удобны.
    Раз перехват осуществляется в таком случае запускаем отладчик, ставим бряк на NewNtCreateFile и трассируем. Там и видно будет что и как.
     
  5. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    hawk
    Я тебе еще в той теме, которая в беггинерсах написал, потом засомневалсо и потер. Ща проверил.
    Ты не пробовал хукать NtCreateFile (0x25 for XP), а не NtCreateIoCompletion ?
     
  6. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    _Aspire огромное спосибо. Все получилось!
     
  7. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Хуки в сст ненадёжны и не удобны. А что же надежней сст хуков. Подскажите пожалуйста.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hawk
    Ядро на этой таблице не заканчивается, оно тока там начинается, гугль в помощ.
    [Я ведь всё с нуля напальцах не собираюсь пересказывать.]
     
  9. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Ну вот отловил я NtCreateFile, а как узнать какой именно процесс вызвал его?Это вообще возможно?
     
  10. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    hawk
    Меня терзают смутные сомнения, но мне кажется, что мы будем находиться в контексте вызывающего процесса. Сейчас нет возможности проверить, попробуй сам. (PsGetCurrentProcess)
     
  11. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Возник вопрос.Вот если мне необходимо отловить запись в какойто конкретный файл,как быть?
    Я вижу следующее решение:
    отловить ntcreatefile и если аргументом функции являеться интересующий нас файл,мы сохраняем хендл после выполнения ntCreateFile.Затем отлавливаем NtWriteFile,и если передоваемый ей хэндл,тот же самый ,что вернула ntCreateFile,то допустим блокируем запись в файл.
    Такой способ жизнеспособен?
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    hawk
    В разных процессах - разные хендлы. В итоге, может получиться, что твой сохраненный хендл совпадет с хендлом другого файла (объекта) в другом процессе. И все, пипец...

    Наверное, имеет смысл проверять параметр ACCESS_MASK. Или перехватывать сразу NtWriteFile?
     
  13. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    перехватывать сразу ntWriteFile?А как из его параметров выташить имя файла?
    Спасибо,на счёт такой ситуации с хэнделами я не подумал.А что,если ввести дополнительный параметр,т.е. при перехвате ntCreateFile в отдельное поле заносить ещё имя процесса который его вызвал,а точнее полный путь к процессу?И тогда,при перехвате ntWriteFile сравнивать не только хэндл,но и имя процесса.Тогда по идеи всё должно корректно работать.
     
  14. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    как вообще такой механизм реализован в антивирусах,при написании поведенческого анализатора?
     
  15. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    hawk
    Все проще. Насколько помню, для того чтобы писать в файл, он должен быть открыт с правами на запись. Вот и ограничивай права. Я ж тебе сверху писал.
     
  16. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    ну это я понимаю,но фаил с правами записи,не означает,что в него запишут,я хочу конкретно запись в файл отловить.Как вы думайте,вышеописанный мной метод пойдёт или есть что-то лучше?
     
  17. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    hawk
    Описанный тобой метод, имхо, будет тем более тормознутым, чем дольше работает юзер в системе, т.к. с каждым открытым файлом будут расти два массива (хендлов и процессов) по кторым нужно пробежаться перед тем, как вызвать оригинальную функцию. Хз.. помоему с этим никто не заморачивается. Просто, если кто-то пытается открыть на запись какой-нить стратегический файл - выкидывают аллерт.
    Но, если уж так необходимо, видимо лучше хучить врайтфайл и сверять имя через хендл (ZwQueryInformationFile). Это так, на вскидку...
     
  18. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Народ ХЭЛП.
    Пытаюсь отловить запись в реестр, точно также как я и отлавливал обращение к файлу.
    Полностью отключить обращение к реестру я могу , а вот к конкретной ветке(ключу), не выходит.
    ИМХО сравнение както не верно делаю.

    Код (Text):
    1. NTSTATUS NewNtCreateKey (
    2.   OUT PHANDLE             pKeyHandle,
    3.   IN ACCESS_MASK          DesiredAccess,
    4.   IN POBJECT_ATTRIBUTES   ObjectAttributes,
    5.   IN ULONG                TitleIndex,
    6.   IN PUNICODE_STRING      Class OPTIONAL,
    7.   IN ULONG                CreateOptions,
    8.   OUT PULONG              Disposition OPTIONAL)
    9. {
    10.  
    11. PWCHAR wcsFileName;
    12.     NTSTATUS status;
    13.         NTSTATUS FILE_O;
    14.         ULONG KP=0;
    15.     wchar_t *pdest;
    16.     wchar_t ch = '\\';
    17.     void* pMdl1;
    18.     void* pMdl2;
    19.     void* pMdl3;
    20.     UNICODE_STRING uniFileName, uniHideDirFile;
    21.     BOOLEAN locked1 = FALSE, locked2 = FALSE, locked3 = FALSE;
    22.  
    23. status=STATUS_SUCCESS;
    24.  
    25.     RtlInitUnicodeString(&uniHideDirFile, L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    26.  
    27.  
    28.  
    29.  
    30.  
    31.         wcsFileName = ObjectAttributes->ObjectName->Buffer;
    32.         if (wcslen(wcsFileName) > 0)RtlInitUnicodeString(&uniFileName, wcsFileName);
    33.          if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    34.                status = STATUS_OBJECT_NAME_NOT_FOUND;      
    35.                goto done;
    36.             };
    37.  
    38. done:
    39.  
    40.  
    41. if (status == STATUS_SUCCESS){TrueNtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex, Class, CreateOptions,Disposition);}
    42. return status;
    43. }
    Вот функция оброботчика. Если в ее начале поставить
    status = STATUS_OBJECT_NAME_NOT_FOUND;
    return status;
    то ни к одному ключу обращение произвести нельзя-перехват происходит.
    А вот со сравнением пути как-то тяжко.
    Может не правильная форма записи? Хотя вроде форму брал из В.П.Солдатова-т.е. все должно быть в норме, подскажите пожалуйста, в чем баг, кроме моей головы:)
     
  19. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Пока только стилистически поправлю.
    Код (Text):
    1. ...
    2. if (ObjectAttributes->ObjectName->Length) //длина больше нуля
    3.          if (RtlCompareUnicodeString(ObjectAttributes->ObjectName, &uniHideDirFile, TRUE ) == 0)// строки равны
    4.                  status = STATUS_OBJECT_NAME_NOT_FOUND;
    5.  
    6. if (status == STATUS_SUCCESS)
    7.           status = TrueNtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex, Class, CreateOptions,Disposition);
    8.  
    9. return status;
    10. }
     
  20. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Нашел причину. Как говорил Козьма Прутков(или фиг его как там) -зри в корень, а корень-ядро.
    Так вот , RegCreateKeyEx в advapi32.dll делает некую фильтрацию, т.е. в зависимости от первого параметра функции мы перепрыгиваем в то или иное место библиотеки, а при первом параметре HKEY_LOCAL_MACHINE мы никуда не ответвляемся и продолжаем свой путь по основной функции , и при передаче параметров NtCreateKey мы , в качестве ObjectName-> имеем чисто путь без указания ветви реестра. Т.е. чтобы все работало для HKEY_LOCAL_MACHINE необходимо изменить лишь одну строку-
    RtlInitUnicodeString(&uniHideDirFile, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    Вот и все! Для других ветвей реестра еще не смотрел.