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

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

  1. Entropy

    Entropy Member

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

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.253
    Entropy, опубликуйте код на С и я переведу на MASM64. Или требуется код для х32?
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    275
    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 в 17:53 ---
    Mikl___, я пытался это сделать на x64 ассемблере
     
  4. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    333
    Скорей всего проблема в описании структур.
    К примеру если посмотреть на 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.  
     
  5. Entropy

    Entropy Member

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