逆向工程核心原理 Chapter23 | DLL注入

2024-09-02 22:36

本文主要是介绍逆向工程核心原理 Chapter23 | DLL注入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面学的只是简单的Hook,现在正式开始DLL注入的学习。

0x01 DLL注入概念

DLL注入指的是向运行中的其它进程强制插入特点的DLL文件。

从技术细节上来说,DLL注入就是命令其它进程自行调用LoadLibrary() API,加载用户指定的DLL文件

概念示意图:在这里插入图片描述

很关键的一个点:

加载到notepad.exe进程的myhack.dll具有对notepad.exe进程内存合法的访问权限!

那我们就可以"为所欲为"了。

这里还涉及到一个点:

DLL被加载到进程后会自动运行DllMain()函数,用户可以把待执行的代码放在DllMain()函数内。

类似Java反序列化构造恶意类的静态方法,或者是LD_PRELOAD绕过disable_function的那个__attribute__

在这里插入图片描述

0x02 DLL注入实现——CreateRemoteThread

核心代码:

在这里插入图片描述

核心思路:

  • OpenProcess:获取目标进程句柄
  • VitrualAllocEx:在目标进程内存中分配对应大小的内存
  • WriteProcessMemory:将待注入的dll路径写入上一步分配的内存中
  • GetModuleHandleW + GetProcAddress:获取LoadLibrary()API的地址
  • CreateRemoteThread:传入LoadLibrary()API地址和dll路径地址,调用LoadLibrary("myhack.dll"),触发DllMain函数执行。

这里有几个点得注意下。

注意点

CreateRemoteThread

HANDLE CreateRemoteThread([in]  HANDLE                 hProcess,[in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,[in]  SIZE_T                 dwStackSize,[in]  LPTHREAD_START_ROUTINE lpStartAddress,[in]  LPVOID                 lpParameter,[in]  DWORD                  dwCreationFlags,[out] LPDWORD                lpThreadId
);

我们这里关注两个参数:lpStartAddresslpParameter

在这里插入图片描述

这也是为什么我们要获得LoadLibrary()API的地址,以及将myhack.dll路径字符串写入目标进程的内存。

kernel32.dll

这里我们LoadLibrary()这些都是在我们当前进程获取的,并不是在目标进程notepad.exe

可以这么做的原因(也是这种DLL注入能成功的原因):

在这里插入图片描述

ThreadProc && LoadLibrary

这个也是很有趣的点。

在这里插入图片描述

两者接收的参数是类似的,所以完全可以将LoadLibray传为ThreadProc参数,把LoadLibrary的参数lpFileName传为lpParameter


下面开始手写一下代码。

代码编写

dll

这里编写用到了一个小技巧:

我们可以实现另一个函数,然后DllMain用CreateThread来调用。(避免了DllMain中写大量代码)

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"#include<Windows.h>
#include<urlmon.h>#pragma comment (lib,"Urlmon.lib")
#define URL (L"https://www.runoob.com")
#define FILENAME (L"C:\\Users\\Administrator\\Desktop\\down.html")DWORD WINAPI down(LPVOID lpParam) {HRESULT hResult = URLDownloadToFileW(NULL, URL, FILENAME, 0, NULL);if (hResult == S_OK) {OutputDebugString(L"下载成功!\n");}else {OutputDebugString(L"下载失败!\n");return 1;}return 0;
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBoxA(NULL, "DLL Injected!\n", "REVERSING", MB_OK);HANDLE hThread = CreateThread(NULL, 0, &down, NULL, 0, NULL);CloseHandle(hThread);break;}return TRUE;
}

main

#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<tchar.h>
#include<iostream>
using namespace std;void Inject(DWORD dwPid, WCHAR* szPath) {DWORD dwBufSize = (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR);// 1. OpenProcess()HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);// 2. VitrualAllocEx()LPVOID pRemoteAddress = VirtualAllocEx(hProcess,NULL,dwBufSize,MEM_COMMIT,PAGE_READWRITE);// 3. WriteProcessMemory()WriteProcessMemory(hProcess, pRemoteAddress, szPath, dwBufSize, NULL);// 4. GET LoadLibraryWHMODULE hK32 = GetModuleHandle(L"kernel32.dll");LPVOID pLW = GetProcAddress(hK32,"LoadLibraryW");cout << "loadAdd:" << pLW << "\n";// 5. CreateRemoteThread()HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pLW,pRemoteAddress,0,NULL);if (!hThread){printf("CreateRemoteThread Failed");}WaitForSingleObject(hThread, -1);VirtualFreeEx(hProcess, pRemoteAddress, dwBufSize, MEM_DECOMMIT);
}
int _tmain(int argc, _TCHAR* argv[]) {wchar_t wStr[] = L"C:\\Users\\Administrator\\Desktop\\逆向练习\\DLL Injection\\dll\\Dll1\\x64\\Debug\\Dll1.dll";DWORD dwPid = 0;HWND hNotepad = FindWindowA("Notepad", NULL); // 首字母大写。。// get PIDDWORD dwRub = GetWindowThreadProcessId(hNotepad, &dwPid);printf("目标窗口的进程PID为 : %d\n", dwPid);Inject(dwPid, wStr);system("pause");return 0;
}

效果

在这里插入图片描述

在这里插入图片描述

0x03 DLL注入实现——AppInit_DLLs

这种在渗透中可以留后门。

原理

在这里插入图片描述

dll编写

若当前加载自己的进程为"notepad.exe",则以隐藏模式运行IE,连接指定网站。

这里就不按教程的写法了,而是直接把先前的dll修改一下,加一个notepad.exe的判断

dll:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"#include<Windows.h>
#include<urlmon.h>
#include<tchar.h>#pragma comment (lib,"Urlmon.lib")
#define URL (L"https://www.runoob.com")
#define FILENAME (L"C:\\Users\\Administrator\\Desktop\\down2.html")
#define TARGET_PROC (L"notepad.exe")DWORD WINAPI down(LPVOID lpParam) {HRESULT hResult = URLDownloadToFileW(NULL, URL, FILENAME, 0, NULL);if (hResult == S_OK) {OutputDebugString(L"下载成功!\n");}else {OutputDebugString(L"下载失败!\n");return 1;}return 0;
}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
)
{TCHAR szPath[MAX_PATH] = { 0 };TCHAR *p = NULL;switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:if (!GetModuleFileName(NULL, szPath, MAX_PATH))break;if (!(p = _tcsrchr(szPath, '\\')))break;if (_tcsicmp(p + 1, TARGET_PROC))break;HANDLE hThread = CreateThread(NULL, 0, &down, NULL, 0, NULL);CloseHandle(hThread);break;}return TRUE;
}

编译后放在C:/Users/Administrator/Desktop/Dll2.dll

编辑注册表

然后编辑注册表。(记得先导出备份)

编辑AppInit_Dlls

在这里插入图片描述

再修改LoadAppInit_Dlls注册表项的值为1.在这里插入图片描述

重启。

然后用ProcessMonitor看,随便找个调用了User32.dll的进程:

在这里插入图片描述

可以看到我们自己的Dll2.dll已经加载了。

那我们尝试运行notepad.exe

在这里插入图片描述

成功。

当然,实战中这种必会被杀软杀掉。。所以只是当个技巧知识点掌握一下。

总结

共勉!

在这里插入图片描述

这篇关于逆向工程核心原理 Chapter23 | DLL注入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

电脑提示msvcp90.dll缺少怎么办? MSVCP90.dll文件丢失的修复方法

《电脑提示msvcp90.dll缺少怎么办?MSVCP90.dll文件丢失的修复方法》今天我想和大家分享的主题是关于在使用软件时遇到的一个问题——msvcp90.dll丢失,相信很多老师在使用电脑时... 在计算机使用过程中,可能会遇到 MSVCP90.dll 丢失的问题。MSVCP90.dll 是 Mic

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操