用进程注入来实现一个壳(原理)

进程注入bypass Control Flow Guard(CFG)是一种微软引入的防护技术,最早在 Windows 8.1 中加入,并在 Windows 10 及后续版本中得到了加强。它的核心目标是防止程序中的恶意代码劫持控制流,从而实现对系统的恶意操作。在正常程序运行中,程序的控制流(即代码的执行顺序)会根据不同的条件跳转到不同的位置。攻击者通过注入恶意代码或者篡改程序控制流,能够导致程序执行恶意操作,如获取管理员权限、窃取数据等。 阅读详情
作者: Simonzh2000[US]

感谢 too2y , 老王.
这是我在学习老王的壳后, 参考网上的一些例子做的。
比老王的壳差的太远, 希望各位不要见笑.
如果各位写出了类似的加壳器, 希望发一个给我。

启动前先启动 Calc.exe, 改一下, 用 Explorer.exe 也可以。

#define UNICODE
#define _UNICODE
                          
#include <windows.h>
#include <tchar.h>
#include <conio.h>
#include <psapi.h>

typedef struct _remoteparameter
{
  DWORD       rpwinexec;
  DWORD       rpcreatemutex;
  DWORD       rpsleep;
  DWORD       rpclosehandle;

  char        rpwinexecname[MAX_PATH];
    HANDLE      rphMutex;
    TCHAR       rpMutex[30];
  
}REMOTEPARAMETER, *PREMOTEPARAMETER;

DWORD   WINAPI remote(LPVOID);
DWORD   processtopid(TCHAR*);  
HANDLE  createremote(PTSTR);     


TCHAR             cMutex[8];


int main()
{
   TCHAR             ExeName[MAX_PATH];
  HANDLE            hRemoteThread;
  HANDLE            hMutex;
  int               ret; 

    _tcscpy(cMutex,_T("simonzh"));
  hMutex = OpenMutex(SYNCHRONIZE, TRUE, cMutex );
  if (hMutex == NULL)
  {
    ret=GetModuleFileName(NULL,ExeName,MAX_PATH);
    if(ret==0)
    {
      OutputDebugString(_T("GetModuleFileName Error/n"));
      getche();              
      return -1;
    }

 
    if((hRemoteThread=createremote(ExeName))==NULL)   
    {
      OutputDebugString(_T("CreateRemote Error/n"));
      getche();              
        return -1;
    }
        
    return 0;
  }

  CloseHandle(hMutex);
   
  // 上面相当于一个壳的 Loader 
           // 下面相当于被加壳的原程序.
  _tprintf(_T("---[ This is not me.   HaHaHa... ]---/n"));   
  getche();
  return 0;
}
    

DWORD processtopid(TCHAR *processname)
{
  DWORD    lpidprocesses[1024],cbneeded,cprocesses;
  HANDLE   hprocess;
  HMODULE  hmodule;
  UINT     i;
  TCHAR    normalname[MAX_PATH]=_T("UnknownProcess");
    
  if(!EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded))
  {
    OutputDebugString(_T("EnumProcesses Error/n"));
    return -1;  
  }

  cprocesses=cbneeded/sizeof(DWORD);
  
  for(i=0;i<cprocesses;i++)
  {
    hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
    if(hprocess)
    {
      if(EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded))
      {
        GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
        if(!_tcsicmp(normalname,processname))  
        {
          CloseHandle(hprocess);
          return (lpidprocesses[i]);
        }
      }
    }

  }

  CloseHandle(hprocess);
  return 0;
}


HANDLE createremote(PTSTR ExeName)
{
    HANDLE            ethread;
  HANDLE            rphandle;
  TCHAR             name[15];
  TCHAR             *remotethr;
  TCHAR             *remotepar;
  DWORD             remotepid;
  int               cb;
  HINSTANCE         hkernel32;
  REMOTEPARAMETER   rp;

  _tcscpy(name,_T("Calc.exe"));

  
  while(1)
  {
    remotepid=processtopid(name); 
    
    if(remotepid==-1)
    {
      return NULL;
    }
    else if(remotepid==0)
    {
      OutputDebugString(_T("Remote Process isn't running/n")); 
      Sleep(1000);
      continue;
    }


      rphandle=OpenProcess(PROCESS_CREATE_THREAD |     
                           PROCESS_VM_OPERATION  |     
                    PROCESS_VM_WRITE,           
                 FALSE,remotepid);
      if(rphandle==NULL)
    {
        Sleep(1000);
      continue;
    }
    else
    {
      break; 
    }
  }

  cb=sizeof(TCHAR)*4*1024;
  remotethr=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE); 
  if(remotethr==NULL)
  {
    OutputDebugString(_T("VirtualAllocEx for Thread Error/n"));
        CloseHandle(rphandle);       
    return NULL;
  }

    if(WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL)==FALSE)
  {
    OutputDebugString(_T("WriteProcessMemory for Thread Error/n"));
        CloseHandle(rphandle);
    return NULL;
  }

  {   
    memset(&rp,0,sizeof(rp));
        _tcscpy(rp.rpMutex, cMutex);
    WideCharToMultiByte(CP_ACP,0,ExeName,-1,rp.rpwinexecname,_tcslen(ExeName),NULL,NULL);
    
    hkernel32=GetModuleHandle(_T("kernel32.dll"));
    rp.rpwinexec=(DWORD)GetProcAddress(hkernel32,"WinExec");
    rp.rpcreatemutex=(DWORD)GetProcAddress(hkernel32,"CreateMutexW");
    rp.rpsleep=(DWORD)GetProcAddress(hkernel32,"Sleep");
    rp.rpclosehandle=(DWORD)GetProcAddress(hkernel32,"CloseHandle");
  }   
  
  cb=sizeof(TCHAR)*sizeof(rp);
  remotepar=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
  if(remotepar==NULL)
  {
    OutputDebugString(_T("VirtualAllocEx for Parameter Error/n"));
    CloseHandle(rphandle);
    return NULL;
  }

  if(WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL)==FALSE)
  {
    OutputDebugString(_T("WriteProcessMemory for Parameter Error:"));
    CloseHandle(rphandle);
    return NULL;
  }
    
  
  ethread=CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
  if(ethread==NULL)
  {
    OutputDebugString(_T("CreateRemoteThread Error/n"));
    CloseHandle(rphandle);
    return NULL;
  }

  return ethread;
}


DWORD WINAPI remote(LPVOID pvparam)
{
  PREMOTEPARAMETER erp=(PREMOTEPARAMETER)pvparam;

    typedef UINT   (WINAPI *EWinExec)(LPCSTR, UINT);
  typedef HANDLE (WINAPI *ECreateMutex)(LPSECURITY_ATTRIBUTES , BOOL, LPCTSTR);
   typedef VOID   (WINAPI *ESleep)(DWORD);
    typedef BOOL   (WINAPI *ECloseHandle)(HANDLE);
  
  EWinExec             tWinExec;
    ECreateMutex         tCreateMutex;
    ESleep               tSleep;
  ECloseHandle         tCloseHandle;

  tWinExec=(EWinExec)erp->rpwinexec;
  tCreateMutex=(ECreateMutex)erp->rpcreatemutex;
  tSleep=(ESleep)erp->rpsleep;
  tCloseHandle=(ECloseHandle)erp->rpclosehandle;

  erp->rphMutex=tCreateMutex(NULL, TRUE, erp->rpMutex);

  if(tWinExec(erp->rpwinexecname, SW_SHOW)<=31)             
  {
    return -1;
  }
    
  tSleep(4000);
  tCloseHandle(erp->rphMutex);
  return 0;
} 
把dll模块注入到游戏进程的方法<a> DLL注入技术: 是将一个Dll文件强行加载到目标进程中,比如把外挂dll模块注入到游戏进程,这样做的目的在于方便我们通过这个DLL读写目标进程指令或内存数据,(例如 HOOK游戏函数过程或篡改游戏内存数据实现外挂功能),或以被注入进程的身份去执行一些操作等。全系统注入的优点:利用系统机制实现的全系统进程注入,可绕过比如游戏进程自身的防注入保护机制。比如远线程注入游戏可能会被拦截,但输入法注入,游戏很难拦截。 阅读详情

相关推荐

游戏进程注入和DX后台原理剖析

这2个要一起讲,因为真正的dx后台(dx转gdi除外),是需要注入游戏进程的注入游戏进程有多种方式,输入法注入,网络注入,注册表注入都先不说了,先说一下常用的首先,Hook,所使用的API setwindowshookex,百度或者MSDN,最好查MSDN,比较详细随便用个消息注入进程,你就可以在游戏当中做任何事情了,其中有个参数作为回调函数传入,也就是当收到消息的时候首先做我们回调函数中的事情,...

weixin_33704591的博客 2763

程序隐藏、加壳、内存加载执行的一种实验方案

该方案比较简单,只适用于测试和简单情景下的应用,测试中能够运行大多数体积和功能比较简单的32位程序,兼容性和稳定性有待测试和提高。

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 808

DLL注入实战:3招轻松攻破进程

本文提供了Windows环境下DLL注入的实战指南,包含三种可直接上手的实现方案。通过远程线程注入(最通用)、进程创建时注入和注册表注入三种方式,详细介绍了操作步骤和完整代码实现。重点阐述了DLL加载原理、权限要求等前置知识,并给出位数一致性、权限问题等关键注意事项。文章还推荐了ProcessExplorer等辅助工具,帮助验证注入效果。特别强调实际应用中需遵守法律法规,建议从远程线程注入方案开始练习。所有方案都经过实践验证,确保新手也能快速掌握这项技术。

m0_60781580的博客 1064

渗透技巧 | 有手就行的白加黑实战免杀

最近一直在打攻防,很多时候都需要用到免杀,那么怎么能快速做免杀和权限维持就是一个问题,于是就想起来利用白加黑快速做免杀或权限维持,俗称有手就行,废话不多说直接开干!

2201_75362610的博客 3698

把dll模块注入到游戏进程的方法_远线程注入

远线程注入是指为要注入的目标进程创建一个远程线程,在远程线程里面加载要注入的目标dll。Windows操作系统提供了跨进程的内存读写机制,这就为各种注入打下了基础。

douluo998的博客 996

Windows Ring3层注入——CreateProcess劫持进程创建注入(三)

Windows Ring3层注入——CreateProcess劫持进程创建注入(三)CreateProcess劫持进程创建注入原理劫持进程创建注入好处CreateProcess劫持进程创建注入函数原型**CreateProcess**函数原型CreateProcess劫持进程创建注入步骤CreateProcess劫持进程代码示例 CreateProcess劫持进程创建注入原理 劫持进程创建注入:利...

qq_38493448的博客 1894

进程注入系列Part 1 常见的进程注入手段

进程注入是一种众所周知的技术,恶意程序利用它在进程的内存中插入并执行代码。进程注入是一种恶意程序广泛使用的防御规避技术。大多数情况下,恶意程序使用进程注入来动态运行代码,这意味着实际的恶意代码不需要直接写入磁盘上的文件中,以避免被防病毒软件的静态检测所发现。简单来说,进程注入就是将一段数据从一个进程传输到另一个进程的方法,这种注入过程可以发生在执行操作的同一进程(自注入)上,也可发生在外部进程上。

蛇矛实验室 2337

C++实现DLL进程注入技术详解

在DLL项目中,导出符号允许其他程序使用DLL中定义的功能,而导入符号则允许DLL使用其他模块的功能。在Visual Studio中,有多种方法可以实现符号的导出和导入。一种常见的方法是使用和关键字。当代码被编译为DLL时,使用标记函数、变量或类等符号,以便它们可以被其他模块导入。当代码需要使用这些符号时,则使用来声明。另一种方法是使用模块定义文件(.def)。该文件列出所有需要导出的符号。在项目属性中,可以指定.def文件以简化导出过程。

weixin_26850469的博客 1452

深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用

标 题: 深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用 时 间: 2014-09-08,00:03:51 前言 为了避免被读者骂“标题党”,笔者在文章开头先澄清一下这个高大尚的“进程地址空间入侵”的可替代词语—注入。 看完第一句还能看到这里的读者一般有两种:1.初学者,实在是不懂所以需要学习的同学 2.大牛,只是想看看笔者打算怎么来炒“注入”这

Less Is More 1万+

STM32CubeMX实战:TIM定时器中断配置避坑指南(附100ms精准定时代码)

本文深入解析STM32CubeMX配置TIM定时器中断的常见误区与避坑技巧,重点阐述时钟源、预分频器与自动重装载值的精准计算方法。通过实战案例,提供一份可直接复用的100ms精准定时中断代码模板,并分享调试验证方法,帮助开发者构建稳定可靠的嵌入式系统心跳。

grafana8visual的博客 500

UR5 机械臂手眼标定(Eye-in-Hand)实战:OpenCV 求解 AX=XB,误差 < 2mm

本文详细介绍了UR5机械臂在Eye-in-Hand配置下的手眼标定实战,通过OpenCV实现高精度标定,最终达到误差小于2mm的工业级精度要求。文章涵盖了标定基础原理、环境搭建、数据采集策略、核心算法实现及误差分析与优化,为视觉机械臂的自主抓取提供了实用指南。

weixin_31476015的博客 297

iOS应用砸壳原理

要想破解别人的App,第一步就是拿到ipa包进行砸壳砸壳也称作软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(即解密)。

gcs的博客 4483

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

Android ptrace进程注入原理

一、ptrace函数介绍 ptrace函数的原型如下所示,其中request为行为参数,该参数决定了ptrace函数的行为,pid参数为远程进程的ID,addr参数与data参数在不同的request参数取值下表示不同的含义。 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 部分...

欢迎关注微信公众号:DroidMind 1万+

手把手教你自制Type-C OTG转换器(附电路图及避坑指南)

本文详细指导如何自制Type-C OTG转换器,包括核心电路设计、元器件选型及焊接技巧,特别强调硬件检测电路的关键作用。通过实测数据和避坑指南,帮助开发者解决兼容性问题,实现高效数据传输。

weixin_27038245的博客 716

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

算法大师! 1327

进程注入-PE注入

本文将阐述 4 种 PE(这里特指 EXE) 的进程注入技术,它们将篡改 PE 映像从而执行恶意代码,包括 `Process Hollwoing`、`Process Doppelganging`、`Process Herpaderping`、`Process Ghosting`。

蛇矛实验室 1505

实验十一 ——————二层交换基础

实验内容实验网络拓扑图如上所示SW1以及SW2都创建VLAN10和VLAN20,按照上图所示,将接口添加到特定的VLAN;测试PC之间的连通性,要求相同VLAN内的PC能够相互通信要求设置两台交换机名称以及进行特权模式的密码,并允许通过Telnet方式管理交换机实验目的了解二层交换机工作原理掌握交换机基本配置命令理解VLAN的概念,掌握VLAN的配置理解trunk的概念,掌握trunk的配置实验步...

Fly_鹏程万里 1489

进程注入之DLL注入

前言DLL注入是我在大一的时候接触的一种技术,那时候还不懂,最近结合小程序详细的理解了一下。DLL注入是将代码注入到一个远程进程中,并让远程进程调用LoadLibrary()函数,从而强制远程进程加载一个DLL程序到进程中。而当DLL被加载时就会运行DLL中的DllMain()函数,所以就会为恶意代码的执行提供机会,而因为DLL本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作...

bj5716的博客 1万+

YOLOv13改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv13-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 355

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++实现DLL注入的完整过程

1 简介 网上确实有关于DLL注入的过程,但是很多写的都不全,或者内容有点老旧。 DLL文件注入的原理是:接管被注入应用的控制权,并在应用程序运行的内存中开辟一条线程运行DLL文件中的入口函数的代码。 项目需求:向一个.txt文件注入dll,然后会自动弹出一个窗口 工具:VS2019 2 DLL动态链接库的编写 在VS2019中新建项目-选择【动态链接库(DLL)】 不要勾选:【将解决方案和项目放在同一目录中】 创建完项目后,会有四个文件 framework.h pch. h dllmain.

qq_43851684的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Windows进程注入原理详解:易语言实现视角

Windows进程注入是一种技术,允许将一个进程的代码或数据加载到另一个进程的地址空间中执行,常用于调试、插件扩展或安全测试。易语言(EPL)是一种基于VB语法的中文编程语言,支持直接调用Windows API。语句声明Windows API,实现进程注入。以下以DLL注入为例,展示易语言代码实现。假设目标进程为记事本(notepad.exe),注入自定义DLL(如。通过此实现,您可以在易语言中高效完成进程注入,适用于自动化测试或插件开发。进程注入的核心是绕过进程隔离机制,将外部代码注入目标进程并执行。

2501_93877735的博客 497

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

进程注入方法

                为了对内存中的某个进程进行操作,并且获得该进程地址空间里的数据,或者修改进程的私有数据结构,

traum的专栏 3710

进程注入之进程提权

本文作者:Gality 本文字数:7928字 阅读时长:20分钟 本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。 狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。 最近在研究进程注入相关的东西,主要是参考process-

WgpSec狼组安全团队 1432
上一篇: 我的PE程序加密核心代码(MASM 6.0
下一篇: U盘小病毒源代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值