DLL注入总体介绍

一.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)]( https://www.cnblogs.com/luoyesiqiu/p/12173609.html#:~:text=DLL注入基本流程 1 1.打开目标进程 Windows下有个名为OpenProcess的函数可以打开一个进程,它的原型如下: HANDLE OpenProcess ( ,%E5%BE%80%E5%BC%80%E8%BE%9F%E7%9A%84%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4%E4%B8%AD%E5%86%99%E5%85%A5%E8%A6%81%E6%B3%A8%E5%85%A5%E7%9A%84DLL%E7%9A%84%E8%B7%AF%E5%BE%84%20WriteProcessMemory%E5%8F%AF%E4%BB%A5%E5%90%91%E6%8C%87%E5%AE%9A%E7%9A%84%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80%E4%B8%AD%E5%86%99%E5%85%A5%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%87%BD%E6%95%B0%E5%8E%9F%E5%9E%8B%E5%A6%82%E4%B8%8B%EF%BC%9A%20...%204%204.%E7%BB%99%E7%9B%AE%E6%A0%87%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%EF%BC%8C%20%E5%8A%A0%E8%BD%BDDLL%20%EF%BC%881%EF%BC%89GetModuleHandle%E5%87%BD%E6%95%B0%E6%A0%B9%E6%8D%AE%E6%A8%A1%E5%9D%97%E5%90%8D%E7%A7%B0%E5%BE%97%E5%88%B0%E6%A8%A1%E5%9D%97%E7%9A%84%E5%8F%A5%E6%9F%84%EF%BC%8C%E5%8E%9F%E5%9E%8B%E5%A6%82%E4%B8%8B%EF%BC%9A%20)
  3. 网络攻防:DLL注入实现键盘钩取+记事本注入并联网下载网页_dll注入能做到什么-CSDN博客
  4. windows10 记事本进程 键盘消息钩子 dll注入-腾讯云开发者社区-腾讯云 (tencent.com)
  5. [求助]Win10下记事本Dll注入不成功-求助问答-看雪-安全社区|安全招聘|kanxue.com
posted @ 2023-10-19 23:06  ONE_ZJ  阅读(106)  评论(0)    收藏  举报