想干点坏事,想调整别的进程行为和界面,想获取别的进程内部信息都离不开Dll注入,这里封装两种常见的SetWindowHookEx和CreateRemoteThread方式的Hook 注入,只需要在指定地方填入干活代码即可。

接口说明

分为三个工程
HookApp ——调用注入的进程exe
HookDll ——SetWindowHookEx方式注入
HookDll2——CreateRemoteThread方式注入

BOOL _stdcall InstallHook(DWORD dwThreadId)
{
    return CInstallHook::GetInstance()->Install(dwThreadId);
}

BOOL _stdcall UnInstallHook()
{
    return CInstallHook::GetInstance()->UnInstall();
}

使用说明

导出的接口基本一致如下
InstallHook ——安装Hook
分别传入待Hook的线程Id和进程Id即可完成Hook。
Hook成功会调用CFilterMgr::Init,在这里干活即可,如子类化窗口,遍历进程窗口ListView控件信息等等。
注意CreateRemoteThread方式注入虽然灵活,但是在DllMain中调用CFilterMgr::Init,此时如果Hook实际过早可能user32,shell32等模块没有加载导致使用相关函数错误,在这里使用LoadLibrary可能出现序列化加载死锁的问题。能想到最好的方式就是开线程或延时一段时间再干活。

UnInstallHook ——卸载Hook
注意使用SetWindowHookEx注入的时候,一旦调用SetWindowHookEx的主进程或主线程退出,它所Hook的dll会自动从目标进程摘除。如果需要保持Dll常驻在目标进程,可采用如下两种方法:
1.可以在CFilterMgr::Init中LoadLibrary下,但是这会造成Dll无法卸载
2.使用代理exe常驻,隐藏后台运行

注意

目标进程是32则调用Hook的进程和dll必须是32位。
目标进程是64则调用Hook的进程和dll必须是64位。
如果要保持多平台兼容,需要一套代码编译32/64两份。

下载

源码下载链接