首页 > 其他分享 >DLL注入总体介绍

DLL注入总体介绍

时间:2023-10-19 23:25:33浏览次数:39  
标签:总体 函数 句柄 DLL 线程 进程 DWORD 注入

一.DLL注入应用:

  1. 改善功能与修复Bug:可以使用DLL注入技术为程序添加新功能(类似于插件),或者修改有问题的代码、数据等。

  2. 消息钩取:windows os自带的消息钩取功能就是一种dll注入技术,它自带了一些dll文件,我们只需要编写函数将其注入就可以。比如说后面会提到的键盘消息钩取。

  3. 监视、管理应用程序的使用:类似手机中常见的青少年模式,比如,用来阻止特定程序(像游戏、股票交易等)运行、禁止访问有害网站,以及监视PC的使用等。

  4. 恶意代码:不法分子通过把自己编写的恶意代码隐藏到正常进程中,施放dll文件,开启后门端口,进行窃取用户信息、篡改注册表,强制安装病毒等恶意操作。

二.DLL注入手法:

  1. APC注入
  2. message注入
  3. 注册表注入
  4. 远程线程注入
  5. 输入法注入
  6. LSP注入

三.常用API函数和结构体

  1. OpenProcess函数:

    用于打开进程

    HANDLE OpenProcess(
      DWORD dwDesiredAccess,//访问权限
      BOOL  bInheritHandle,//是否继承句柄
      DWORD dwProcessId//打开进程的id
    );
    //例如:
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    if (NULL == hProcess) {
    	OutputDebugString("Cannot open this process.\n");
    	return -1;
    }
    
  2. CreateToolhelp32Snapshot函数:

    创建一个进程快照,获得当前运行的进程列表,这个函数通常用于获得进程PId。

    HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID);
    /*
    参数说明:
    dwFlags:指定要创建的快照类型。可以是以下值的组合:
    	THCS_SNAPALL:获取所有进程和线程的信息。
    	进程信息。
    	TH32CS_SNAPTHREAD:仅获取线程信息。
    	TH32CS_SNAPMODULE:仅获取模块信息。
    th32ProcessID:可选参数,指定要获取信息的进程ID。如果不指定,将获取所有进程的信息。
    返回值:
    如果成功,返回一个句柄,表示创建的快照。
    如果失败,返回NULL。
    /*
    
    
    
  3. Process32Next函数:

    Process32Next 是一个 Windows API 函数,用于遍历系统中所有运行的进程。它需要两个参数:一个进程快照句柄和一个指向 PROCESSENTRY32 结构体的指针。当函数成功时,它会更新结构体中的字段以反映下一个进程的信息,并返回非零值;如果已经到达快照的末尾,则返回零。

    int GetPidByProcessName(const char* ProcessName) {
    	HANDLE Processes = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
    	PROCESSENTRY32 ProcessInfo = { 0 };
    	ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
    	while (Process32Next(Processes, &ProcessInfo)) {
    		if (strcmp(ProcessInfo.swExeFile, ProcessName) == 0) {
    			return ProcessInfo.th32ProcessID;
    		}
    	} 
    	return -1;
    }
    //使用进程快照和进程遍历函数,得到已知名称进程的PID。
    
  4. VirtualAllocEx函数:

    该函数可以在目标进程空间申请一块内存空间

    LPVOID VirtualAllocEx(
      HANDLE hProcess,//要申请的进程
      LPVOID lpAddress,//申请内存的所在地址,传入null可以自动寻址
      SIZE_T dwSize,//申请内存的大小
      DWORD  flAllocationType,//申请的内存空间类型
      DWORD  flProtect//内存保护量
    );
    
    
  5. WriteProcessMemory函数:

    WriteProcessMemory可以向指定的内存地址中写入数据

    BOOL WriteProcessMemory(
      HANDLE  hProcess,//进程句柄
      LPVOID  lpBaseAddress,//要写入的目标地址
      LPCVOID lpBuffer,//待写入数据
      SIZE_T  nSize,//写入数据的大小
      SIZE_T  *lpNumberOfBytesWritten
    );
    
    
  6. GetModuleHandleA函数:

    GetModuleHandle函数根据模块名称得到模块的句柄

    HMODULE GetModuleHandleA(
      LPCSTR lpModuleName//模块名
    );
    
  7. GerProcAddress函数:

    GetProcAddress函数可以根据函数名来得到模块中的一个导出函数的地址

    FARPROC GetProcAddress(
      HMODULE hModule,//模块句柄
      LPCSTR  lpProcName//导出函数名
    );
    //返回值:导出函数的地址
    
  8. CreateRemoteThread函数:

    CreateRemoteThread用于在指定进程的虚拟空间中开启一个线程

    注意CreateRemoteThread可以在指定的外部进程中创建并启动新的线程,而CreateThread只能在当前进程中创建新的线程

    HANDLE CreateRemoteThread(
      HANDLE                 hProcess,//目标进程句柄
      LPSECURITY_ATTRIBUTES  lpThreadAttributes,
      SIZE_T                 dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,//线程执行函数地址
      LPVOID                 lpParameter,//线程函数的参数
      DWORD                  dwCreationFlags,
      LPDWORD                lpThreadId
    );
    
  9. LoadLibrary函数:

    HMODULE WINAPI LoadLibraryW (LPCWSTR lpLibFileName)//参数lpFileName是模块的名称
    
  10. PROCESSENTRY32

    typedef struct tagPROCESSENTRY32 {
        DWORD dwSize;//表示结构体的大小,单位为字节
        DWORD cntUsage;//表示进程的使用计数
        DWORD th32ProcessID;//表示进程的标识符(PID)
        ULONG_PTR th32DefaultHeapID;//表示进程使用的默认堆的标识符
        DWORD th32ModuleID;//表示进程加载的第一个模块的标识符
        DWORD cntThreads;//表示进程中线程的数量
        DWORD th32ParentProcessID;//表示进程中线程的数量
        LONG pcPriClassBase;//表示进程的优先级基址
        DWORD dwFlags;//表示进程的标志位
        CHAR szExeFile[MAX_PATH];//表示进程可执行文件的完整路径,最大长度为MAX_PATH
      } PROCESSENTRY32;
      typedef PROCESSENTRY32 *PPROCESSENTRY32;
      typedef PROCESSENTRY32 *LPPROCESSENTRY32;
    

四.参考文章:

  1. 【外挂编程】外挂编程技术揭秘(三)DLL注入_游戏辅助dll注入方式-CSDN博客
  2. Windows dll注入 - luoyesiqiu - 博客园 (cnblogs.com)
  3. 网络攻防:DLL注入实现键盘钩取+记事本注入并联网下载网页_dll注入能做到什么-CSDN博客
  4. windows10 记事本进程 键盘消息钩子 dll注入-腾讯云开发者社区-腾讯云 (tencent.com)
  5. [求助]Win10下记事本Dll注入不成功-求助问答-看雪-安全社区|安全招聘|kanxue.com

标签:总体,函数,句柄,DLL,线程,进程,DWORD,注入
From: https://www.cnblogs.com/ONEZJ/p/17775951.html

相关文章

  • 远程线程注入技术
    一.远程线程注入步骤:获得目标进程句柄方法1:先获得窗口句柄,根据窗口句柄获得进程ID,再根据进程ID获得进程句柄。hwnd=FindWindow("Notepad",NULL);//找到程序窗口句柄if(hwnd==NULL){MessageBox(NULL,"获得窗口句柄错误!","ERROR",MB_OK);......
  • 泛微E-Office json_common.php文件存在sql注入漏洞
    漏洞简介泛微e-office为企业办公提供丰富应用,覆盖常见协作场景,开箱即用。满足人事、行政、财务、销售、运营、市场等不同部门协作需求,帮助组织高效人事管理。系统json_common.php文件存在SQL注入漏洞漏洞复现fofa语法:app="泛微-EOffice"登录页面如下:POC:POST/building/......
  • 用友畅捷通 畅捷CRM get_usedspace.php SQL注入漏洞
    漏洞简介畅捷CRMget_userspace.php文件中site_id参数存在SQL注入漏洞漏洞复现fofa语法:icon_hash="-1068428644"登录页面如下:POC:GET/WebSer~1/get_usedspace.php?site_id=-1159%20UNION%20ALL%20SELECT%20CONCAT(0x7178767671,0x5664726e476a637a565a50614d4c435745446a......
  • 用友时空KSOA dept.jsp SQL注入漏洞
    漏洞简介用友时空KSOA是建立在SOA理念指导下研发的新一代产品,是根据流通企业最前沿的I需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的IT系统之间彼此轻松对话,帮助流通企业保护原有的IT投资,简化IT管理,提升竞争能力,确保企业整体的战略目标以及创新活动的实现。系统dep......
  • 用友GPR-U8 slbmbygr SQL注入漏洞
    漏洞简介用友GRP-U8是面向政府及行政事业单位的财政管理应用。北京用友政务软件有限公司GRP-U8SQL注入漏洞。漏洞复现fofa语法:app="用友-GRP-U8"登录页面如下:POC:/u8qx/slbmbygr.jsp?gsdm=1';WAITFORDELAY'0:0:5'--sqlmap梭哈nuclei批量yaml文件id:yonyou_GRPU8_slb......
  • 用友GRP-RMIS datalist.jsp SQL注入漏洞
    漏洞描述用友GRP-RMIS系统的datalist.jsp存在sql注入漏洞漏洞复现fofa语法:app="用友-GRP-RMIS系统"系统登录页面如下:POC:POST/datalist.jspHTTP/1.1Host:xxxxUser-Agent:python-requests/2.31.0Accept-Encoding:gzip,deflateAccept:*/*Connection:closeConten......
  • ASP.NET Core中对开放泛型(Open Generic)的依赖注入
    publicinterfaceIRepository<T>{voidAdd(Tentity);List<T>Get();}publicclassRepository<T>:IRepository<T>{List<T>_list=newList<T>();publicvoidAdd(Tentity){_list.Add(entit......
  • Spring-IOC构造注入,以及以基于注解的DI
    .Spring核心:IOCAOPIOC:控制反转:就是对对象控制权的转移,从程序代码本身反转到外部的容器中,通过外部容器对象的创建,属性的赋值,依赖的管理。IOC的具体实现:依赖注入(DI):1.创建项目,导入架包2.定义类3.创建Spring的配置文件,编写bean4.在测试类中测试......
  • 39 依赖注入
    只能“父传子”在main.js中可以提供全局变量asynchron:异步synchronized:同步......
  • spring setter注入
     <!--对象类型1-->  <propertyname="user">   <props>     <propkey="">dddd</prop>   </props>  </property>   <!--对象类型2-->   <propertyname="user"ref="st......