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程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.