openprocess
getwindowthreadprocessid findwindow
getcurrentprocess 0xffffffff 伪句柄
duplicatehandle
writeprocessmemery
virtualprotectex
内存分页
跨进程使用句柄
获取进程句柄
OpenProcess : 打开现有的本地处理对象
HANDLE OpenProcess(
DWORD dwDesiredAccess, //访问权限
BOOL bInheritHandle, //是否允许子进程继承句柄
DWORD dwProcessId //要打开的进程程标识符
);
示例 :
HWND hWnd = ::FindWindow(NULL, "Test");
DWORD dwPid = 0;
GetWindowThreadProcessId(Hwnd, &dwPid);
HANDLE hProc = ::OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
dwPid
);
继承
子进程继承父进程已经打开的句柄
条件 :
句柄本身可以被继承
OpenProcess中的参数bInheritHandle设置为TRUE
CreateProcess中的继承参数bInheritHandle改为TRUE
BOOL CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes, //指向SECURITY_ATTRIBUTES结构的指点,该结构可确定返回到新过程对象的句柄是否可以由子过程继承。如果lp处理属性为空,则无法继承句柄。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
获取自己进程的句柄(伪句柄) : HANDLE GetCurrentProcess();
拷贝
通常用于跨权限操作
DuplicateHandle
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, //源进程句柄
HANDLE hSourceHandle, //被拷贝的句柄
HANDLE hTargetProcessHandle, //目标句柄
LPHANDLE lpTargetHandle, //传出参 : 拷贝后的值
DWORD dwDesiredAccess, //新句柄的访问权限
BOOL bInheritHandle, //拷贝后的句柄是否允许被继承
DWORD dwOptions //拷贝后的句柄权限
);
将伪句柄拷贝给自己时,拿到自己进程真正的句柄
进程间内存操作
WriteProcessMemory在指定的进程中将数据写入内存区域
BOOL WriteProcessMemory(
HANDLE hProcess, //要修改的过程内存的句柄
LPVOID lpBaseAddress, //地址
LPCVOID lpBuffer, //缓冲区
SIZE_T nSize, //缓冲区大小
SIZE_T *lpNumberOfBytesWritten //
);
VirtualProtectEx更改指定过程虚拟地址空间中已承诺页面区域的保护
BOOL VirtualProtectEx(
HANDLE hProcess, //进程句柄
LPVOID lpAddress, //地址
SIZE_T dwSize, //大小,修改时会影响内存分页
DWORD flNewProtect, //新的内存属性
PDWORD lpflOldProtect //传出参数 : 原来的内存属性
);
page : 内存分页,一个分页0x1000,系统管理内存的基本单位
ReadProcessMemory正在读取内存的过程的句柄
BOOL ReadProcessMemory(
HANDLE hProcess,
LPCVOID lpBaseAddress,
LPVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesRead
);
内存分页:权限问题