远程线程注入

一丶远程线程注入的讲解

远程线程注入的原理,我会写一个远程线程开发的例子

我们总共需要几步

     /*1.查找窗口,获取窗口句柄*/

    /*2.根据窗口句柄,获得进程的PID*/

    /*3.根据进程的PID,获得进程的句柄*/

    /*4.根据进程的句柄,给进程申请额外内存空间*/

    /*5.调用WriteProcessMemory,给进程写入DLL的路径*/

    /*6.创建远程线程,执行我们的代码*/

    /*7.调用退出代码,释放远程线程的dll*/

每一步单独讲解

我们新建一个MFC 对话框程序,添加一个按钮,这个按钮专门响应注入的实现

第一步: 查找窗口,获得窗口句柄(采用WindowsAPI FindWindow,传入窗口名称,然后找到则返回对应的窗口句柄)

    HWND hWnd = FindWindow("","计算器");
    if(NULL == hWnd)
    {
        return;              //失败则返回
    }

第二步: 根据窗口句柄,查找进程PID (调用 GetWindowThreadProcessId API,传入窗口句柄,然后通过第二个参数把进程的PID给我们的参数)

  

  /*2.根据窗口句柄,获得进程的PID*/
    DWORD DwPid = 0;
    GetWindowThreadProcessId(hWnd,&DwPid); //这个函数会返回线程的ID,但是我们不关心,所以没有加返回值

第三步: 根据进程PID,返回进程的句柄(OpenProcess,参数一,权限 参数二,句柄是否继承,参数三,进程的pid)

 /*3.根据进程的PID,获得进程的句柄*/
    HANDLE hProHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,DwPid);  //参数一,选择所有权限,参数二,不继承给false,参数三,给我们上面获得的pid的值
    if(NULL == hProHandle)
    {
        return;
    }

第四步: 给远程进程申请空间,并且返回空间的首地址(调用的API 是VirtualAllocEx)

/*4.根据进程的句柄,给进程申请额外内存空间*/
    LPVOID lpAddr = VirtualAllocEx(hProHandle,NULL,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    if(NULL == lpAddr)
    {
        return ;
    }VirtualAllocEx说明:第一个参数: 进程的句柄第二个参数: 指定位置分配内存,给NULL为默认帮我们找块地方申请内存(不过这个地址会返回,所以不关心)第三个参数: 内存分配多大,我们给了4096个字节大小,也就是一个分页(1000H)第四个参数: 是否立即申请,还是保留这块内存,只能给我们用,但是还没申请,我们选择立即申请第五个参数: 权限,你申请的这块内存是什么内存,只能读,还是只能写,还是只能执行,我们选择全部,可读可写可执行

第五步:调用WriteProcessMemory将我们的Dll路径,写入到远程进程中

/*5.调用WriteProcessMemory,给进程写入DLL的路径*/
    char szBuf[MAX_PATH] = {NULL};
    GetCurrentDirectory(sizeof(szBuf),szBuf); //这三行代码主要是拼接我们的DLL,DLL是我们自己写的
    strcat(szBuf,"StaticDll.dll");       //DLL这里就不写了,用我的吧,我会发上去的
    BOOL bRet = WriteProcessMemory(hProHandle,lpAddr,szBuf,strlen(szBuf)+1,NULL);
    if(!bRet)
    {
        return;
    }WriteProcessMemory讲解:第一个参数: 进程的句柄,可以用我们上面的OpenProcess返回的第二个参数: 你要写入的地址,地址使我们VirtualAllocEx申请之后返回的(就是你要往哪个地址写内容)第三个参数: 你写入的内容是什么,写入的内容使我们的Dll路径,上面已经拼接好了第四个参数: 你写入的内容的大小是多大,这里我们用strlen求出来了第五个参数: 实际写入的个数,我们不关心,如果你想知道,则定义一个变量,然后 取地址传入即可,因为是个指针

第六步: 远程进程开辟线程,调用LoadLibrary,加载我们的dll,而你们知道,当dll被加载的时候,会有信息

所以我们在我们的dll里面写入我们自己的代码,比如这个dll被加载的时候,我们执行我们的代码,

这里我的代码就是找到计算器,然后给它加个菜单,并且响应消息

    HANDLE hThreadHandle = CreateRemoteThread(hProHandle,
        NULL,
        0,
        (LPTHREAD_START_ROUTINE)LoadLibrary,
        lpAddr,
        0,
        NULL);核心代码就在这里,我们必须要知道,我们现在加载我们的DLL,而我们的DLL被加载的时候,就要执行自己的代码所以这个时候就可以执行代码了CreateRemoteThread讲解:第一个参数: 进程的句柄(你要往哪个进程开辟线程)第二个参数: 安全属性,句柄可否继承,不需要给NULL第三个参数: 栈的大小,给0则默认第四个参数: 函数执行,我们要开辟线程,开辟的线程叫做loadLibrary第五个参数: 开辟线程传入的参数,我们知道,线程只有一个参数,而现在正好load也是一个参数,所以加载的参数就是我们的写入远程进程内存的dll路径,而dll路径一旦启动,则会执行自己的代码(核心,一定掌握)第六个参数: 创建的标志,默认给0第七个参数: 线程的ID,不需要知道,给NULL

我们尝试一下是否可以成功注入计算器,并且加入菜单

已经成功注入了.对于完整的代码,我会放到课堂资料中,但是这几步,一定要亲自手动弄明白

(备注: 我是使用VC++6.0编写代码,是MFC程序,当然你也可以用高版本,参考我这个,是一样的

对于DLL,我也会发,你们可以自己去写自己的DLL,比如一个空DLL会有DLL main,也就是dll的入口点

当第一次加载的时候会来信息什么的,所以可以在里面写代码.dll靠自己,这里只提供思路)

时间: 2024-10-01 07:42:22

远程线程注入的相关文章

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

需要本文代码请直接跳到文章最底部下载 注入进程的方法有很多,本文主要介绍通过远程线程来注入进程的方法: 我们知道,每个进程都有4GB的地址空间,windows可用的大小大概为1.5GB左右,远程线程注入的方法主要是,打开一个线程以后,将要注入的动态库的地址写入这个地址空间,然后调用开启远程线程的函数,来执行LoadLibraryA或者LoadLibraryW(其实不存在LoadLibrary这个函数,他只是一个宏,如果是UNICODE环境的话会调用LoadLibraryW,否则就是LoadLib

远程线程注入方法CreateRemoteThread

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

奇技淫巧之调试被远程线程注入的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

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

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

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

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

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

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

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)

注入 概述 DLL注入的初始动力源自于程序员对其他第三方应用程序进行功能扩展的愿望 注入方式有 注册表注入 ComRes注入 APC注入 消息钩子注入 远程线程注入 依赖可信进程注入 劫持进程创建注入 输入法注入 远程线程注入 //要加载的dll路径 WCHAR szDllPath[] = L"C:\\Users\\42140\\source\\repos\\34windows原理PE \\Debug\\16InjectDll.dll"; ? int main() { //1.要注入,