windows下 远程DLL注入

来源:互联网 发布:新纪元软件官网 编辑:程序博客网 时间:2024/05/29 08:41

windows下 远程DLL注入

第一步:

遍历所有进程,找到目标进程,获取该进程的ID。(完整code见本文链接)

核心函数:CreateToolhelp32Snapshot

CreateToolhelp32Snapshot函数为指定的进程、

进程使用的堆[HEAP]、模块[MODULE]线程[THREAD]建立一个快照[snapshot]
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //
用来指定
快照中需要返回的对象,可以是TH32CS_SNAPPROCESS
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,

//当获取系统进程列表或获取当前进程快照时可以设为0
);

dwFlags
[
输入]指定快照中包含的系统内容,这个参数能够使用下列数值(
常量)中的一个或多个。
TH32CS_INHERIT - 声明快照句柄是可继承的。
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。

注意:需要使用PROCESSENTRY32结构体,以及Process32FirstProcess32Next遍历。

 

第二步:

修改调用进程的权限(XP下为调试权限)

核心函数:OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges

//打开进程令牌环

BOOL OpenProcessToken(
__in HANDLE ProcessHandle,//要修改访问权限的进程句柄
__in DWORD DesiredAccess,//指定你要进行的操作类型
__out PHANDLE TokenHandle//返回的访问令牌指针
);
 
//获得本地进程name所代表的权限类型的局部唯一ID
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,//表示所要查看的系统,本地系统直接用NULL
LPCTSTR lpName,//指向一个以零结尾的字符串,指定特权的名称
PLUID lpLuid//用来接收所返回的制定特权名称的信息
);
 
//调整进程权限
BOOL AdjustTokenPrivileges(
HANDLETokenHandle,//包含特权的句柄
BOOLDisableAllPrivileges,//禁用所有权限标志
PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)
DWORDBufferLength,//缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
PTOKEN_PRIVILEGESPreviousState,//接收被改变特权当前状态的Buffer
PDWORDReturnLength//接收PreviousState缓存区要求的大小
);
 

第三步:

打开进程

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
 

第四步:

向远程进程空间中写入DLL路径字符串

注意:DLL路径必须是全路径

使用函数如下:

VirtualAllocExWriteProcessMemory

 

第五步:

创建远程线程

HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,//线程所属进程的进程句柄
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,//为NULL即可
__in SIZE_T dwStackSize,//0,代表默认的栈大小
__in LPTHREAD_START_ROUTINE lpStartAddress,//远程进程中LoadLibrary()的地址
__in LPVOID lpParameter,//远程进程中分配内存
__in DWORD dwCreationFlags,//线程的创建标志.0:线程创建后立即运行
__out LPDWORD lpThreadId//指向所创建线程的ID
);
 

第六步:

 释放远程进程中的内存以及关闭进程句柄

VirtualFreeExCloseHandle(m_hRemoProc)

 

http://download.csdn.net/detail/fly_sky010/8272169

 

 

 
 
 
0 0