《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.rhkb.cn/news/455685.html

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

相关文章

记一次js泄露pass获取核心业务

文章目录 一、漏洞原因二、漏洞成果三、漏洞利用过程1.js泄露口令信息2、进入系统后台,管理数据库权限(22个)3、执行命令获取服务器权限4、通过添加扫描脚本,获取存活的内网信息四、免责声明一、漏洞原因 系统存在js泄露口令信息,获取系统超级管理员权限。系统为核心数据研…

ZYNQ AXI_GPIO_INT

REVIEW 软核AXI_GPIO之前已经简单学习过&#xff1a; AXI_GPIO_axi-gpio-CSDN博客 PS侧中断也简单调试过&#xff1a; ZYNQ PS_GPIO中断-CSDN博客 1. 今日摸鱼任务 简单实现AXI_GPIO中断&#xff1a; ps_key控制pl_led闪烁(MIO中断) pl_key控制ps_led闪烁(AXI_GPIO中断) …

js(深浅拷贝,节流防抖,this指向,改变this指向的方法)

一、深浅拷贝 1.基本数据类型和引用数据类型的区别&#xff1a; 1. 基本数据类型的变量存储的是值 引用数据类型的变量存储的是地址值 2. 基本数据类型的变量存储的值在栈内存 引用数据类型的变量存储的值在堆内存 3. 基本数据类型的变量存储的是值和值之间相互不影响 引用数据…

矩阵基础知识

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

【多线程和高并发】多线程和高并发提纲

文章目录 多线程(多线程问题的)三大源头两个主要问题两大解决方案 高并发问题解决方案 对多线程和高并发相关问题整理了一个简单的提纲。 通过这个提纲&#xff0c;足够引出对并发编程中大部分问题的讨论~ 多线程 (多线程问题的)三大源头 线程并发执行带来的原子性问题。这是…

去梯之言:招聘行业运作的秘密——之找到一份工作

一、前言 招聘行业是一个水很深的行当。不过&#xff0c;尽管它很复杂&#xff0c;了解该行业的工作方式还是很重要的&#xff0c;这样你就可以在这片波涛汹涌的水域中平安航行&#xff0c;获得自己心仪的软件开发职位。反过来&#xff0c;如果你对这个波谲云诡的行业一无所知&…

接口测试(四)jmeter——文件上传

一、文件上传&#xff08;注&#xff1a;示例仅供参考模仿&#xff09; 1. 添加【HTTP信息头管理器】&#xff0c;配置【HTTP信息头管理器】如下&#xff1a; 2. 添加【HTTP请求默认值】&#xff0c;配置【HTTP请求默认值】如下&#xff1a; 3. 添加【HTTP请求】&#xff0…

window7虚拟机VMware与主机共享文件

文件管理器》计算机网络右键》属性》高级共享设置——全部启用 新建文件夹》右键》属性》共享》选择可以共享的用户——我这里选的是所有用户 点击高级共享》权限》保存设置——设置文件权限 文件管理器》计算机网络》右键》属性》————查看虚拟机计算机名称 主机访问 主机…

GIS常见前端开发框架

#1024程序员节&#xff5c;征文# 伴随GIS的发展&#xff0c;陆续出现了众多开源地图框架&#xff0c;这些地图框架与众多行业应用融合&#xff0c;极大地拓展了GIS的生命力&#xff0c;这里介绍几个常见的GIS前端开发框架&#xff0c;排名不分先后。 1.Leaflet https://leafl…

android 微信分享报:签名不对,请检查签名是否与开发平台签名一致的解决

1、微信分享会检查签名与开发平台的签名是否一致&#xff1a; 基本信息 | 微信开放文档 官方文档 下载签名工具&#xff0c;并且&#xff0c;将包名输入&#xff0c;然后点击生成&#xff0c;得到这个一串字符串。 2、到开发平台中&#xff1a;微信开放平台 登录&#xff0c;…

Vue2、Element中实现Enter模拟Tab,实现切换下一个框的效果

目录 &#x1f4c3;前序 &#x1f449;开发历程 &#x1f4bb;实际代码 &#x1f4fd;实现效果图 前序 在几乎所有的浏览器中&#xff0c;都具备通过 Tab 键来切换焦点的功能。然而&#xff0c;有些用户提出了强烈要求&#xff0c;希望能够增加通过 Enter 键…

批量合并PDF 文件的 5 大解决方案

PDF 可以将一个、两个、三个甚至更多的记录封装在一起&#xff0c;以显示完整的信息和用于逻辑和交互式结构化的不同元素。由于 PDF 可以提出多层结构&#xff0c;因此当用户知道如何最大化这种格式时&#xff0c;将所有文件组织到其中非常有效。正如许多经验丰富的用户和 PDF …

selenium案例——爬取哔哩哔哩排行榜

案例需求&#xff1a; 1.使用selenium自动化爬虫爬取哔哩哔哩排行榜中舞蹈类的数据&#xff08;包括视频标题、up主、播放量和评论量&#xff09; 2.利用bs4进行数据解析和提取 3.将爬取的数据保存在本地json文件中 4.保存在excel文件中 分析&#xff1a; 1.请求url地址&…

03 springboot-国际化

Spring Boot 提供了很好的国际化支持&#xff0c;可以轻松地实现中英文国际化。 项目创建&#xff0c;及其springboot系列相关知识点详见&#xff1a;springboot系列 springboot系列&#xff0c;最近持续更新中&#xff0c;如需要请关注 如果你觉得我分享的内容或者我的努力对…

2024年软件设计师中级(软考中级)详细笔记【11】知识产权基础知识(分值2~3分)

目录 前言第11章 知识产权基础知识【2-3分】11.1 标准化基础知识11.2 知识产权基础知识11.2.2 计算机软件著作权11.2.3 计算机软件的商业秘密权11.2.4 专利权概述习题 结语 前言 在备考软件设计师中级考试的过程中&#xff0c;我遇到了些许挑战&#xff0c;也收获了宝贵的经验…

基于django的个人相册日记管理系统

你是否还在为毕业设计苦思冥想&#xff0c;不知道怎么选择一个合适又实用的技术项目&#xff1f;今天给大家介绍一款功能全面的Django项目——个人相册日记管理系统&#xff0c;堪称毕业设计的完美选择&#xff01; 首先&#xff0c;这不是简单的相册或日记本&#xff0c;而是…

苍穹外卖05

redis 1. 启动redis .\redis-server.exe redis.windows.conf 2. 连接redis到客户端(这里我们使用ARDM图形化工具) 新建连接 一旦建立好后就永久直接可用(和mysql一个道理) 连接成功界面

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急&#xff0c;说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复&#xff0c;当然需要一定的条件&#xff1a;首先mysql开启binlog&#xff0c;然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…