я попытался вызвать NtCreateFile ассемблере,кроме ошибки ничего вышло, ошибка как здесь https://board.flatassembler.net/topic.php?t=15444 ,переписал на язык Си все получилось
Mikl___, Код (C): #include <windows.h> typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef UNICODE_STRING *PUNICODE_STRING; typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; PVOID SecurityQualityOfService; } OBJECT_ATTRIBUTES; typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; typedef struct _IO_STATUS_BLOCK { #pragma warning(push) #pragma warning(disable: 4201) union { NTSTATUS Status; PVOID Pointer; } DUMMYUNIONNAME; #pragma warning(pop) ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING DestinationString,PCWSTR SourceString); __kernel_entry NTSTATUS NTAPI NtCreateFile ( PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess, ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength ); __kernel_entry NTSTATUS NTAPI NtWriteFile ( HANDLE FileHandle, HANDLE Event, PVOID ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key ); __kernel_entry NTSTATUS NTAPI NtClose ( HANDLE FileHandle ); #define FILE_WRITE_DATA ( 0x0002 ) #define FILE_WRITE_ATTRIBUTES ( 0x0100 ) #define FILE_WRITE_EA ( 0x0010 ) #define FILE_APPEND_DATA ( 0x0004 ) #define SYNCHRONIZE (0x00100000L) #define DELETE (0x00010000L) #define READ_CONTROL (0x00020000L) #define WRITE_DAC (0x00040000L) #define WRITE_OWNER (0x00080000L) #define SYNCHRONIZE (0x00100000L) #define STANDARD_RIGHTS_REQUIRED (0x000F0000L) #define STANDARD_RIGHTS_READ (READ_CONTROL) #define STANDARD_RIGHTS_WRITE (READ_CONTROL) #define STANDARD_RIGHTS_EXECUTE (READ_CONTROL) #define STANDARD_RIGHTS_ALL (0x001F0000L) #define SPECIFIC_RIGHTS_ALL (0x0000FFFFL) #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) #define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ FILE_WRITE_DATA |\ FILE_WRITE_ATTRIBUTES |\ FILE_WRITE_EA |\ FILE_APPEND_DATA |\ SYNCHRONIZE) #define FILE_DELETE_ON_CLOSE 0x00001000 #define FILE_CREATE 0x00000002 #define FILE_OVERWRITE_IF 0x00000005 #define FILE_RANDOM_ACCESS 0x00000800 #define FILE_NON_DIRECTORY_FILE 0x00000040 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 #define OBJ_CASE_INSENSITIVE 0x00000040L #define InitializeObjectAttributes( p, n, a, r, s ) { \ (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \ (p)->RootDirectory = r; \ (p)->Attributes = a; \ (p)->ObjectName = n; \ (p)->SecurityDescriptor = s; \ (p)->SecurityQualityOfService = NULL; \ } UNICODE_STRING stroka; HANDLE fhandle; OBJECT_ATTRIBUTES filename; IO_STATUS_BLOCK status_io; int runpoint(void) { InitializeObjectAttributes(&filename, &stroka,OBJ_CASE_INSENSITIVE, NULL, NULL); RtlInitUnicodeString(&stroka,L"\\??\\\\C:\\overrage.bin"); 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); NtClose(fhandle); return 0; }; --- Сообщение объединено, 24 май 2026 в 17:53 --- Mikl___, я пытался это сделать на x64 ассемблере
Скорей всего проблема в описании структур. К примеру если посмотреть на UNICODE_STRING, то поле Buffer начинается со-смещения 8, хотя на х32 оффсет был 4. Код (Text): 0: kd> dt _unicode_string -v nt!_UNICODE_STRING struct _UNICODE_STRING, 3 elements, 0x10 bytes +0x000 Length : Uint2B +0x002 MaximumLength : Uint2B +0x008 Buffer : Ptr64 to Uint2B 0: kd> То есть между MaxLen и Buffer нужно добавить ещё 1 дворд для выравнивания: Код (ASM): struct UNICODE_STRING Length dw 0 ; 00 MaxLength dw 0 ; 02 Padding dd 0 ; 04 <-------- Buffer dq 0 ; 08 ends