《Windows Via C/C++》读书笔记之dll加载时刻

《Windows Via C/C++》读书笔记之dll加载时刻

一、静态加载

1、loader启动exe程序时,扫描exe的import section,加载DLL

2、exe程序退出时,卸载dll

dll加载与卸载由系统控制,生命期横贯进程。


二、动态加载

1、调用LoadLibrary()/LoadLibraryEx加载

2、FreeLibrary()卸载

dll加载卸载由程序员控制,在当前进程的生命期由Load开始,Free结束。


三、钩子DLL加载

1、调用SetWindowsHookEx()设置WH_GETMESSAGE消息钩子

2、调用UnhookWindowsHookEx()卸载消息钩子

 

 *** 调用SetWindowsHookEx()设置WH_GETMESSAGE消息钩子

Hooks的过程:

1、进程B的线程准备派送消息

2、system检查该线程是否安装了WH_GETMESSAGE钩子

3、system检查包含GetMsgProc()的DLL是否映射到了进程B的进程空间

4、如果DLL没有被映射,system加载该DLL,并增加进程B该DLL的引用计数(DLL引用计数是每个进程都维护一个)

5、system检查该DLL的hInstDll是否与进程B加载的一致,如果是则直接调用进程A地址空间上的GetMsgProc(),如果不是,则计算偏移,在进程B的地址空间调用GetMsgProc()

6、system增加进程B中该DLL的引用计数(增加的原因见后面描述)

7、system调用进程B地址空间的GetMsgProc()

8、GetMsgProc()返回后,system减小进程B中该DLL的引用计数

 

 *** 调用UnhookWindowsHookEx()卸载消息钩子

UnhookWindowsHookEx()会对已安装钩子进程中的DLL引用计数减一。当引用计数为0时,DLL会被自动卸载。

注意:在进入GetMsgProc()之前,DLL引用计数会加1,退出之后会减1。这样做的目的是避免内存访问异常。试想一下,在执行GetMsgProc()时,有其他线程调用了Unhook,如果在GetMsgProc()之前没有对引用计数加1,Unhook减小了引用计数,导致DLL卸载。这是GetMsgProc()就会访问已经unmap的内存,导致异常。

钩子DLL由程序员告诉系统某些信息,在系统派送消息时,DLL才被真正加载到当前进程,生命期才开始。

 

转载于:https://www.cnblogs.com/shokey520/p/3663900.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值