DLL的11种注入方法讲解.doc
文本预览下载声明
闲着没事整理了一下DLL的N种注入方法,对学习外挂的朋友,应该有用!第一种方法:利用 CreateRemoteThread 远程建立线程的方式注入DLL.首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的.function EnableDebugPriv : Boolean;var??hToken : THANDLE;??tp : TTokenPrivileges;??rl : Cardinal;begin??result := false;??//打开进程令牌环??OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);??//获得进程本地唯一ID??if LookupPrivilegeValue(nil, SeDebugPrivilege, tp.Privileges[0].Luid) then??begin? ? tp.PrivilegeCount := 1;? ? tp.Privileges[0].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
显示全部