zaixialongaotian

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
);

内存分页:权限问题

分类:

技术点:

相关文章: