看流星社区

 找回密码
 注册账号
查看: 1860|回复: 0

另类远程线程模式

[复制链接]

该用户从未签到

发表于 2013-3-21 08:51:37 | 显示全部楼层 |阅读模式
一提到远程线程,一般都想到DLL注入啊,shellcode运行啊~
其实这两种根本不给力啊~
现在让我们来说一种新模型哦~
不借助shellcode,不借助不给力的DLL注入,我们直接在远程运行EXE里的代码~
当然API还是那个API,这里涉及到PE文件的一些知识,就不多说了,直接上代码~
  1. LPVOID CopyModule(HANDLE proc, LPVOID image)
  2. {
  3.   PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)image + ((PIMAGE_DOS_HEADER)image)->e_lfanew);
  4.   PIMAGE_DATA_DIRECTORY datadir;
  5.   DWORD size = headers->OptionalHeader.SizeOfImage;
  6.   LPVOID mem = NULL;
  7.   LPBYTE buf = NULL;
  8.   BOOL ok = FALSE;

  9.   if (headers->Signature != IMAGE_NT_SIGNATURE)
  10.     return NULL;

  11.   if (IsBadReadPtr(image, size))
  12.     return NULL;

  13.   mem = VirtualAllocEx(proc, NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

  14.   if (mem != NULL) {
  15.     buf = (LPBYTE)VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

  16.     if (buf != NULL) {
  17.       RtlCopyMemory(buf, image, size);

  18.       datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];

  19.       if (datadir->Size > 0 && datadir->VirtualAddress > 0) {
  20.         DWORD_PTR delta = (DWORD_PTR)((LPBYTE)mem - headers->OptionalHeader.ImageBase);
  21.         DWORD_PTR olddelta = (DWORD_PTR)((LPBYTE)image - headers->OptionalHeader.ImageBase);
  22.         PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(buf + datadir->VirtualAddress);

  23.         while(reloc->VirtualAddress != 0) {
  24.           if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) {
  25.             DWORD count = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
  26.             LPWORD list = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION));
  27.             DWORD i;

  28.             for (i = 0; i < count; i++) {
  29.               if (list[i] > 0) {
  30.                 DWORD_PTR *p = (DWORD_PTR *)(buf + (reloc->VirtualAddress + (0x0FFF & (list[i]))));

  31.                 *p -= olddelta;
  32.                 *p += delta;
  33.               }
  34.             }
  35.           }

  36.           reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock);
  37.         }

  38.         ok = WriteProcessMemory(proc, mem, buf, size, NULL);
  39.       }

  40.       VirtualFree(buf, 0, MEM_RELEASE); // release buf
  41.     }

  42.     if (!ok) {
  43.       VirtualFreeEx(proc, mem, 0, MEM_RELEASE);
  44.       mem = NULL;
  45.     }
  46.   }

  47.   return mem;
  48. }

  49. BOOL NewInject(DWORD pid, LPTHREAD_START_ROUTINE start)
  50. {
  51.   HANDLE proc, thread;
  52.   HMODULE module, newmodule;
  53.   BOOL ok = FALSE;

  54.   proc = OpenProcess(PROCESS_QUERY_INFORMATION |
  55.     PROCESS_VM_OPERATION |
  56.     PROCESS_VM_WRITE |
  57.     PROCESS_VM_READ |
  58.     PROCESS_CREATE_THREAD |
  59.     PROCESS_DUP_HANDLE,
  60.     FALSE, pid);

  61.   if (proc != NULL) {
  62.     module = GetModuleHandle(NULL);

  63.     newmodule = (HMODULE)CopyModule(proc, module);

  64.     if (newmodule != NULL) {
  65.       LPTHREAD_START_ROUTINE entry = (LPTHREAD_START_ROUTINE)((LPBYTE)newmodule + (DWORD_PTR)((LPBYTE)start - (LPBYTE)module));

  66.       thread = CreateRemoteThread(proc, NULL, 0, entry, NULL, 0, NULL);

  67.       if (thread != NULL) {
  68.         CloseHandle(thread);
  69.         ok = TRUE;
  70.       }
  71.       else {
  72.         VirtualFreeEx(proc, module, 0, MEM_RELEASE);
  73.       }
  74.     }

  75.     CloseHandle(proc);
  76.   }

  77.   return ok;
  78. }
复制代码
  1. //提权DEBUG后
  2. NewInject(GetProcessIdByName(L"Diablo III.exe"), ThreadProc);
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-5 17:34

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表