0

Dll 注入封装

发表者:wenzhou1219分类:接口2017-07-05 13:39:45 阅读[194]

分为三个工程

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两份。


源代码下载链接


名字:

个人主页地址:

E-mail:

评论列表