Вызов напрямую winapi

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 12 июл 2022.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    280
    я попытался вызвать NtCreateFile ассемблере,кроме ошибки ничего вышло, ошибка как здесь https://board.flatassembler.net/topic.php?t=15444 ,переписал на язык Си все получилось
     
  2. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    280
    Mikl___,
    Код (C):
    1.  
    2. #include <windows.h>
    3.  
    4.  
    5.  
    6.  
    7. typedef struct _UNICODE_STRING {
    8.     USHORT Length;
    9.     USHORT MaximumLength;
    10.     PWSTR  Buffer;
    11. } UNICODE_STRING;
    12. typedef UNICODE_STRING *PUNICODE_STRING;
    13.  
    14.  
    15. typedef struct _OBJECT_ATTRIBUTES {
    16.     ULONG Length;
    17.     HANDLE RootDirectory;
    18.     PUNICODE_STRING ObjectName;
    19.     ULONG Attributes;
    20.     PVOID SecurityDescriptor;
    21.     PVOID SecurityQualityOfService;
    22. } OBJECT_ATTRIBUTES;
    23. typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
    24.  
    25.  
    26. typedef struct _IO_STATUS_BLOCK {
    27. #pragma warning(push)
    28. #pragma warning(disable: 4201)
    29.     union {
    30.         NTSTATUS Status;
    31.         PVOID Pointer;
    32.     } DUMMYUNIONNAME;
    33. #pragma warning(pop)
    34.  
    35.     ULONG_PTR Information;
    36. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
    37.  
    38.  
    39.  
    40.  
    41. VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING DestinationString,PCWSTR SourceString);
    42.  
    43. __kernel_entry NTSTATUS
    44. NTAPI
    45. NtCreateFile (
    46.      PHANDLE FileHandle,
    47.      ACCESS_MASK DesiredAccess,
    48.      POBJECT_ATTRIBUTES ObjectAttributes,
    49.      PIO_STATUS_BLOCK IoStatusBlock,
    50.      PLARGE_INTEGER AllocationSize,
    51.      ULONG FileAttributes,
    52.      ULONG ShareAccess,
    53.      ULONG CreateDisposition,
    54.      ULONG CreateOptions,
    55.      PVOID EaBuffer,
    56.      ULONG EaLength
    57.     );
    58.  
    59.  
    60. __kernel_entry
    61. NTSTATUS
    62. NTAPI
    63. NtWriteFile (
    64.      HANDLE FileHandle,
    65.      HANDLE Event,
    66.      PVOID ApcRoutine,
    67.      PVOID ApcContext,
    68.      PIO_STATUS_BLOCK IoStatusBlock,
    69.      PVOID Buffer,
    70.      ULONG Length,
    71.      PLARGE_INTEGER ByteOffset,
    72.      PULONG Key
    73.     );
    74.  
    75. __kernel_entry
    76. NTSTATUS
    77. NTAPI
    78. NtClose (
    79.      HANDLE FileHandle
    80.     );
    81.  
    82. #define FILE_WRITE_DATA           ( 0x0002 )
    83. #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )
    84. #define FILE_WRITE_EA             ( 0x0010 )
    85. #define FILE_APPEND_DATA          ( 0x0004 )
    86. #define SYNCHRONIZE               (0x00100000L)
    87.  
    88.  
    89.  
    90.  
    91. #define DELETE                           (0x00010000L)
    92. #define READ_CONTROL                     (0x00020000L)
    93. #define WRITE_DAC                        (0x00040000L)
    94. #define WRITE_OWNER                      (0x00080000L)
    95. #define SYNCHRONIZE                      (0x00100000L)
    96.  
    97. #define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
    98.  
    99. #define STANDARD_RIGHTS_READ             (READ_CONTROL)
    100. #define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
    101. #define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
    102.  
    103. #define STANDARD_RIGHTS_ALL              (0x001F0000L)
    104.  
    105. #define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)
    106.  
    107.  
    108.  
    109. #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
    110.  
    111. #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
    112.                                    FILE_WRITE_DATA          |\
    113.                                    FILE_WRITE_ATTRIBUTES    |\
    114.                                    FILE_WRITE_EA            |\
    115.                                    FILE_APPEND_DATA         |\
    116.                                    SYNCHRONIZE)
    117.  
    118.  
    119. #define FILE_DELETE_ON_CLOSE            0x00001000
    120. #define FILE_CREATE                     0x00000002
    121. #define FILE_OVERWRITE_IF               0x00000005
    122. #define FILE_RANDOM_ACCESS              0x00000800
    123. #define FILE_NON_DIRECTORY_FILE         0x00000040
    124. #define FILE_SYNCHRONOUS_IO_ALERT       0x00000010
    125. #define FILE_SYNCHRONOUS_IO_NONALERT    0x00000020
    126. #define OBJ_CASE_INSENSITIVE            0x00000040L
    127.  
    128. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    129.     (p)->Length = sizeof( OBJECT_ATTRIBUTES );          \
    130.     (p)->RootDirectory = r;                             \
    131.     (p)->Attributes = a;                                \
    132.     (p)->ObjectName = n;                                \
    133.     (p)->SecurityDescriptor = s;                        \
    134.     (p)->SecurityQualityOfService = NULL;               \
    135.     }
    136.  
    137.  
    138.  
    139. UNICODE_STRING stroka;
    140.  
    141. HANDLE fhandle;
    142. OBJECT_ATTRIBUTES filename;
    143. IO_STATUS_BLOCK status_io;
    144.  
    145.  
    146.  
    147.  
    148.  
    149. int runpoint(void)
    150. {
    151.  
    152.  
    153.  
    154.  
    155.  
    156. InitializeObjectAttributes(&filename, &stroka,OBJ_CASE_INSENSITIVE, NULL, NULL);
    157.  
    158. RtlInitUnicodeString(&stroka,L"\\??\\\\C:\\overrage.bin");
    159.  
    160. NtCreateFile(&fhandle,FILE_ALL_ACCESS,&filename,&status_io,0,FILE_ATTRIBUTE_NORMAL,0,FILE_OVERWRITE_IF,FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_DELETE_ON_CLOSE,0,0);
    161.  
    162. NtClose(fhandle);
    163.  
    164.  
    165.  
    166. return 0;
    167.  
    168. };
    169.  
    --- Сообщение объединено, 24 май 2026 ---
    Mikl___, я пытался это сделать на x64 ассемблере
     
  3. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    Скорей всего проблема в описании структур.
    К примеру если посмотреть на UNICODE_STRING, то поле Buffer начинается со-смещения 8, хотя на х32 оффсет был 4.
    Код (Text):
    1. 0: kd> dt _unicode_string -v
    2. nt!_UNICODE_STRING
    3. struct _UNICODE_STRING, 3 elements, 0x10 bytes
    4.    +0x000 Length           : Uint2B
    5.    +0x002 MaximumLength    : Uint2B
    6.    +0x008 Buffer           : Ptr64 to Uint2B
    7. 0: kd>
    8.  
    То есть между MaxLen и Buffer нужно добавить ещё 1 дворд для выравнивания:
    Код (ASM):
    1. struct UNICODE_STRING
    2.    Length        dw  0   ; 00
    3.    MaxLength     dw  0   ; 02
    4.    Padding       dd  0   ; 04  <--------
    5.    Buffer        dq  0   ; 08
    6. ends
    7.  
     
    Mikl___ нравится это.
  4. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    280
    Marylin, выравнивание на 16 байт для x64 ?
     
    Marylin нравится это.
  5. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    Вот на fasm'e - всё работает:

    Код (ASM):
    1. format   pe64 gui 6.0
    2. include 'win64w.inc'
    3. entry    start
    4.  
    5. section '.data' data readable writeable
    6. struct UNICODE_STRING
    7.     Length          dw 0
    8.     MaximumLength   dw 0
    9.     Padding         dd 0   ;<-----
    10.     Buffer          dq 0
    11. ends
    12. struct OBJECT_ATTRIBUTES
    13.     Length          dq sizeof.OBJECT_ATTRIBUTES
    14.     RootDirectory   dq 0
    15.     ObjectName      dq 0
    16.     Attributes      dd 0
    17.     Padding         dd 0   ;<-----
    18.     SecurityDesc    dq 0,0
    19. ends
    20. struct IO_STATUS_BLOCK
    21.     Status          dq 0
    22.     Information     dq 0
    23. ends
    24.  
    25. align  8
    26. obj_name   UNICODE_STRING
    27. attr       OBJECT_ATTRIBUTES
    28. status     IO_STATUS_BLOCK
    29.  
    30. FILE_READ_DATA     = 1
    31. FILE_WRITE_DATA    = 2
    32. FILE_OVERWRITE_IF  = 5
    33.  
    34. fname   du '\??\D:\test64.txt',0      ;//<---- укажи свой путь
    35. align 8
    36. fdata   db 'wasm.in - x64 NtCreateFile() + NtWriteFile() example'
    37. dlen    =   $-fdata
    38.  
    39. align 8
    40. hFile      dq 0
    41. ByteOffset dq 0     ;//<---- Должен быть выровнен на 8 байт
    42.  
    43. ;//-----------------
    44. section '.code' code readable executable
    45. start:  sub     rsp,8
    46. frame
    47.         invoke  RtlInitUnicodeString, obj_name, fname
    48.         mov     [attr.ObjectName],obj_name
    49.  
    50.         invoke  NtCreateFile,hFile,\
    51.                              FILE_READ_DATA + FILE_WRITE_DATA,\
    52.                              attr, status, 0,0,\
    53.                              FILE_SHARE_READ + FILE_SHARE_WRITE,\
    54.                              FILE_OVERWRITE_IF, 0,0,0
    55.  
    56.         invoke  NtWriteFile,[hFile],0,0,0,\
    57.                              status,fdata,dlen,ByteOffset,0
    58.         invoke  NtClose,[hFile]
    59. endf
    60.         invoke  ExitProcess,0
    61. ;//------------------------
    62.  
    63. section '.idata' import data readable writeable
    64. library kernel32,'kernel32.dll',\
    65.          user32, 'user32.dll',\
    66.          ntdll,  'ntdll.dll'
    67.  
    68. include 'api\kernel32.inc'
    69. include 'api\user32.inc'
    70. import ntdll,\
    71.        RtlInitUnicodeString,'RtlInitUnicodeString',\
    72.        NtCreateFile,'NtCreateFile',\
    73.        NtWriteFile, 'NtWriteFile',\
    74.        NtClose,     'NtClose'
    75.  
     
    Mikl___ нравится это.
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Marylin, и всё же маленкая ошибка в вашем коде есть. Скорее даже не ошибка а мелкий недочёт (мой варнинг). :) Макрос endf должен по идее после вызова функции ExitProcess стоять. Или я ошибаюсь ? :)
     
  7. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    GRAFik, endf можете поместить после вызова любой апи.
    просто exit уходит чёрт знает куда, и не возвращается обратно в этот код, поэтому лучше перестраховаться.
     
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Зато код будет на две инструкции короче. Ассемблерщики же порой за каждую лишнюю инструкцию насмерть стоят. :) А перестраховываться там, по-моему, не от чего - опасности никакой.
    Код (ASM):
    1.  
    2. call  cs:NtClose
    3. add  rsp, 60h
    4. sub  rsp, 20h
    5. mov  rcx, 0  
    6. call  cs:ExitProcess
    7. ;=========================
    8. call  cs:NtClose
    9. mov  rcx, 0  
    10. call  cs:ExitProcess
    11. ;=========================
    12.  
     
  9. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    ну конечно - сбил стек sub rsp,60h, и оставил его таким.
    в общем ставьте endf куда хотите.. хоть в секцию-данных.
     
  10. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    280
    Marylin, а почему то в некоторые структуры необязательно добавлять байты для выравнивания(то есть Padding),такие как IO_STATUS_BLOCK,все переменные должны быть по адресу кратному 8 ?

    Код (ASM):
    1.  
    2. align  8 ; <----- то же должно быть выровнено на 8 байт ?
    3. obj_name   UNICODE_STRING
    4. attr       OBJECT_ATTRIBUTES
    5. status     IO_STATUS_BLOCK
    6. FILE_READ_DATA     = 1
    7. FILE_WRITE_DATA    = 2
    8. FILE_OVERWRITE_IF  = 5
    9. fname   du '\??\D:\test64.txt',0      
    10. align 8
    11. fdata   db 'wasm.in - x64 NtCreateFile() + NtWriteFile() example'
    12. dlen    =   $-fdata
    13. align 8
    14. hFile      dq 0
    15. ByteOffset dq 0    
    16.  
     
  11. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    Да, выравнивание критически важно в режиме х64. Переменные должны быть выровнены как мин на 4, хотя желательно ставить всегда 8, чтобы потом не вылавливать в отладчике блох. В структурах только указатели на память должны быть выровнены на границу 8-байт, при этом сами структуры тоже требуют выравнивания в памяти. Но учитывая, что размеры всех структур х64 всегда кратны 8 байт, то можно собрать их в последовательный массив, и указать align 8 только первой:
    Код (Text):
    1.  
    2. align  8   ;<--- Выравнивание на 8 байт всего массива структур (размер каждой из них тоже кратен 8)
    3. obj_name   UNICODE_STRING    
    4. attr       OBJECT_ATTRIBUTES
    5. status     IO_STATUS_BLOCK
    6.  
    Например WinDbg обозначает указатели как Ptr64 (pointer) - если посмотреть, то все эти линки выровнены.
    Код (Text):
    1. 0: kd> dt _UNICODE_STRING -v
    2. struct _UNICODE_STRING, 3 elements, 0x10 bytes  ;<--- Размер кратен 8 (как и у остальных)
    3.    +0x000 Length           : Uint2B
    4.    +0x002 MaximumLength    : Uint2B    ;<------------ Всего 4 байта, и нужно вставить 1 дворд
    5.    +0x008 Buffer           : Ptr64     ;<------------ Указатель на память
    6.  
    7. 0: kd> dt _OBJECT_ATTRIBUTES -v
    8. struct _OBJECT_ATTRIBUTES, 6 elements, 0x30 bytes
    9.    +0x000 Length                   : Uint4B   <------ Расширить до 8 байт
    10.    +0x008 RootDirectory            : Ptr64
    11.    +0x010 ObjectName               : Ptr64 to _UNICODE_STRING
    12.    +0x018 Attributes               : Uint4B   <------ Расширить до 8 байт
    13.    +0x020 SecurityDescriptor       : Ptr64
    14.    +0x028 SecurityQualityOfService : Ptr64
    15.  
    16. 0: kd> dt _IO_STATUS_BLOCK -v
    17. struct _IO_STATUS_BLOCK, 3 elements, 0x10 bytes
    18.    +0x000 Status           : Int4B    ;<---------------------------------------+
    19.    +0x000 Pointer          : Ptr64    ;<--- по смещению(0) может лежать или Status, или Pointer
    20.    +0x008 Information      : Uint8B
    21.  
     
    Mikl___ нравится это.
  12. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Кто-нибудь может чуть поподробней расписать - что в этом коде происходит ?

    Код (C):
    1. #include <windows.h>
    2.  
    3. typedef struct _UNICODE_STRING {
    4.     USHORT Length;
    5.     USHORT MaximumLength;
    6.     PWSTR  Buffer;
    7. } UNICODE_STRING;
    8. typedef UNICODE_STRING *PUNICODE_STRING;
    9. typedef struct _OBJECT_ATTRIBUTES {
    10.     ULONG Length;
    11.     HANDLE RootDirectory;
    12.     PUNICODE_STRING ObjectName;
    13.     ULONG Attributes;
    14.     PVOID SecurityDescriptor;
    15.     PVOID SecurityQualityOfService;
    16. } OBJECT_ATTRIBUTES;
    17. typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
    18. typedef struct _IO_STATUS_BLOCK {
    19. #pragma warning(push)
    20. #pragma warning(disable: 4201)
    21.     union {
    22.         NTSTATUS Status;
    23.         PVOID Pointer;
    24.     } DUMMYUNIONNAME;
    25. #pragma warning(pop)
    26.     ULONG_PTR Information;
    27. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
    28. VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING DestinationString,PCWSTR SourceString);
    29. __kernel_entry NTSTATUS
    30. NTAPI
    31. NtCreateFile (
    32.      PHANDLE FileHandle,
    33.      ACCESS_MASK DesiredAccess,
    34.      POBJECT_ATTRIBUTES ObjectAttributes,
    35.      PIO_STATUS_BLOCK IoStatusBlock,
    36.      PLARGE_INTEGER AllocationSize,
    37.      ULONG FileAttributes,
    38.      ULONG ShareAccess,
    39.      ULONG CreateDisposition,
    40.      ULONG CreateOptions,
    41.      PVOID EaBuffer,
    42.      ULONG EaLength
    43.     );
    44. __kernel_entry
    45. NTSTATUS
    46. NTAPI
    47. NtWriteFile (
    48.      HANDLE FileHandle,
    49.      HANDLE Event,
    50.      PVOID ApcRoutine,
    51.      PVOID ApcContext,
    52.      PIO_STATUS_BLOCK IoStatusBlock,
    53.      PVOID Buffer,
    54.      ULONG Length,
    55.      PLARGE_INTEGER ByteOffset,
    56.      PULONG Key
    57.     );
    58. __kernel_entry
    59. NTSTATUS
    60. NTAPI
    61. NtClose (
    62.      HANDLE FileHandle
    63.     );
    64. #define FILE_WRITE_DATA           ( 0x0002 )
    65. #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )
    66. #define FILE_WRITE_EA             ( 0x0010 )
    67. #define FILE_APPEND_DATA          ( 0x0004 )
    68. #define SYNCHRONIZE               (0x00100000L)
    69. #define DELETE                           (0x00010000L)
    70. #define READ_CONTROL                     (0x00020000L)
    71. #define WRITE_DAC                        (0x00040000L)
    72. #define WRITE_OWNER                      (0x00080000L)
    73. #define SYNCHRONIZE                      (0x00100000L)
    74. #define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
    75. #define STANDARD_RIGHTS_READ             (READ_CONTROL)
    76. #define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
    77. #define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
    78. #define STANDARD_RIGHTS_ALL              (0x001F0000L)
    79. #define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)
    80. #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
    81. #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
    82.                                    FILE_WRITE_DATA          |\
    83.                                    FILE_WRITE_ATTRIBUTES    |\
    84.                                    FILE_WRITE_EA            |\
    85.                                    FILE_APPEND_DATA         |\
    86.                                    SYNCHRONIZE)
    87. #define FILE_DELETE_ON_CLOSE            0x00001000
    88. #define FILE_CREATE                     0x00000002
    89. #define FILE_OVERWRITE_IF               0x00000005
    90. #define FILE_RANDOM_ACCESS              0x00000800
    91. #define FILE_NON_DIRECTORY_FILE         0x00000040
    92. #define FILE_SYNCHRONOUS_IO_ALERT       0x00000010
    93. #define FILE_SYNCHRONOUS_IO_NONALERT    0x00000020
    94. #define OBJ_CASE_INSENSITIVE            0x00000040L
    95. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    96.     (p)->Length = sizeof( OBJECT_ATTRIBUTES );          \
    97.     (p)->RootDirectory = r;                             \
    98.     (p)->Attributes = a;                                \
    99.     (p)->ObjectName = n;                                \
    100.     (p)->SecurityDescriptor = s;                        \
    101.     (p)->SecurityQualityOfService = NULL;               \
    102.     }
    103. UNICODE_STRING stroka;
    104. HANDLE fhandle;
    105. OBJECT_ATTRIBUTES filename;
    106. IO_STATUS_BLOCK status_io;
    107. int runpoint(void)
    108. {
    109. InitializeObjectAttributes(&filename, &stroka,OBJ_CASE_INSENSITIVE, NULL, NULL);
    110. RtlInitUnicodeString(&stroka,L"\\??\\\\C:\\overrage.bin");
    111. NtCreateFile(&fhandle,FILE_ALL_ACCESS,&filename,&status_io,0,FILE_ATTRIBUTE_NORMAL,0,FILE_OVERWRITE_IF,FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_DELETE_ON_CLOSE,0,0);
    112. NtClose(fhandle);
    113.  
    114. return 0;
    115. };
     
  13. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    553
     
  14. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    Не смотря на довольно древний приём, вызов Native-функций до сих пор обходит большинство аверов. Вот например одинаковый по функционалу код, только использует три разных способа: CreateFileA(), _lcreat(), и NtCreateFile(), который и стал чемпионом с всего 4 детектами, против 15.

    Код (ASM):
    1. format   pe64 gui 6.0
    2. include 'win64ax.inc'
    3. entry    start
    4. ;//-----------------
    5. section '.data' data readable writeable
    6. bWriten   dq  0
    7. fname     db 'C:\test64.txt',0
    8. fdata     db 'wasm.in - x64 NtCreateFile() + NtWriteFile() example'
    9. dlen      =   $-fdata
    10. ;//-----------------
    11. section '.code' code readable executable
    12. start:  sub     rsp,8
    13. frame
    14.         invoke  CreateFile,fname,GENERIC_READ + GENERIC_WRITE,\
    15.                            FILE_SHARE_READ + FILE_SHARE_WRITE,\
    16.                            0,CREATE_ALWAYS,0,0,
    17.         push    rax
    18.         invoke  WriteFile,rax,fdata,dlen,bWriten,0
    19.         pop     rax
    20.         invoke  CloseHandle,rax
    21. endf
    22.         invoke  ExitProcess,0
    23. ;//------------------------
    24. section '.idata' import data readable writeable
    25. library kernel32,'kernel32.dll'
    26. include 'api\kernel32.inc'
    Код (ASM):
    1. format   pe64 gui 6.0
    2. include 'win64ax.inc'
    3. entry    start
    4. ;//-----------------
    5. section '.data' data readable writeable
    6. fname   db 'C:\test64.txt',0
    7. fdata   db 'wasm.in - x64 NtCreateFile() + NtWriteFile() example'
    8. dlen    =   $-fdata
    9. ;//-----------------
    10. section '.code' code readable executable
    11. start:  sub     rsp,8
    12. frame
    13.         invoke  _lcreat,fname,0
    14.         push    rax
    15.         invoke  _lwrite,eax,fdata,dlen
    16.         pop     rax
    17.         invoke  _lclose,rax
    18. endf
    19.         invoke  ExitProcess,0
    20. ;//------------------------
    21. section '.idata' import data readable writeable
    22. library kernel32,'kernel32.dll'
    23. include 'api\kernel32.inc'
    Код (ASM):
    1. format   pe64 gui 6.0
    2. include 'win64w.inc'
    3. entry    start
    4. ;//-----------------
    5. section '.data' data readable writeable
    6. struct UNICODE_STRING
    7.     Length          dw 0
    8.     MaximumLength   dw 0
    9.     Padding         dd 0   ;<-----
    10.     Buffer          dq 0
    11. ends
    12. struct OBJECT_ATTRIBUTES
    13.     Length          dq sizeof.OBJECT_ATTRIBUTES
    14.     RootDirectory   dq 0
    15.     ObjectName      dq 0
    16.     Attributes      dd 0
    17.     Padding         dd 0   ;<-----
    18.     SecurityDesc    dq 0,0
    19. ends
    20. struct IO_STATUS_BLOCK
    21.     Status          dq 0
    22.     Information     dq 0
    23. ends
    24.  
    25. align  8
    26. hFile      dq 0
    27. ByteOffset dq 0
    28. obj_name   UNICODE_STRING
    29. attr       OBJECT_ATTRIBUTES
    30. status     IO_STATUS_BLOCK
    31.  
    32. FILE_READ_DATA     = 1
    33. FILE_WRITE_DATA    = 2
    34. FILE_OVERWRITE_IF  = 5
    35.  
    36. fname   du '\??\C:\test64.txt',0
    37. align 8
    38. fdata   db 'wasm.in - x64 NtCreateFile() + NtWriteFile() example'
    39. dlen    =   $-fdata
    40. ;//-----------------
    41. section '.code' code readable executable
    42. start:  sub     rsp,8
    43. frame
    44.         invoke  RtlInitUnicodeString, obj_name, fname
    45.         mov     [attr.ObjectName],obj_name
    46.         invoke  NtCreateFile,hFile,\
    47.                              FILE_READ_DATA + FILE_WRITE_DATA,\
    48.                              attr, status, 0,0,\
    49.                              FILE_SHARE_READ + FILE_SHARE_WRITE,\
    50.                              FILE_OVERWRITE_IF, 0,0,0
    51.         invoke  NtWriteFile,[hFile],0,0,0,\
    52.                              status,fdata,dlen,ByteOffset,0
    53.         invoke  NtClose,[hFile]
    54. endf
    55.         invoke  ExitProcess,0
    56. ;//-----------------
    57. section '.idata' import data readable writeable
    58. library kernel32,'kernel32.dll',\
    59.          user32, 'user32.dll',\
    60.          ntdll,  'ntdll.dll'
    61. include 'api\kernel32.inc'
    62. include 'api\user32.inc'
    63. import ntdll,\
    64.        RtlInitUnicodeString,'RtlInitUnicodeString',\
    65.        NtCreateFile,'NtCreateFile',\
    66.        NtWriteFile, 'NtWriteFile',\
    67.        NtClose,     'NtClose'
    68.  
     
    Mikl___ нравится это.
  15. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Marylin, а на C или на C++ что-то похожее изобразить можете ? Или это, в принципе, невозможно ?
     
  16. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    553
    На NtCreateFile сигнатур значительно меньше, потому что не у всех хватает мозгов юзать Nt* функи.

    Еще:
    Интересно сколько будет детектов если убрать: FILE_DELETE_ON_CLOSE
     
    Последнее редактирование: 26 май 2026
  17. Richie

    Richie New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2026
    Сообщения:
    4
    В большинстве качественных антивирусов/EDR используются отдельные юзермлд-библиотеки под x86 и x64, через которые реализуются IAT-хуки, в частности кстати перехватываются Nt-функции из ntdll.dll, поскольку многие WinAPI-вызовы в конечном счете сводятся к Native, условно:
    GetProcAddress -> LdrGetProcedureAddress.

    А чтобы мониторить файловую систему, тут уже спускаются на уровень драйвера в котором регистрируют каллбеки на операции открытия, чтения, записи и изменения файлов.

    Кстати, у меня еще с августа лежит огромная статья которую я писал месяц про реверс анти-эксплойт антивируса HitmanPRO.Alert, на WASM сейчас статьи нельзя выкладывать как я понял со статусом новичка?
    --- Сообщение объединено, 26 май 2026 ---
    Код (C++):
    1.  
    2. #include <windowsh>
    3. #include <winternl.h>
    4. #pragma comment(lib, "ntdll.lib")
    5.  
    6. using NtCreateFileFunc = NTSTATUS(NTAPI*)(
    7.     PHANDLE FileHandle,
    8.     ACCESS_MASK DesiredAccess,
    9.     POBJECT_ATTRIBUTES ObjectAttributes,
    10.     PIO_STATUS_BLOCK IoStatusBlock,
    11.     PLARGE_INTEGER AllocationSize,
    12.     ULONG FileAttributes,
    13.     ULONG ShareAccess,
    14.     ULONG CreateDisposition,
    15.     ULONG CreateOptions,
    16.     PVOID EaBuffer,
    17.     ULONG EaLength
    18. );
    19.  
    20. int main() {
    21.     HMODULE loadlibrary = LoadLibraryA("ntdll.dll");
    22.     if (!loadlibrary) {
    23.         return 1;
    24.     }
    25.  
    26.     using NTSTATUS_SUCCESS = NTSTATUS;
    27.     const NTSTATUS_SUCCESS STATUS_SUCCESS = 0x00000000;
    28.  
    29.     NtCreateFileFunc pMNtCreateFile = reinterpret_cast<NtCreateFileFunc>(GetProcAddress(loadlibrary, "NtCreateFile")); // рантайм загрузка если что
    30.  
    31.     if (pMNtCreateFile != nullptr) {
    32.         HANDLE fileHandle = NULL;
    33.         NTSTATUS status;
    34.         IO_STATUS_BLOCK ioStatusBlock = { 0 };
    35.         OBJECT_ATTRIBUTES objectAttributes;
    36.  
    37.         UNICODE_STRING ntPath;
    38.         RtlInitUnicodeString(&ntPath, L"\\??\\C:\\wasm.txt");
    39.  
    40.         InitializeObjectAttributes(&objectAttributes, &ntPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
    41.  
    42.         status = pMNtCreateFile(
    43.             &fileHandle,
    44.             GENERIC_WRITE | SYNCHRONIZE,
    45.             &objectAttributes,
    46.             &ioStatusBlock,
    47.             NULL,
    48.             FILE_ATTRIBUTE_NORMAL,
    49.             FILE_SHARE_READ,
    50.             FILE_SUPERSEDE,
    51.             FILE_SYNCHRONOUS_IO_NONALERT,
    52.             NULL,
    53.             0
    54.         );
    55.  
    56.         if (status == STATUS_SUCCESS) {
    57.             CloseHandle(fileHandle);
    58.         }
    59.     }
    60.  
    61.     FreeLibrary(loadlibrary);
    62.     return 0;
    63. }
    64.  
    65.  
    Вот ссылка на документацию функции NtCreateFile - https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
     
    Последнее редактирование: 26 май 2026
    GRAFik нравится это.
  18. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    553
    Интересно как у них устроен поиск по сигнатурам. Какие данные накапливаются для детекта.
    Как происходит отделение зерен от плевел (вредоносное/не вредоносное).

     
    Последнее редактирование: 26 май 2026
  19. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    353
    В ресурсах здесь есть неплохая дока Г.Неббетта по NativeAPI - структуры, константы и прочее.
     
    Mikl___ нравится это.
  20. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    474
    Подправил слегка код который чуть выше. Код выше на C++, я подправил для СИ. Компилировал в VS 2022 Pro. Может кому-нибудь тоже будет интересно и пригодится.
    Код (C):
    1. #include <windows.h>
    2. #include <winternl.h>
    3.  
    4. #pragma comment(lib, "ntdll.lib")
    5.  
    6. typedef NTSTATUS(NTAPI* NtCreateFileFunc)(
    7.     PHANDLE FileHandle,
    8.     ACCESS_MASK DesiredAccess,
    9.     POBJECT_ATTRIBUTES ObjectAttributes,
    10.     PIO_STATUS_BLOCK IoStatusBlock,
    11.     PLARGE_INTEGER AllocationSize,
    12.     ULONG FileAttributes,
    13.     ULONG ShareAccess,
    14.     ULONG CreateDisposition,
    15.     ULONG CreateOptions,
    16.     PVOID EaBuffer,
    17.     ULONG EaLength
    18. );
    19.  
    20. int main(void)
    21. {
    22.     HMODULE loadlibrary = LoadLibraryA("ntdll.dll");
    23.  
    24.     if (!loadlibrary)
    25.     {
    26.         return 1;
    27.     }
    28.  
    29.     NtCreateFileFunc pMNtCreateFile =
    30.         (NtCreateFileFunc)GetProcAddress(loadlibrary, "NtCreateFile");
    31.  
    32.     if (pMNtCreateFile != NULL)
    33.     {
    34.         HANDLE fileHandle = NULL;
    35.  
    36.         NTSTATUS status;
    37.  
    38.         IO_STATUS_BLOCK ioStatusBlock = { 0 };
    39.  
    40.         OBJECT_ATTRIBUTES objectAttributes;
    41.  
    42.         UNICODE_STRING ntPath;
    43.  
    44.         RtlInitUnicodeString(&ntPath, L"\\??\\C:\\wasm.txt");
    45.  
    46.         InitializeObjectAttributes(
    47.             &objectAttributes,
    48.             &ntPath,
    49.             OBJ_CASE_INSENSITIVE,
    50.             NULL,
    51.             NULL
    52.         );
    53.  
    54.         status = pMNtCreateFile(
    55.             &fileHandle,
    56.             GENERIC_WRITE | SYNCHRONIZE,
    57.             &objectAttributes,
    58.             &ioStatusBlock,
    59.             NULL,
    60.             FILE_ATTRIBUTE_NORMAL,
    61.             FILE_SHARE_READ,
    62.             FILE_SUPERSEDE,
    63.             FILE_SYNCHRONOUS_IO_NONALERT,
    64.             NULL,
    65.             0
    66.         );
    67.  
    68.         if (NT_SUCCESS(status))
    69.         {
    70.             CloseHandle(fileHandle);
    71.         }
    72.     }
    73.  
    74.     FreeLibrary(loadlibrary);
    75.  
    76.     return 0;
    77. }