《Windows PE》6.4.2 远程注入DLL

实验四十七:远程注入DLL

写一个窗口程序,将一个dll通过远程注入的方法,注入到第三章的示例程序PEHeader.exe中,支持32位和64位PE。

       ●dll.c

/*------------------------------------------------------------------------FileName:dll.c实验47:远程注入(DLL)(c) bcdaren, 2024
-----------------------------------------------------------------------*/
#include <Windows.h>//入口和退出点
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{switch (fdwReason){case DLL_PROCESS_ATTACH:{MessageBox(NULL, L"Welcome to PE!", L"Hello", MB_OK);break;}case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH:break;}return TRUE;  
}

resource.h(略)

remoteThread.rc(略)

●remoteThread.c

/*------------------------------------------------------------------------FileName:remoteThread.c实验46:远程线程注入演示程序功能:目标是在进程PEHeader.exe中远程注入一个DLL,运行并显示"Welcome to PE!"对话框。测试步骤:当PEHeader.exe运行时,运行remoteThread.exe,文件菜单---插入到PEHeader.exe(c) bcdaren, 2024
-----------------------------------------------------------------------*/
#include <windows.h>
#include <strsafe.h>	//StringCchCopy
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")
#include <Richedit.h>
#include <tchar.h>
#include <string.h>
#include "resource.h"//使用typedef给函数指针类型一个别名,函数指针存储函数地址
typedef FARPROC(__stdcall *_ApiSuspend)(HANDLE);
typedef HMODULE(__stdcall *_ApiResume)(HANDLE);
_ApiSuspend _suspendProcess;
_ApiResume _resumeProcess;BOOL CALLBACK ProcDlgMain(HWND, UINT, WPARAM, LPARAM);
BOOL _patchPEInfo();
void _Init();
void ShowErrMsg();HANDLE hInstance;
HWND hWinMain, hWinEdit;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
{const TCHAR	szDllEdit[] = TEXT("RichEd20.dll");const TCHAR	szClassEdit[] = TEXT("RichEdit20W");//peinfo.rc中定义const TCHAR	szNtdll[] = TEXT("ntdll.dll");const CHAR	szSuspend[] = "ZwSuspendProcess";//函数名需要定义为ASCII字符const CHAR	szResume[] = "ZwResumeProcess";const TCHAR	szErr3[] = TEXT("Error happend when getting address.");HMODULE hRichEdit, hNtdll;hRichEdit = LoadLibrary((LPCWSTR)&szDllEdit);hNtdll = LoadLibrary((LPCWSTR)&szNtdll);_suspendProcess = (_ApiSuspend)GetProcAddress(hNtdll, szSuspend);if (!_suspendProcess)MessageBox(NULL, szErr3, NULL, MB_OK);_resumeProcess = (_ApiResume)GetProcAddress(hNtdll, szResume);if (!_resumeProcess)MessageBox(NULL, szErr3, NULL, MB_OK);hInstance = GetModuleHandle(NULL);DialogBoxParam(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)ProcDlgMain, (LPARAM)0);FreeLibrary(hRichEdit);return 0;
}BOOL CALLBACK ProcDlgMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{switch (wMsg){case WM_CLOSE:EndDialog(hWnd, 0);return TRUE;case WM_INITDIALOG:hWinMain = hWnd;_Init();	//初始化return TRUE;case WM_COMMAND:switch (wParam){case IDM_EXIT:EndDialog(hWnd, 0);return TRUE;case IDM_OPEN:		//停止_patchPEInfo();return TRUE;}}return FALSE;
}void _Init()
{CHARFORMAT stCf;static TCHAR szClassEdit[] = TEXT("RichEdit20W");	//UNICODE版本//static TCHAR szClassEdit[] = TEXT("RichEdit20A");	//ASCII码版本static TCHAR szFont[] = TEXT("宋体");//设置编辑控件hWinEdit = GetDlgItem(hWinMain, IDC_INFO);SendMessage(hWinEdit, EM_SETTEXTMODE, TM_PLAINTEXT, 0);RtlZeroMemory(&stCf, sizeof(stCf));stCf.cbSize = sizeof(stCf);stCf.yHeight = 9 * 20;stCf.dwMask = CFM_FACE | CFM_SIZE | CFM_BOLD;StringCchCopy((LPTSTR)&stCf.szFaceName, lstrlen(szFont) + 1, (LPCTSTR)&szFont);SendMessage(hWinEdit, EM_SETCHARFORMAT, 0, (LPARAM)&stCf);SendMessage(hWinEdit, EM_EXLIMITTEXT, 0, -1);
}/*
;--------------------
; 将远程线程打到进程PEHeader.exe中
; 测试方法:首先运行PEHeader.exe
; 启动该程序,单击第一个菜单的第一项
; 会发现桌面上弹出"Welcome to PE!"对话框
;--------------------
*/
BOOL _patchPEInfo()
{HANDLE phwnd, hProcess, hCreate;DWORD parent, hProcessID;static TCHAR strTitle[256];static TCHAR szBuffer[256];const TCHAR szTitle[] = TEXT("PE文件头中几个关键地址的定位:");const TCHAR szErr1[] = TEXT("Error happend when openning.");const TCHAR szErr2[] = TEXT("Error happend when VirtualAllocEx.");static int dwProcessID, dwThreadID;PVOID lpLoadLibrary, lpDllName;static CHAR szMyDllFull[MAX_PATH];//注意:写入内存中的字符都是ANSI字符const TCHAR szDllKernel[] = TEXT("Kernel32.dll");const CHAR szLoadLibrary[] = "LoadLibraryA";//注意:写入内存中的字符都是ANSI字符const CHAR szMyDll[] = "\\DLL.dll";//注意:写入内存中的字符都是ANSI字符//准备工作:获取dll的全路径文件名、获取LoadLibrary函数地址等GetCurrentDirectoryA(MAX_PATH, szMyDllFull);//获取应用程序的当前工作目录strcat_s(szMyDllFull, MAX_PATH, szMyDll);//添加后缀名int nLen = sizeof(CHAR)*(strlen(szMyDllFull) + 1);//获取Kernel32.dll句柄,LoadLibrary函数地址lpLoadLibrary = GetProcAddress(GetModuleHandle(szDllKernel), (LPCSTR)szLoadLibrary);//通过标题获得进程的handleparent = 0;	//复位标志phwnd = GetWindow(GetWindow(GetDesktopWindow(), GW_CHILD), GW_HWNDFIRST);if (!GetParent(phwnd))parent = 1;while (phwnd){if (parent){parent = 0;	//复位标志//得到窗口标题文字GetWindowText(phwnd, strTitle, sizeof(strTitle));if (!_tcscmp(szTitle, strTitle))break;}//寻找这个窗口的下一个兄弟窗口phwnd = GetWindow(phwnd, GW_HWNDNEXT);if (!GetParent(phwnd)){if (IsWindowVisible(phwnd))parent = 1;}}//根据窗口句柄获取进程IDGetWindowThreadProcessId(phwnd, &hProcessID);//1.打开本地进程hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, hProcessID);if (!hProcess){MessageBox(NULL, szErr1, NULL, MB_OK);return FALSE;}//2.分配空间,以页为单位lpDllName = VirtualAllocEx(hProcess, NULL, nLen, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (!lpDllName){MessageBox(NULL, szErr2, NULL, MB_OK);return FALSE;}//3.写入线程代码,注意:写入内存中的字符都是ANSI字符SIZE_T dwWrite = 0;if (!WriteProcessMemory(hProcess, lpDllName, szMyDllFull, nLen, &dwWrite)){MessageBox(NULL, L"写入内存失败!\n", NULL, MB_OK);return FALSE;}//4.创建一个在另一个进程的虚拟地址空间中运行的线程hCreate = CreateRemoteThread(hProcess, NULL, 0, lpLoadLibrary, lpDllName, 0, NULL);//5.等待线程结束返回,释放资源WaitForSingleObject(hCreate, -1);CloseHandle(hCreate);VirtualFreeEx(hProcess, lpDllName, 0, MEM_FREE);CloseHandle(hProcess);return TRUE;
}

运行

      

                     图6-5远程注入DLL

  总结

上述示例程序的功能是在进程PEHeader.exe中远程注入一个DLL,运行并显示"Welcome to PE!"对话框。

测试步骤:当PEHeader.exe运行时,运行remoteThread.exe,点击文件菜单”插入到PEHeader.exe”,就可以将DLL远程注入到进程PEHeader.exe中了。

远程注入的步骤:

1.打开本地进程(调用OpenProcess函数)。

2.目标进程分配空间,以页为单位(调用VirtualAllocEx函数)。

3.写入目标进程完整的DLL文件名,(调用WriteProcessMemory函数)。注意:写入内存中的字符都是ANSI字符。

4.创建远程线程(调用CreateRemoteThread函数)。

5.等待线程结束返回,释放资源(调用WaitForSingleObject函数)。

在VS CreateRemoteThread函数调用处下断点,远程注入参数如下所示:

图6-6 远程注入的参数

我们可以使用windbg调试器附加进程PEHeader.exe,查看进程地址0x04dc0000处的数据就是我们已经注入的DLL完整名称。

0:009> db 0x04dc0000

04dc0000  44 3a 5c 63 6f 64 65 5c-77 69 6e 70 65 5c 63 68  D:\code\winpe\ch

04dc0010  30 36 5c 72 65 6d 6f 74-65 54 68 72 65 61 64 5c  06\remoteThread\

04dc0020  44 4c 4c 2e 64 6c 6c 00-00 00 00 00 00 00 00 00  DLL.dll.........

       对比无DLL注入的方法,使用DLL注入的方法不需要对代码和数据进行重定位(由操作系统自动完成),省去了很多不必要的麻烦,因此也是我们常用的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《PP-OCRv1》论文精读:PaddleOCR是目前SOTA级别的OCR开源技术(截止2024年10月)

PP-OCR: A Practical Ultra Lightweight OCR System论文地址PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System论文地址PP-OCRv3: More Attempts for the Improvement of Ultra Lightweight OCR System论文地址PaddleOCR Github OCR工具库 43.5K个star PP-OCRv1由百度…

矩阵基础知识

矩阵定义 矩阵的定义 1.矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示&#xff0c;例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为&#xff1a; 其中 aij表示矩阵 A中第i行第j列的元素。 矩阵的维度 1.矩阵的维度由它…

经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法)

经典功率谱估计的原理及MATLAB仿真&#xff08;自相关函数BT法、周期图法、bartlett法、welch法&#xff09; 文章目录 前言一、BT法二、周期图法三、Bartlett法四、welch法五、MATLAB仿真六、MATLAB详细代码总结 前言 经典功率谱估计方法包括BT法&#xff08;对自相关函数求傅…

python实现onvif协议下控制摄像头变焦,以及融合人形识别与跟踪控制

#1024程序员节 | 征文# 这两天才因为项目需要&#xff0c;对网络摄像头的视频采集以及实现人形识别与跟踪技术。对于onvif协议自然起先也没有任何的了解。但是购买的摄像头是SONY网络头是用在其他地方的。因为前期支持探究项目解决方案&#xff0c;就直接拿来做demo测试使用。 …

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

微前端架构新选择:micro-app 框架一文全解析

目录 前言技术方案沙箱withiframe 环境变量主应用生命周期子应用生命周期初始化更新卸载缓存 JS 沙箱样式隔离元素隔离路由系统⭐数据通信⭐资源系统预加载umd 模式其他功能调试工具 前言 https://micro-zoe.github.io/micro-app/ micro-app 是由京东前端团队推出的一款微前端…

基于springboot美食商城推荐系统

基于springboot美食商城推荐系统 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://downlo…

iOS调试真机出现的 “__llvm_profile_initialize“ 错误

一、错误形式&#xff1a; app启动就崩溃&#xff0c;如下&#xff1a; Demo__llvm_profile_initialize:0x1045f7ab0 <0>: stp x20, x19, [sp, #-0x20]!0x1045f7ab4 <4>: stp x29, x30, [sp, #0x10]0x1045f7ab8 <8>: add x29, sp, #0x100x1…

物联网平台是什么?

在数字化时代&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;已经成为推动社会进步和产业升级的重要力量。物联网平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为智能设备、数据和服务的中心枢纽。本文将带你深入了…

Mochi 1视频生成模型亮相:动作流畅,开放源代码

前沿科技速递&#x1f680; 近日&#xff0c;AI公司Genmo发布了最新的开源视频生成模型Mochi 1。Mochi 1在动作质量和提示词遵循能力方面有显著提升&#xff0c;并且与市面上许多闭源商业模型相媲美。作为一款支持个人和商业用途的开源工具&#xff0c;Mochi 1不仅展示了开源技…

UEFI EDK2框架学习 (四)——UEFI图形化

一、修改protocol.c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <stdio.h>EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable ) {EFI_STATUS S…

软考中级网络工程师,快背,都是精华知识点!

一、上午常考概念 计算机硬件基础&#xff1a;根据考纲分析&#xff0c;本章主要考查三个模块&#xff1a;计算机体系结构、存储系统、I/O输入输出系统&#xff0c;其中每一模块又分若干知识点。“计算机硬件基础”相当于软考中的“公共基础课”&#xff0c;不同方向、不同级别…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

系统架构图设计(轻量级架构)

轻量级架构一般包括&#xff1a;表现层、业务逻辑层、持久层、数据库层 表现层架构 MVC 模型&#xff08;Model&#xff09;&#xff1a;应用程序的主体部分&#xff0c;表示业务数据和业务逻辑视图&#xff08;View&#xff09;&#xff1a;用户看到并与之交流的界面控制器&…

Lim测试平台,五步完成批量生成数据

一、前言 在日常的测试工作中&#xff0c;我们常常需要生成大量的数据&#xff0c;例如为了测试分页功能、进行性能压力测试或准备测试所需的数据集。 虽然可以通过编写脚本或者使用如JMeter这样的工具来完成这些任务&#xff0c;但在团队合作的情境下&#xff0c;这种方法存…

打造通往自由的交易系统与策略——《以交易为生》读后感

我们知道要顺势而为&#xff0c;可什么是“势”&#xff1f;交易市场就像一片汪洋大海&#xff0c;潮起潮落的背后&#xff0c;有一套可以捕捉趋势的规律。要想看到势&#xff0c;就像软件工程中的可观测性&#xff0c;要找到合适的工具和指标&#xff0c;才能发现市场中重要的…

【云从】十、常见安全问题与云计算的计费模式

文章目录 1、常见安全问题1.1 DDoS攻击1.2 病毒攻击1.3 木马攻击1.4 代码自身漏洞 2、安全体系3、云计算的计费模式4、常见云产品的计费方案5、云产品计费案例 1、常见安全问题 1.1 DDoS攻击 通过分布在各地的大量终端&#xff0c;同时向目标发送恶意报包&#xff0c;以占满目…

微信小程序版本更新管理——实现自动更新

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

图表设计中文本的字体、大小与颜色

在创建图表时&#xff0c;我们往往过分关注图形的设计而忽视了文本的重要性。文本在图表中扮演着至关重要的角色&#xff0c;它不仅辅助图形具象化地展示数据&#xff0c;更是图表真实性和可靠性的关键。然而&#xff0c;很多人在设计图表时&#xff0c;并没有考虑到字体的选择…

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…