DLL 动态注入---ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---DLL程序

本文主要是介绍DLL 动态注入---ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---DLL程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DLL 动态注入—ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称—exe程序

DLL 动态注入—ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称—exe程序

文章目录

  • DLL 动态注入---ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---exe程序


/*------------------------------------------------------------------------22-InjLib.cppImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---exe程序
-----------------------------------------------------------------------*/
#include "CmnHdr.h"
#include "Resource.h"
#include <malloc.h>
#include <strsafe.h>
#include <TlHelp32.h>
#include <windowsx.h>
#include <tchar.h>/
#ifdef UNICODE#define InjectLib InjectLibW#define EjectLib EjectLibW
#else#define InjectLib InjectLibA#define EjectLib EjectLibA
#endif/
BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile);//创建远程线程并注入DLL
BOOL WINAPI InjectLibA(DWORD dwProcessId, PCSTR pszLibFile);
BOOL WINAPI EjectLibW(DWORD dwProcessId, PCWSTR pszLibFile);//将DLL从进程地址空间中撤销
BOOL WINAPI EjectLibA(DWORD dwProcessId, PCSTR pszLibFile);
BOOL  Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtrl, UINT codeNotity);
INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,PTSTR pszCmdLine,int)
{DialogBox(hInstance,MAKEINTRESOURCE(IDD_INJLIB),NULL,Dlg_Proc);return 0;
}
INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){chHANDLE_DLGMSG(hWnd,WM_INITDIALOG,Dlg_OnInitDialog);chHANDLE_DLGMSG(hWnd,WM_COMMAND,Dlg_OnCommand);}return FALSE;
}/
BOOL  Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{chSETDLGICONS(hwnd,IDI_INJLIB);return TRUE;
}/
void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtrl, UINT codeNotity)
{switch (id){case IDCANCEL:EndDialog(hwnd, id);break;case IDC_INJECT:DWORD dwProcessId = GetDlgItemInt(hwnd, IDC_PROCESSID, NULL, FALSE);if (dwProcessId == 0){//如果为0,表示注入本进程dwProcessId = GetCurrentProcessId();}TCHAR szLibFile[MAX_PATH];GetModuleFileName(NULL,szLibFile,_countof(szLibFile));//获得当前进程的完整路径PTSTR pFileName = _tcsrchr(szLibFile, TEXT('\\')) + 1;_tcscpy_s(pFileName,_countof(szLibFile) - (pFileName - szLibFile),TEXT("22-ImgWalk.DLL"));if (InjectLib(dwProcessId, szLibFile)){chVERIFY(EjectLib(dwProcessId,szLibFile));chMB("DLL注入/撤消成功!");} elsechMB("DLL注入/撤消失败!");break;}
}/
//创建远程线程注入DLL
//参数:dwProcessID --进程ID
//  pszLibFile ---要注入的DLL路径(含名称)
BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile)
{BOOL bOk = FALSE;//假设注入失败HANDLE hProcess = NULL,hThread = NULL;PWSTR pszLibFileRemote = NULL;__try {//获得目标进程句柄hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |	//需要检索有关进程的某些信息,例如其令牌、退出代码和优先级类PROCESS_CREATE_THREAD |		//For CreateRemoteThreadPROCESS_VM_OPERATION|		//For VirtualAllocEx/VirtualFreeExPROCESS_VM_WRITE,			//For WriteProcessMemoryFALSE,dwProcessId);if (hProcess == NULL) __leave;//计算存储DLL路径所需字节数int cch = 1 + lstrlenW(pszLibFile);//字符个数,因strlen不含结尾\0,所以加1int cb = cch * sizeof(wchar_t);//为远程进程分配内存空间pszLibFileRemote = (PWSTR)VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);if (pszLibFileRemote == NULL) __leave;//复制DLL路径到远程进程的内存中if (!WriteProcessMemory(hProcess, pszLibFileRemote,(PVOID)pszLibFile, cb, NULL)) __leave;//获取LoadLibraryW在Kernel32.dll中的地址//LPTHREAD_START_ROUTINE 函数指针,该函数通知宿主某个线程已开始执行。PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)//指向一个函数,该函数通知宿主某个线程已开始执行GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");if (pfnThreadRtn == NULL) __leave;//创建远程线程调用LoadLibraryWhThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn,		//LoadLibraryW(远程进程地址空间中)pszLibFileRemote,	//Dll路径名(远程进程地址空间中)0, NULL);//立即执行if (hThread == NULL) __leave;//等待远程线程结束WaitForSingleObject(hThread,INFINITE);bOk = TRUE;  //注入成功}__finally {//释放用于保存Dll路径名称的内存if (pszLibFileRemote != NULL)VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);if (hThread != NULL)CloseHandle(hThread);if (hProcess != NULL)CloseHandle(hProcess);}return (bOk);}BOOL WINAPI InjectLibA(DWORD dwProcessId, PCSTR pszLibFile)
{//分配一个栈内存(无需手动释放),用于存储Unicode版本的路径名SIZE_T cchSize = lstrlenA(pszLibFile) + 1;//字符个数,含'\0'PWSTR pszLibFileW = (PWSTR)_alloca(cchSize * sizeof(wchar_t));//将ANSI路径转换为等价的UNICODEStringCchPrintfW(pszLibFileW, cchSize, L"%s", pszLibFile);return InjectLibW(dwProcessId, pszLibFileW);
}///
//将DLL从进程地址空间中撤销
//先根据DLL文件名,在进程加载的模块中查找是否该DLL己被加载
//如果被加载,记下这个DLL的句柄。然后创建远程线程去调用FreeLibrary卸载
BOOL WINAPI EjectLibW(DWORD dwProcessId, PCWSTR pszLibFile)
{BOOL bOk = FALSE;//假定撤销失败HANDLE hthSnapshot = NULL;HANDLE hProcess = NULL, hThread = NULL;__try{//抓取进程快照hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,//指定进程中加载的所有模块dwProcessId);if (hthSnapshot == INVALID_HANDLE_VALUE) __leave;//获得Unicode版本的目标DLL库句柄MODULEENTRY32W me = {sizeof(me)};BOOL bFound = FALSE;BOOL bMoreMods = Module32FirstW(hthSnapshot, &me);//Unicode版本for (;bMoreMods;bMoreMods = Module32NextW(hthSnapshot,&me)){bFound = (_wcsicmp(me.szModule,pszLibFile) == 0) || (_wcsicmp(me.szExePath,pszLibFile) == 0);if(bFound)break;}if (!bFound) __leave;//获得目标进程的句柄hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION ,FALSE, dwProcessId);if (hProcess == NULL) __leave;//获取FreeLibraray在Kernel32.dll中的地址PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");if(pfnThreadRtn == NULL) __leave;//创建远程线程hThread = CreateRemoteThread(hProcess,NULL, 0,pfnThreadRtn,me.modBaseAddr,0, NULL);if (hThread == NULL) __leave;//等待远程线程结束WaitForSingleObject(hThread, INFINITE);bOk = TRUE;  //撤销成功}__finally{if (hthSnapshot != NULL)CloseHandle(hthSnapshot);if (hThread != NULL)CloseHandle(hThread);if (hProcess != NULL)CloseHandle(hProcess);}return bOk;
}BOOL WINAPI EjectLibA(DWORD dwProcessId, PCSTR pszLibFile)
{//分配一个栈内存(无需手动释放),用于存储Unicode版本的路径名SIZE_T cchSize = lstrlenA(pszLibFile) + 1;//字符个数,含'\0'PWSTR pszLibFileW = (PWSTR)_alloca(cchSize * sizeof(wchar_t));//将ANSI路径转换为等价的UNICODEStringCchPrintfW(pszLibFileW, cchSize, L"%s", pszLibFile);return EjectLibW(dwProcessId, pszLibFileW);
}

这篇关于DLL 动态注入---ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---DLL程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1127120

相关文章

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序