000nico/process-proxy-hijacking

GitHub: 000nico/process-proxy-hijacking

进程内存读写注入工具

Stars: 8 | Forks: 0

# 进程代理 ## 概述 此项目将有效负载注入到进程中,以便它可以为我们读取和写入内存, 因此您可以在不打开或复制新句柄的情况下与内存进行工作。 ## 使用方法: - 使用 ```proxy::init(READ | WRITE, "Your target window", FALSE)``` 加载有效负载 - 使用 ```proxy::write(0x1234, 1337, sizeof(int))``` 和 ```proxy::read(0x1234, sizeof(float))``` 进行读取和写入 ## 工作流程
  1. 启用调试权限
  2. 查找已经具有目标句柄的进程
  3. 定位句柄在内存中的存储位置
  4. 在目标进程中分配内存
  5. 注入有效负载 + shellcode
  6. 与有效负载通信以读取/写入内存
### proxy::init

int proxy::init(ULONG accessMask, LPCSTR windowName, bool debug)

主入口点。执行完整链。

参数

  • accessMask: 我们正在寻找的权限
  • windowName: 句柄应指向的窗口
  • debug: true 或 false,取决于我们是否想看到程序正在做什么
返回值
  • 1 → 成功
  • 2 → 启用 SeDebugPrivilege 失败
  • 3 → 找不到具有句柄的进程
  • 4 → 找不到句柄地址
  • 5 → 分配内存失败
  • 6 → 注入有效负载失败
### proxy::enableSeDebugPrivilege

bool proxy::enableSeDebugPrivilege()

启用 SeDebugPrivilege 以允许与外部进程交互。



### proxy::findProcessWithHandle


int proxy::findProcessWithHandle(

    ULONG accessMask,

    LPCSTR windowName,

    DWORD* processPIDBuffer,

    HANDLE* duplicatedHandleBuffer,

    USHORT* originalHandleValue

)

查找已经具有目标窗口句柄的进程。

参数

  • accessMask: 设置您正在寻找的权限
  • windowName: "Counter - Strike 2"
  • processPIDBuffer: 指向将接收持有句柄的进程 PID 的 DWORD 的指针
  • duplicatedHandleBuffer: 指向将接收复制句柄的 HANDLE 的指针(可选)
  • originalHandleValue: 指向将接收原始句柄值的 USHORT 的指针
### proxy::findAddressWithHandle

int proxy::findAddressWithHandle(

    HANDLE handle,

    DWORD pid,

    uintptr_t* foundAtAddress,

    LPCSTR windowName

)

在进程内存中搜索以找到句柄的存储位置。

参数

  • handle: 我们正在寻找的句柄
  • pid: 我们正在搜索的进程的 PID
  • foundAtAddress: 指向将包含句柄存储地址的 uintptr_t 的指针
  • windowName: 句柄应指向的窗口
### proxy::prepareCodeInjection

int proxy::prepareCodeInjection(

    DWORD pid,

    LPVOID* rShellCodeBaseAddress,

    LPVOID* wShellCodeBaseAddress,

    LPVOID* rBufferBaseAddress,

    LPVOID* wBufferBaseAddress,

    LPVOID* structBaseAddress

)

在目标进程中分配内存。

参数

  • pid: 拥有句柄的目标进程的 PID
  • rShellCodeBaseAddress: 将接收读取 shellcode 分配的基地址的指针
  • wShellCodeBaseAddress: 将接收写入 shellcode 分配的基地址的指针
  • rBufferBaseAddress: 将接收读取值存储的基地址的指针
  • wBufferBaseAddress: 将接收要写入的值存储的基地址的指针
  • structBaseAddress: 将接收有效负载结构存储的基地址的指针
分配 ### payload::load

int payload::load(

    DWORD pid,

    uintptr_t readShellCodeBaseAddress,

    uintptr_t handleAddress,

    uintptr_t readBufferAddress,

    uintptr_t structBaseAddress

)

将有效负载注入到目标进程中。

参数

  • pid: 拥有句柄的目标进程的 PID
  • readShellCodeBaseAddress: shellcode 分配的地址
  • handleAddress: 存储所需句柄的进程的地址
  • readBufferAddress: 存储读取值的地址
  • structBaseAddress: 有效负载结构分配的地址
## 📝 备注
  • 使用未记录的 NT API(《NtQuerySystemInformation》)
  • 需要 SeDebugPrivilege
  • 假设目标窗口存在
## ⚠️ 警告
  • 不要用于您不拥有或没有分析权限的软件
标签:高性能