Guest User

Untitled

a guest
Dec 10th, 2022
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.66 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <stdio.h>
  3.  
  4. #define     OBJ_CASE_INSENSITIVE   0x00000040
  5.  
  6. #define DB(_val_) __asm __emit (_val_)
  7.  
  8. #define INVALID_SYSCALL (DWORD)(-1)
  9. #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
  10. // code selectors
  11. #define CS_32   0x23
  12. #define CS_64   0x33
  13.  
  14. #define RAX     0
  15. #define RCX     1
  16. #define RDX     2
  17. #define RBX     3
  18. #define RSP     4
  19. #define RBP     5
  20. #define RSI     6
  21. #define RDI     7
  22. #define R8      8
  23. #define R9      9
  24. #define R10     10
  25. #define R11     11
  26. #define R12     12
  27. #define R13     13
  28. #define R14     14
  29. #define R15     15
  30.  
  31. #define X64_PUSH(_r_) DB(0x48 | ((_r_) >> 3)) DB(0x50 | ((_r_) & 7))
  32. #define X64_POP(_r_)  DB(0x48 | ((_r_) >> 3)) DB(0x58 | ((_r_) & 7))
  33.  
  34. // Switch processor to long mode
  35. #define X64_ENTER_CS(_cs_)                                                                  \
  36.     {                                                                                       \
  37.         DB(0x6a) DB(_cs_)                               /*  push   @cs                  */  \
  38.         DB(0xe8) DB(0x00) DB(0x00) DB(0x00) DB(0x00)    /*  call   $+5                  */  \
  39.         DB(0x83) DB(0x04) DB(0x24) DB(0x05)             /*  add    dword [esp], 5       */  \
  40.         DB(0xcb)                                        /*  retf                        */  \
  41.     }
  42.  
  43. // Switch processor to WOW64 mode
  44. #define X64_EXIT_CS(_cs_)                                                                   \
  45.     {                                                                                       \
  46.         DB(0xe8) DB(0x00) DB(0x00) DB(0x00) DB(0x00)    /*  call   $+5                  */  \
  47.         DB(0xc7) DB(0x44) DB(0x24) DB(0x04) DB(_cs_)    /*  mov    dword [rsp + 4], @cs */  \
  48.         DB(0x00) DB(0x00) DB(0x00)                                                          \
  49.         DB(0x83) DB(0x04) DB(0x24) DB(0x0d)             /*  add    dword [rsp], 0xD     */  \
  50.         DB(0xcb)                                        /*  retf                        */  \
  51.     }
  52.  
  53. #define X64_SYSCALL()       \
  54.     {                       \
  55.         DB(0x0f) DB(0x05)   \
  56.     }
  57.  
  58. // 64-bit assembly helpers
  59. #define X64_ENTER() X64_ENTER_CS(CS_64)
  60. #define X64_EXIT() X64_EXIT_CS(CS_32)
  61.  
  62. #define GET_NEXT_ARG() i < ArgsCount ? Args[i++] : 0
  63.  
  64. #define STATUS_UNSUCCESSFUL           ((NTSTATUS)0xC0000001L)
  65.  
  66. DWORD x64_Syscall(DWORD dwSyscallNumber, PDWORD64 Args, DWORD ArgsCount)
  67. {
  68.     DWORD Status = 0, OldStack = 0, i = 0;
  69.  
  70.     if (dwSyscallNumber == INVALID_SYSCALL)
  71.     {
  72.         return STATUS_UNSUCCESSFUL;
  73.     }
  74.  
  75.     DWORD64 _rcx = GET_NEXT_ARG();
  76.     DWORD64 _rdx = GET_NEXT_ARG();
  77.     DWORD64 _r8 = GET_NEXT_ARG();
  78.     DWORD64 _r9 = GET_NEXT_ARG();
  79.  
  80.     DWORD64 StackArgs = NULL;
  81.     DWORD64 StackArgsCount = 0;
  82.  
  83.     if (ArgsCount > 4)
  84.     {
  85.         StackArgs = (DWORD64)&Args[3];
  86.         StackArgsCount = ArgsCount - 4;
  87.     }
  88.  
  89.     __asm
  90.     {
  91.         push    ebx
  92.         push    esi
  93.         push    edi
  94.  
  95.         /**
  96.          * Stack align for 64-bit mode.
  97.          */
  98.          mov     OldStack, esp
  99.          and esp, 0xfffffff0
  100.  
  101.          /**
  102.           * Swith to the long mode.
  103.           */
  104.           X64_ENTER()
  105.  
  106.           /**
  107.            * Copy register arguments.
  108.            */
  109.            push    _rcx
  110.            X64_POP(RCX)
  111.  
  112.            push    _rdx
  113.            X64_POP(RDX)
  114.  
  115.            push    _r8
  116.            X64_POP(R8)
  117.  
  118.            push    _r9
  119.            X64_POP(R9)
  120.  
  121.            /**
  122.             * Push stack arguments.
  123.             */
  124.             push    StackArgs
  125.             X64_POP(RDI)
  126.  
  127.             push    StackArgsCount
  128.             X64_POP(RSI)
  129.  
  130.             test    esi, esi
  131.             jz      _call
  132.  
  133.             _loop_push :
  134.  
  135.         push[edi + esi * 8]
  136.             sub     esi, 1
  137.             jnz     _loop_push
  138.  
  139.             _call :
  140.         /**
  141.          * Perform a system call.
  142.          */
  143.         push    _rcx
  144.             X64_POP(R10)
  145.  
  146.             mov     eax, dwSyscallNumber
  147.             sub     esp, 0x28
  148.  
  149.             X64_SYSCALL()
  150.  
  151.             add     esp, 0x28
  152.  
  153.             /**
  154.              * Save returned status code.
  155.              */
  156.             mov     Status, eax
  157.  
  158.             /**
  159.              * Remove syscall arguments from the stack.
  160.              */
  161.             push    StackArgsCount
  162.             X64_POP(RSI)
  163.  
  164.             test    esi, esi
  165.             jz      _end
  166.  
  167.             _loop_pop :
  168.  
  169.         pop     edi
  170.             sub     esi, 1
  171.             jnz     _loop_pop
  172.  
  173.             _end :
  174.  
  175.         /**
  176.          * Swith back to the 32-bit mode.
  177.          */
  178.         X64_EXIT()
  179.  
  180.             mov     esp, OldStack
  181.  
  182.             pop     edi
  183.             pop     esi
  184.             pop     ebx
  185.     }
  186.  
  187.     return Status;
  188. }
  189.  
  190. #define TEB64_ProcessEnvironmentBlock 0x60
  191.  
  192. typedef DWORD64 PTR64;
  193.  
  194. #include <pshpack8.h>
  195.  
  196. typedef struct _LIST_ENTRY_64
  197. {
  198.     PTR64 Flink;
  199.     PTR64 Blink;
  200.  
  201. } LIST_ENTRY_64;
  202.  
  203.  
  204.  
  205. typedef struct _STRING_64
  206. {
  207.     USHORT Length;
  208.     USHORT MaximumLength;
  209.     PTR64 Buffer;
  210.  
  211. } ANSI_STRING_64,
  212. * PANSI_STRING_64;
  213.  
  214. typedef struct _UNICODE_STRING_64
  215. {
  216.     USHORT Length;
  217.     USHORT MaximumLength;
  218.     PTR64 Buffer;
  219.  
  220. } UNICODE_STRING64,
  221. * PUNICODE_STRING64;
  222.  
  223. #include <poppack.h>
  224. #include <pshpack8.h>
  225.  
  226. typedef struct _OBJECT_ATTRIBUTES_64
  227. {
  228.     ULONG Length;
  229.     PTR64 RootDirectory;
  230.     PTR64 ObjectName;
  231.     ULONG Attributes;
  232.     PTR64 SecurityDescriptor;
  233.     PTR64 SecurityQualityOfService;
  234.  
  235. } OBJECT_ATTRIBUTES_64,
  236. * POBJECT_ATTRIBUTES_64;
  237.  
  238. typedef struct _IO_STATUS_BLOCK_64
  239. {
  240.     union
  241.     {
  242.         NTSTATUS Status;
  243.         PTR64 Pointer;
  244.     };
  245.  
  246.     PTR64 Information;
  247.  
  248. } IO_STATUS_BLOCK_64,
  249. * PIO_STATUS_BLOCK_64;
  250.  
  251. #include <poppack.h>
  252.  
  253. __declspec(align(16))
  254. typedef struct _NT_OPEN_FILE_PARAMS
  255. {
  256.     PTR64 FileHandle;
  257.     IO_STATUS_BLOCK_64 IoStatusBlock;
  258.     UNICODE_STRING64 usName;
  259.     OBJECT_ATTRIBUTES_64 ObjectAttributes;
  260.     WCHAR Name[MAX_PATH];
  261.  
  262. } NT_OPEN_FILE_PARAMS,
  263. * PNT_OPEN_FILE_PARAMS;
  264.  
  265. int main(int argc, CHAR* argv[])
  266. {
  267.  
  268.  
  269.     PNT_OPEN_FILE_PARAMS Params = (PNT_OPEN_FILE_PARAMS)VirtualAlloc(
  270.         NULL, sizeof(NT_OPEN_FILE_PARAMS),
  271.         MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE
  272.     );
  273.     if (Params == NULL)
  274.     {
  275.         return -1;
  276.     }
  277.  
  278.     ACCESS_MASK DesiredAccess = FILE_GENERIC_READ;
  279.     ULONG ShareAccess = FILE_SHARE_READ;
  280.     ULONG OpenOptions = 0;
  281.     wcscpy_s(Params->Name, L"\\??\\C:\\Windows\\system32\\ntdll.dll");
  282.     Params->usName.Buffer = (PTR64)&Params->Name;
  283.     Params->usName.Length = Params->usName.MaximumLength = (USHORT)wcslen(Params->Name) * 2;
  284.  
  285.     Params->ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES_64);
  286.     Params->ObjectAttributes.RootDirectory = NULL;
  287.     Params->ObjectAttributes.ObjectName = (PTR64)&Params->usName;
  288.     Params->ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
  289.     Params->ObjectAttributes.SecurityDescriptor = Params->ObjectAttributes.SecurityQualityOfService = NULL;
  290.     DWORD64 Args[] =
  291.     {
  292.         (DWORD64)&Params->FileHandle,
  293.         (DWORD64)DesiredAccess,
  294.         (DWORD64)&Params->ObjectAttributes,
  295.         (DWORD64)&Params->IoStatusBlock,
  296.         (DWORD64)ShareAccess,
  297.         (DWORD64)OpenOptions
  298.     };
  299.  
  300.  
  301.     while (true) {
  302.        
  303.         DWORD Status = x64_Syscall(0x33, Args, 6);
  304.         printf("NtOpenFile: Status = 0x%.8x, FileHandle = 0x%.8x\n", Status, (HANDLE)Params->FileHandle);
  305.        
  306.         DWORD64 Args2[1];
  307.         Args2[0] = Params->FileHandle;
  308.         Status = x64_Syscall(0xF, Args2, 1);
  309.         printf("NtClose: Status = 0x%.8x\n", Status);
  310.         Sleep(100);
  311.     }
  312.  
  313.     VirtualFree(Params, 0, MEM_RELEASE);
  314.  
  315.     return 0;
  316. }
  317.  
Advertisement
Add Comment
Please, Sign In to add comment