Windows Hook经验总结之二:API Hook实践

本文通过CopyFile API为例,详细阐述Windows DLL注入实现API Hook的过程,包括DLL注入器的创建、寻找目标进程PID、执行注入、待注入DLL的设计,以及主程序的调用。DLL注入器核心功能实现,包括提升权限、注入DLL到目标进程,并在目标进程中执行自定义API,以实现系统API的替换或拦截。
摘要由CSDN通过智能技术生成

前一篇介绍了API Hook的几种方法,本文则直接以CopyFile为例采用DLL注入的方法来展示编码流程。
一个完整的HOOK过程包括四个部分:
1)待注入的DLL
2)DLL注入器
3)目标进程
4)主程序

DLL注入器的实现

注入器需要实现的功能就是将用户DLL注入到目标进程中。可设计为一个独立DLL,方便复用。DLL可规划两个接口,类似内存分配的malloc/free的配对使用。接口如下:

BOOL    WINAPI  Inject(LPCTSTR lpszUsrApiDLL, LPCTSTR lpszHookProcess);
BOOL    WINAPI  Eject(LPCTSTR lpszUsrApiDLL, LPCTSTR lpszHookProcess);

具体实现上代码:

寻找目标进程PID

采用CreateToolhelp32SnapshotProcess32FirstProcess32NextModule32FirstModule32Next
一系列函数即可获得进程列表及模块列表。不是本文重点,就不上代码了。

执行注入

直接上代码

/* 注入,将dll注入到指定进程中,只给出核心代码 */
int     InjectLib(DWORD dwProcessId, LPCTSTR lpszLib)
{
    PTHREAD_START_ROUTINE pfnRemote =(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");

    /*打开目标进程*/  
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

    /*在目标进程上分配可读写空间*/
    int nMemSize =strlen(lpszLib) + 1;
    void *pRemoteMem = VirtualAllocEx(hProcess, NULL, nMemSize, MEM_COMMIT, PAGE_READWRITE);

    /*写目标进程,将用户DLL加入目标进程空间(未加载)*/
    int ret = WriteProcessMemory(hProcess, pRemoteMem, (void*)lpszLib, nMemSize, NULL); 

    /*在目标进程中建立远线程*/
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pfnRemote, pRemoteMem, 0, NULL); 

    /*目标进程中执行LoadLibrary即将用户DLL真正加载起来生效*/
    WaitForSingleObject(hThread, INFINITE); 
    VirtualFreeEx(hProcess, pRemoteMem, 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值