远程线程注入dll

// CommonInject.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <WinUser.h>
#include <WinDef.h>
#include <iostream>
#include <Tlhelp32.h>
using namespace std;

#include <Psapi.h>
#pragma  comment(lib,"Psapi.lib")
//通用dll 注入器

HANDLE GetProcessWithName(const std::wstring &proc_name){
	HANDLE hd = NULL;
	HANDLE hpross = NULL;
	int retls = 0;
	PROCESSENTRY32 pinfo = {0};
	wchar_t szFileName[MAX_PATH] = {0};

	hpross = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if(INVALID_HANDLE_VALUE == hpross)
	{
		return hd;
	}

	HANDLE hToken;
	if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
	{
		LUID luid;
		if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
		{
			TOKEN_PRIVILEGES TokenPrivileges;
			TokenPrivileges.PrivilegeCount = 1;
			TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
			TokenPrivileges.Privileges[0].Luid = luid;
			AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
		}
		CloseHandle(hToken);
	}  

	pinfo.dwSize = sizeof(PROCESSENTRY32);
	retls = Process32First(hpross,&pinfo);
	while(retls)
	{
		swprintf_s(szFileName,_countof(szFileName)-1,L"%s",pinfo.szExeFile);
		if (0 == _wcsicmp(szFileName,proc_name.c_str()))
		{
			hd = OpenProcess(PROCESS_ALL_ACCESS ,TRUE,pinfo.th32ProcessID);
		}
		if(!Process32Next(hpross, &pinfo))
		{
			break;
		}
	}
	CloseHandle(hpross);
	hpross = NULL;
	return hd;
}

//提权操作
BOOL EnablePrivilege(LPWSTR name)
{
	HANDLE hToken;
	BOOL rv;
	TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};
	LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
	AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);
	rv = GetLastError() == ERROR_SUCCESS;
	CloseHandle(hToken);
	return rv;
}  

int inject(){

	if (0 == EnablePrivilege(SE_DEBUG_NAME))
		return 0;  

	 DWORD dwPID;
	PWSTR libFileRemote=NULL;
	HANDLE hThread=NULL;
	HANDLE handle=NULL;

	__try{
		int processid;
		cout<<"输入要注入的进程id:"<<endl;
		cin>>processid;

		handle=GetProcessWithName(L"FileMD5.exe");
	//	handle=OpenProcess(PROCESS_ALL_ACCESS,TRUE, processid);
		if(NULL==handle){
			cout<<"进程打开失败"<<endl;
			return -1;
		}

		std::string dllname="E:\\C++Code\\windows\\Dll\\myDll\\Debug\\myDll.dll";
		libFileRemote=(PWSTR)VirtualAllocEx(handle,NULL,dllname.size(),MEM_COMMIT,PAGE_READWRITE);
		if(libFileRemote==NULL){
			cout<<"申请远程进程空间失败"<<::GetLastError()<<endl;
			return -1;
		}

		BOOL RET=WriteProcessMemory(handle,libFileRemote,dllname.c_str(),dllname.size(),NULL);
		if(RET ==FALSE){
			cout<<"远程进程数据写入失败"<<endl;
		}
		PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
			GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");

		hThread = CreateRemoteThread(handle, NULL, 0,
			pfnThreadRtn, libFileRemote, 0, NULL);

		if(hThread==NULL){
			cout<<"远程线程创建失败";
		}
		WaitForSingleObject(hThread, INFINITE);

		cout<<"注入完成";
	}
	__finally{
		if (libFileRemote != NULL)
			VirtualFreeEx(handle, libFileRemote, 0, MEM_RELEASE);

		if (hThread  != NULL)
			CloseHandle(hThread);

		if (handle != NULL)
			CloseHandle(handle);

		cout<<"完成释放";

	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	inject();
	system("pause");
	return 0;
}

vs2010 编译通过,unicode编码

通过输入进程id或者,通过修改进程名,来选择目标进程

远程线程注入dll

时间: 2024-08-25 16:42:53

远程线程注入dll的相关文章

【windows核心编程】使用远程线程注入DLL

前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下:  相关API 1.创建远程线程 //该函数除了第一个参数为目标进程句柄外 //其他参数均和CreateThread一样 HANDLE hThread = CreateRemoteThread( __in HANDLE hProcess, //目标进程句柄 __in_opt LPSECURITY_A

详细解读:远程线程注入DLL到PC版微信

一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以将DLL文件加载到自身进程中. 2.这样,就可以用 CreateRemoteThread() 函数创建一个远程线程,让目标进程调用LoadLibrary() 来加载我们自己写的DLL .CreateRemoteThread() 有这几个参数比较关键:A:想要注入的进程的句柄,这里可以通过OpenPr

CreateRemoteThread远程线程注入Dll与Hook

CreateRemoteThread虽然很容易被检测到,但是在有些场合还是挺有用的.每次想用的时候总想着去找以前的代码,现在在这里记录一下. CreateRemoteThread远程注入 DWORD dwOffect,dwArgu; BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId ,DWORD dwOffect,DWORD dwArgu) { HANDLE hToken; if ( OpenP

远程创建线程注入DLL

HANDLE WINAPI 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);hProce

注入 - 远线程注入DLL到目标进程

// // 函数 -- void InjectDLL(LPCTSTR) // // 功能 -- 注入DLL到指定窗口 // // @param -- 要注入的DLL全路径 // // 返回值 -- 无 // void InjectDLL(LPCTSTR lpDLLFullPath) { DWORD dwPID = 0; // 目标进程PID HANDLE hGameProcess = NULL; // 目标进程句柄 LPDWORD lpdwAddr = NULL; // 远程申请的内存空间地址

远程线程注入遇到的问题

前因: 远程线程注入dll的时候debug版的dll注入不成功,release版的dll成功,经过在网上查阅,最后在windows黑客编程技术详解里找到了解决办法 解决办法: VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd) Debug模式选择"MTD",Release选择"MT"(我之前是MD也成功了) MFC的使用”选项中设置“在静态库中使用M

[转载]Dll注入技术之远程线程注入

转自:黑客反病毒 DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLi

奇技淫巧之调试被远程线程注入的DLL

远程线程注入, 这东西大家都懂的, 一般都被大家用来干些小小的坏事情,比如API Hook~~将DLL注入到其它进程并不是难事,问题是这个被注入的DLL不太好调试,调试DLL本来就是个比较头疼的问题,更何况是这种运行在其它进程空间的DLL, 被注入DLL的程序,不崩溃还好,崩溃了,要定位崩溃点,真是够麻烦的. 这几天,无意中发现了一个可以调试这种DLL的方法. 首先,需要准备两样东西: 1.微软的Detours库, 下载地址戳这里: 下载链接 2.打开Detours安装目录下的samples\s

安全之路 —— 无DLL文件实现远程线程注入

简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着实是怪麻烦的,那么有没有什么方法能够不适用.dll文件实现注入呢? 答案是有的,我们可以直接将功能写在线程函数中,然后直接将整个函数注入,这个方法相较之于DLL注入会稍微复杂一些,适用于对一些体积比较小的程序进行注入.但是要注意动态链接库的地址重定位问题,因为正常的文件一般会默认载入kernel32.dll文件,而