实战DELPHI:远程线程插入(DLL注入)
http://www.jx19.com/xxzl/Delphi/2010/04/17/ShiZhanDELPHI_YuanChengXianChengChaRu_DLLZhuRu/
远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL.
首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的.
].Luid) ;
tp.Privileges[].Attributes := SE_PRIVILEGE_ENABLED;
//调整权限
Result := AdjustTokenPrivileges(hToken, false, tp, SizeOf(tp), nil, rl);
end;
end;
关于 OpenProcessToken() 和 AdjustTokenPrivileges() 两个 API 的简单介绍:
OpenProcessToken():获得进程访问令牌的句柄.
function OpenProcessToken(
ProcessHandle: THandle; //要修改访问权限的进程句柄
DesiredAccess: DWORD; //指定你要进行的操作类型
var TokenHandle: THandle//返回的访问令牌指针
): BOOL;
AdjustTokenPrivileges() :调整进程的权限.
function AdjustTokenPrivileges(
TokenHandle: THandle; // 访问令牌的句柄
DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限
const NewState: TTokenPrivileges;
{ 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,
数据组的每个项指明了权限的类型和要进行的操作; }
BufferLength: DWORD;
//结构PreviousState的长度,如果PreviousState为空,该参数应为 0
var PreviousState: TTokenPrivileges;
// 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息
var ReturnLength: DWORD //实际PreviousState结构返回的大小
) : BOOL;
远程注入DLL其实是通过 CreateRemoteThread 建立一个远程线程调用 LoadLibrary 函数来加载我们指定的DLL,可是如何能让远程线程知道我要加载DLL呢,要知道在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。所我们需要在远程进程的内存空间里申请一块内存空间,写入我们的需要注入的 DLL 的路径. 需要用到的 API 函数有:
OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN
function OpenProcess(
dwDesiredAccess: DWORD; // 希望获得的访问权限
bInheritHandle: BOOL; // 指明是否希望所获得的句柄可以继承
dwProcessId: DWORD // 要访问的进程ID
): THandle;
VirtualAllocEx():用于在目标进程内存空间中申请内存空间以写入DLL的文件名
function VirtualAllocEx(
hProcess: THandle; // 申请内存所在的进程句柄
lpAddress: Pointer; // 保留页面的内存地址;一般用nil自动分配
dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
flAllocationType: DWORD;
flProtect: DWORD
): Pointer;
WriteProcessMemory():往申请到的空间中写入DLL的文件名
function WriteProcessMemory(
hProcess: THandle; //要写入内存数据的目标进程句柄
const lpBaseAddress: Pointer; //要写入的目标进程的内存指针, 需以 VirtualAllocEx() 来申请
lpBuffer: Pointer; //要写入的数据
nSize: DWORD; //写入数据的大小
var lpNumberOfBytesWritten: DWORD //实际写入的大小
): BOOL;
然后就可以调用 CreateRemoteThread 建立远程线程调用 LoadLibrary 函数来加载我们指定的DLL.
CreateRemoteThread() //在一个远程进程中建立线程
function CreateRemoteThread(
hProcess: THandle; //远程进程的句柄
lpThreadAttributes: Pointer; //线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize: DWORD; //线程栈大小,以字节表示
lpStartAddress: TFNThreadStartRoutine;
// 一个TFNThreadStartRoutine类型的指针,指向在远程进程中执行的函数地址
lpParameter: Pointer; //传入参数的指针
dwCreationFlags: DWORD; //创建线程的其它标志
var lpThreadId: DWORD //线程身份标志,如果为0, 则不返回
): THandle;
整个远程注入DLL的具体实现代码如下:
+ );
+ );
+ lstrlenW(pszLibAFilename)) * SizeOf(WCHAR);
;
, pfnStartAddr, pszLibFileRemote, , lpThreadId);
) then
Result := true;
// 释放句柄
CloseHandle(hRemoteThread);
end;
end;
finally
// 释放句柄
CloseHandle(hRemoteProcess);
end;
end;
end;
接下来要说的是如何卸载注入目标进程中的DLL,其实原理和注入DLL是完全相同的,只是远程调用调用的函数不同而已,这里要调用的是FreeLibrary,代码如下:
+ );
+ );
+ lstrlenW(pszLibAFilename)) * SizeOf(WCHAR);
, pfnStartAddr, pszLibFileRemote, , lpThreadId);
, pfnStartAddr, Pointer(dwHandle), , lpThreadId);
, MEM_DECOMMIT);
// 释放句柄
CloseHandle(hRemoteThread);
end;
end;
finally
// 释放句柄
CloseHandle(hRemoteProcess);
end;
end;
end;
注意:例程里注入的DLL为例程目录下的DLL.dll,由DLL.dpr编译而来
实战DELPHI:远程线程插入(DLL注入)的更多相关文章
- mfc HackerTools远程线程注入
在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...
- 【Reverse】DLL注入
DLL注入就是将dll粘贴到指定的进程空间中,通过dll状态触发目标事件 DLL注入的大概流程 https://uploader.shimo.im/f/CXFwwkEH6FPM0rtT.png!thu ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 系统权限远程线程注入到Explorer.exe
目录 提升为系统权限,注入到explorer中 一丶简介 二丶注入效果图 提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了 ...
- 远程线程注入突破SESSION 0
远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...
- [转]Dll注入经典方法完整版
Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在 ...
- C++学习之DLL注入
#include<stdio.h> #include<Windows.h> #include<TlHelp32.h> //typedef unsigned long ...
- Dll注入经典方法完整版
总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...
- CreateRemoteThread远程线程注入Dll与Hook
CreateRemoteThread虽然很容易被检测到,但是在有些场合还是挺有用的.每次想用的时候总想着去找以前的代码,现在在这里记录一下. CreateRemoteThread远程注入 DWORD ...
随机推荐
- sicily 1193. Up the Stairs
Time Limit: 1sec Memory Limit:32MB Description John is moving to the penthouse of a tall sky-scr ...
- Ubuntu vi 上下左右变ABCD问题解决方法
---恢复内容开始--- 错误问题:vi上下左右键显示为ABCD的问题 解决方法: 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题. 一.执行命令 sudo apt-g ...
- 半小时分组统计个数sql
group by 最后一个时间是多少按多少分组 select count(1), trunc(a.refund_insert_time, 'hh24') + case when to_char(ref ...
- Effective STL 阅读笔记: Item 3: Make copying cheap and correct for objects in containers
容器 (Containers) 用来存储对象 (Objects), 但是被存储的对象却并非原原本本是你给他的那一个, 而是你指定对象的一个拷贝.而后续对该容器内存储对象的操作,大多也是基于拷贝的. 拷 ...
- 【hdoj_1133】Buy the Ticket(卡特兰数+大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1133 题目的意思是,m个人只有50元钱,n个人只有100元整钱,票价50元/人.现在售票厅没钱,只有50元 ...
- NIO-2通道(Channel)
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- C++构造函数详解(复制构造函数)
构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 class Compl ...
- 使用360对app安全进行加固
在写了第一个app之后,打算上架到各个渠道看看,无意间看到了360的app加固工具 http://jiagu.360.cn/ 自己体验了一把,加固过程很傻瓜化, 加固好了之后,还要对app进行二次签名 ...
- python的多线程threading
多线程threading 1.Thread创建线程: 上代码: #!/usr/bin/env python3 import threading import time def A(): t_name ...
- SQLyog-12.0.9-0.x64
SQLyog-12.0.9-0.x64 下载地址 链接:https://pan.baidu.com/s/1AjC2rdx8Bgtns1sYmN5NEw 提取码:icko 注册码: 姓名(Name):c ...