DLL注入

本周截至到2019.4.5号前,完成DLL注入简单学习

获取句柄权限


OpenProcess() API 获取PROCESS_ALL_ACCESS 权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
原型
OpenProcess(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ DWORD dwProcessId
);

Handle hprocess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);
```
BInHeritHandle 是 是否让子进程继承当前进程的句柄
dwPID是进程号
### 告知进程DLL路径
---
VirtualAllocEx() API 把即将要加载的DLL路径告知目标进程
```C
VirtualAllocEx(
_In_ HANDLE hProcess,
_In_opt_ LPVOID lpAddress,
_In_ SIZE_T dwSize,
_In_ DWORD flAllocationType,
_In_ DWORD flProtect
);

HANDLE 句柄
LPVOID 是一个没有类型的指针,也就是说你可以将LPVOID类型的变量赋值给任意类型的指针,比如在参数传递时就可以把任意类型传递给一个LPVOID类型为参数的方法,然后在方法内再将这个“任意类型”从传递时的“LPVOID类型”转换回来。
lpAddress是指定内存开始的地址。
dwSize是分配内存的大小。
flAllocationType是分配内存的类型。
flProtect是访问这块分配内存的权限

写入内存


WriteProcessMemory()API

1
2
3
4
5
6
7
WriteProcessMemory(
_In_ HANDLE hProcess,
_In_ LPVOID lpBaseAddress,
_In_reads_bytes_(nSize) LPVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_opt_ SIZE_T * lpNumberOfBytesWritten
);

WriteProcessMemory()
hProcess 进程 句柄
lpBaseAddress VitualAllocEx所得到的的缓冲区的地址(LPVOID)
lpBuffer 路径LPVOID
nSize 为长度的大小SIZE_T -unsigned int

获取LoadLibraryW()API的起始地址


在Windows Vista/7以后的版本中引入了ASLR,附上去除ASLR的工具。每次启动,系统DLL加载的地址都会改变,但是在系统的运行期间它都会被影射到每个进程的相同的地址意思是其它的应用程序使用相同的DLL时候,在内存中它的位置是一致的 么??直接使用该DLL???

1
2
HMODULE  hMod = GetModuleHandle("kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcessAddress(hMod,"LoadLibraryW");

hMod 载入模块的线性地址- 基地址+偏移
“LoadLibraryW” 函数名字

创建远程线程


CreateRemoteThread() API

1
2
3
4
5
6
7
8
9
10
11
HANDLE
WINAPI
CreateRemoteThread(
_In_ HANDLE hProcess,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);

hProcess 要注入的进程OpenProcess
lpThreadAttributes -> NULL
dwStackSize 0
lpStartAddress 另起线程的函数地址
lpParameter 另起线程的函数的参数地址
dwCreationFlags 0
lpThreadId NULL