??xml version="1.0" encoding="utf-8" standalone="yes"?>久久青草免费,欧美一级在线视频,久久国产精品高清一区二区三区http://www.aygfsteel.com/Yipak/category/26801.html成功在于你是否努?希望在于你是否相信自? zh-cnMon, 25 Feb 2008 08:42:35 GMTMon, 25 Feb 2008 08:42:35 GMT60DLL 实践说明 (DllMain的?http://www.aygfsteel.com/Yipak/articles/182025.htmlȝȝMon, 25 Feb 2008 08:11:00 GMThttp://www.aygfsteel.com/Yipak/articles/182025.htmlhttp://www.aygfsteel.com/Yipak/comments/182025.htmlhttp://www.aygfsteel.com/Yipak/articles/182025.html#Feedback0http://www.aygfsteel.com/Yipak/comments/commentRss/182025.htmlhttp://www.aygfsteel.com/Yipak/services/trackbacks/182025.htmlDllMain的用:
DllMain函数是DLL模块的默认入口点。当Windows加蝲DLL模块时调用这一函数。系l首先调用全局对象的构造函敎ͼ然后调用全局函数 DLLMain。DLLMain函数不仅在将DLL链接加蝲到进E时被调用,在DLL模块与进E分LQ以及其它时候)也被调用。下面是一个框?DLLMain函数的例子?br />
如果我们在DllMain中写入下面的代码Q在原来的gandll.c中添加下面的代码Q:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);

    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            printf("Process attach. \n");
            break;

        case DLL_PROCESS_DETACH:
            printf("Process detach. \n");
            break;

        case DLL_THREAD_ATTACH:
            printf("Thread attach. \n");
            break;

        case DLL_THREAD_DETACH:
            printf("Thread detach. \n");
            break;
    }

    return (TRUE);
}

同时dlltest\dlltest.c修改为:
#include <stdio.h>
#include "dlltest.h"

int main(int argc, char **argv)
{
    printf("Simple DLL test start. \n");

    printf("Call DLL function: \n");
    printf("Test DLL values: %d \n", add2(1, 2));
    printf("Call DLL function end. \n");

    printf("Simple DLL test end. \n");

    return (0);
}

我简单的试一下输出结果ؓQ?br />C:\gandll\dlltest>dlltest
hModule.10000000 lpReserved.0012FD30
Process attach.
Simple DLL test start.
Call DLL function:
Test DLL values: 3
Call DLL function end.
Simple DLL test end.
hModule.10000000 lpReserved.00000001
Process detach.
也就是说DLL加蝲和应用程序退出的使用都会调用该函敎ͼDllMainQ的哦, 是应用程序一上来p用的Q不是用到该函数时才调用的!

好象有个问题Q?br />下面的话来源Q?a target="_blank">http://waiguai.blogdriver.com/waiguai/989918.html
采用隐式链接方式Q程序员在徏立一个DLL文gӞ链接E序会自动生成一个与之对应的LIB导入文g。该文g包含了每一个DLL导出函数的符号名和可选的标识P但是q不含有实际的代码。LIB文g作ؓDLL的替代文件被~译到应用程序项目中。当E序员通过静态链接方式编译生成应用程序时Q应用程序中的调用函CLIB文g中导出符L匚wQ这些符h标识可入到生成的EXE文g中。LIB文g中也包含了对应的DLL文g名(但不是完全的路径名)Q链接程序将其存储在EXE文g内部。当应用E序q行q程中需要加载DLL文gӞWindowsҎq些信息发现q加载DLLQ然后通过W号名或标识号实现对 DLL函数的动态链接?br />
我们看他说的“当应用E序q行q程中需要加载DLL文g时”, 我做的实验测试的是,在输?br />Simple DLL test start.
Call DLL function:
q两行应该是不需要DLL的啊Q?怎么应用E序在前面输ZQ?br />hModule.10000000 lpReserved.0012FD30
Process attach.
q个呢? q就说明其实应用E序一上来p用了DLL的(q有一U可能就是他是正的Q由于编译器优化的原因的该DLL一上来p调用了)?br />到地是ؓ什么? 再查Q再查。。。。。?

ȝ 2008-02-25 16:11 发表评论
]]>
HOOK专题http://www.aygfsteel.com/Yipak/articles/155571.htmlȝȝWed, 24 Oct 2007 05:31:00 GMThttp://www.aygfsteel.com/Yipak/articles/155571.htmlhttp://www.aygfsteel.com/Yipak/comments/155571.htmlhttp://www.aygfsteel.com/Yipak/articles/155571.html#Feedback0http://www.aygfsteel.com/Yipak/comments/commentRss/155571.htmlhttp://www.aygfsteel.com/Yipak/services/trackbacks/155571.htmlHOOK专题
目录
  • 基本概念
  • q行机制
  • 钩子cd
  • 作?/li>

基本概念
钩子(Hook)Q是Windows消息处理机制的一个^?应用E序可以在上面设|子E以监视指定H口的某U消息,而且所监视的窗口可以是其他q程所创徏的。当消息到达后,在目标窗口处理函C前处理它。钩子机制允许应用程序截获处理window消息或特定事件?/div>
钩子实际上是一个处理消息的E序D,通过pȝ调用Q把它挂入系l。每当特定的消息发出Q在没有到达目的H口前,钩子E序先捕获该消息,亦即钩子函数先得到控
制权。这旉子函数即可以加工处理Q改变)该消息,也可以不作处理而l传递该消息Q还可以强制l束消息的传递?/div>
q行机制
1、钩子链表和钩子子程Q?/div>
每一个Hook都有一个与之相兌的指针列表,UC为钩子链表,ql来l护。这个列表的指针指向指定的,应用E序定义的,被Hook子程调用的回调函敎ͼ也就是该钩子的各个处理子E。当与指定的Hookcd兌的消息发生时Q系l就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修Ҏ息,或者停止消息的前进Q避免这些消息传递到下一个Hook子程或者目的窗口。最q安装的钩子攑֜铄开始,而最早安装的钩子攑֜最后,也就是后加入的先获得控制权?/div>
Windows q不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸蝲QWindows 侉K攑օ占用的内存,q更新整个Hook链表。如果程序安装了钩子Q但是在未卸蝲钩子之前q束了Q那么系l会自动为它做卸载钩子的操作?/div>
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函敎ͼ只能定义为普通的C函数。用以监视系l或某一特定cd的事Ӟq些事g可以是与某一特定U程兌的,也可以是pȝ中所有线E的事g?/div>
钩子子程必须按照以下的语法:
LRESULT CALLBACK HookProc
(
 	int nCode, 
     	WPARAM wParam, 
     	LPARAM lParam
);
HookProc是应用程序定义的名字?/div>
nCode参数是Hook代码QHook子程使用q个参数来确定Q务。这个参数的g赖于HookcdQ每一UHook都有自己的Hook代码特征字符集?/div>
wParam和lParam参数的g赖于Hook代码Q但是它们的典型值是包含了关于发送或者接收消息的信息?/div>
2、钩子的安装与释放:
使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数L在Hook铄开头安装Hook子程。当指定cd的Hook监视的事件发生时Q系l就调用与这个Hook兌的Hook铄开头的Hook子程。每一个Hook链中的Hook子程都决定是否把q个事g传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数?/div>
HHOOK SetWindowsHookEx( 
     int idHook,      // 钩子的类型,卛_处理的消息类?
     HOOKPROC lpfn,   // 钩子子程的地址指针。如果dwThreadId参数?
			   // 或是一个由别的q程创徏的线E的标识Q?
			   // lpfn必须指向DLL中的钩子子程?
			   // 除此以外Qlpfn可以指向当前q程的一D钩子子E代码?
			   // 钩子函数的入口地址Q当钩子钩到M消息后便调用q个函数?
     HINSTANCE hMod,  // 应用E序实例的句柄。标识包含lpfn所指的子程?
DLL?
			   // 如果dwThreadId 标识当前q程创徏的一个线E,
			   // 而且子程代码位于当前q程QhMod必须为NULL?
			   // 可以很简单的讑֮其ؓ本应用程序的实例句柄?
     DWORD dwThreadId // 与安装的钩子子程相关联的U程的标识符?
			   // 如果?Q钩子子E与所有的U程兌Q即为全局钩子?
                 ); 
  函数成功则返回钩子子E的句柄Q失败返回NULL?/div>
  以上所说的钩子子程与线E相兌是指在一钩子链表中发l该U程的消息同时发送给钩子子程Q且被钩子子E先处理?/div>
在钩子子E中调用得到控制权的钩子函数在完成对消息的处理后Q如果想要该消息l箋传递,那么它必调用另外一个SDK中的API函数CallNextHookEx来传递它Q以执行钩子链表所指的下一个钩子子E。这个函数成功时q回钩子链中下一个钩子过E的q回|q回值的cd依赖于钩子的cd。这个函数的原型如下Q?/div>
LRESULT CallNextHookEx
			(
				HHOOK hhk;
				int nCode;
				WPARAM wParam;
				LPARAM lParam;
			 );
hhk为当前钩子的句柄Q由SetWindowsHookEx()函数q回?/div>
NCodeZl钩子过E的事g代码?/div>
wParam和lParam 分别是传l钩子子E的wParam|其具体含义与钩子cd有关?/div>
钩子函数也可以通过直接q回TRUE来丢弃该消息QƈL该消息的传递。否则的话,其他安装了钩子的应用E序不会接收到钩子的通知而且q有可能产生不正的l果?/div>
钩子在用完之后需要用UnHookWindowsHookEx()卸蝲Q否则会造成ȝ。释N子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:
UnHookWindowsHookEx
(
	HHOOK hhk;
);
函数成功q回TRUEQ否则返回FALSE?/div>
3、一些运行机Ӟ
在Win16环境中,DLL的全局数据Ҏ个蝲入它的进E来说都是相同的Q而在Win32环境中,情况却发生了变化QDLL函数中的代码所创徏的Q何对象(包括变量Q都归调用它的线E或q程所有。当q程在蝲入DLLӞ操作pȝ自动把DLL地址映射到该q程的私有空_也就是进E的虚拟地址I间Q而且也复制该DLL的全局数据的一份拷贝到该进E空间。也是说每个进E所拥有的相同的DLL的全局数据Q它们的名称相同Q但其值却q不一定是相同的,而且是互不干涉的?/div>
因此Q在Win32环境下要惛_多个q程中共享数据,必进行必要的讄。在讉K同一个Dll的各q程之间׃n存储器是通过存储器映文件技术实现的。也可以把这些需要共享的数据分离出来Q放|在一个独立的数据D里Qƈ把该D늚属性设|ؓ׃n。必ȝq些变量赋初|否则~译器会把没有赋初始值的变量攑֜一个叫未被初始化的数据D中?/div>
#pragma data_seg预处理指令用于设|共享数据段。例如:
#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()
?pragma data_seg("SharedDataName")?pragma data_seg()之间的所有变量将被访问该Dll的所有进E看到和׃n。再加上一条指?pragma comment(linker,"/section:.SharedDataName,rws"),那么q个数据节中的数据可以在所有DLL的实例之间共享。所有对q些数据的操作都针对同一个实例的Q而不是在每个q程的地址I间中都有一份?/div>
当进E隐式或昑ּ调用一个动态库里的函数Ӟpȝ都要把这个动态库映射到这个进E的虚拟地址I间?以下U?地址I间")。这使得DLL成ؓq程的一部分Q以q个q程的n份执行,使用q个q程的堆栈?/div>
4、系l钩子与U程钩子Q?/div>
SetWindowsHookEx()函数的最后一个参数决定了此钩子是pȝ钩子q是U程钩子?/div>
U程勑֭用于监视指定U程的事件消息。线E勾子一般在当前U程或者当前线E派生的U程内?/div>
pȝ勑֭监视pȝ中的所有线E的事g消息。因为系l勾子会影响pȝ中所有的应用E序Q所以勾子函数必L在独立的动态链接库(DLL) 中。系l自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进E的地址I间中,卛_q个DLL注入了那些进E?/div>
几点说明Q?/div>
Q?Q如果对于同一事gQ如鼠标消息Q既安装了线E勾子又安装了系l勾子,那么pȝ会自动先调用U程勑֭Q然后调用系l勾子?
Q?Q对同一事g消息可安装多个勾子处理过E,q些勑֭处理q程形成了勾子链。当前勾子处理结束后应把勑֭信息传递给下一个勾子函数?
Q?Q勾子特别是pȝ勑֭会消耗消息处理时_降低pȝ性能。只有在必要的时候才安装勑֭Q在使用完毕后要及时卸蝲?/div>
钩子cd
每一U类型的Hook可以使应用程序能够监视不同类型的pȝ消息处理机制。下面描q所有可以利用的Hookcd?/div>
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到H口q程的消息。系l在消息发送到接收H口q程之前调用WH_CALLWNDPROC Hook子程Qƈ且在H口q程处理完消息之后调用WH_CALLWNDPROCRET Hook子程?/div>
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCTl构Q再传递到Hook子程?/div>
CWPRETSTRUCTl构包含了来自处理消息的H口q程的返回|同样也包括了与这个消息关联的消息参数?/div>
2、WH_CBT Hook
在以下事件之前,pȝ都会调用WH_CBT Hook子程Q这些事件包括:
1. Ȁz,建立Q销毁,最化Q最大化Q移动,改变寸{窗口事Ӟ
2. 完成pȝ指oQ?/div>
3. 来自pȝ消息队列中的Ud鼠标Q键盘事Ӟ
4. 讄输入焦点事gQ?/div>
5. 同步pȝ消息队列事g?/div>
Hook子程的返回值确定系l是否允许或者防止这些操作中的一个?/div>
3、WH_DEBUG Hook
在系l调用系l中与其他Hook兌的Hook子程之前Q系l会调用WH_DEBUG Hook子程。你可以使用q个Hook来决定是否允许系l调用与其他Hook兌的Hook子程?/div>
4、WH_FOREGROUNDIDLE Hook
当应用程序的前台U程处于I闲状态时Q可以用WH_FOREGROUNDIDLE Hook执行低优先的Q务。当应用E序的前台线E大概要变成I闲状态时Q系l就会调用WH_FOREGROUNDIDLE Hook子程?/div>
5、WH_GETMESSAGE Hook
应用E序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数q回的消息。你可以使用WH_GETMESSAGE Hookȝ视鼠标和键盘输入Q以及其他发送到消息队列中的消息?/div>
6、WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到pȝ消息队列。可以用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连l的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装Q正常的鼠标和键盘事件就是无效的?/div>
WH_JOURNALPLAYBACK Hook是全局HookQ它不能象线E特定Hook一样用?/div>
WH_JOURNALPLAYBACK Hookq回时|q个值告诉系l在处理来自回放Hook当前消息之前需要等待多长时_毫秒Q。这׃Hook可以控制实时事g的回放?/div>
WH_JOURNALPLAYBACK是system-wide local hooksQ它們不會被注射CQ何行E位址I間?/div>
7、WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的Q可以用这个Hook记录q箋的鼠标和键盘事gQ然后通过使用WH_JOURNALPLAYBACK Hook来回放?/div>
WH_JOURNALRECORD Hook是全局HookQ它不能象线E特定Hook一样用?/div>
WH_JOURNALRECORD是system-wide local hooksQ它們不會被注射CQ何行E位址I間?/div>
8、WH_KEYBOARD Hook
在应用程序中QWH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息Q这些消息通过GetMessage or PeekMessage functionq回。可以用这个Hook来监视输入到消息队列中的键盘消息?/div>
9、WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL Hook监视输入到线E消息队列中的键盘消息?/div>
10、WH_MOUSE Hook
WH_MOUSE Hook监视从GetMessage 或?PeekMessage 函数q回的鼠标消息。用这个Hook监视输入到消息队列中的鼠标消息?/div>
11、WH_MOUSE_LL Hook
WH_MOUSE_LL Hook监视输入到线E消息队列中的鼠标消息?/div>
12、WH_MSGFILTER ?WH_SYSMSGFILTER Hooks
WH_MSGFILTER ?WH_SYSMSGFILTER Hooks使我们可以监视菜单,滚动条,消息框,对话框消息ƈ且发现用户用ALT+TAB or ALT+ESC l合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单Q滚动条Q消息框的消息,以及传递到通过安装了Hook子程的应用程序徏立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息?/div>
WH_MSGFILTER ?WH_SYSMSGFILTER Hooks使我们可以在模式循环期间qo消息Q这{h于在L息@环中qo消息?/div>
通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用q个函数Q应用程序能够在模式循环期间使用相同的代码去qo消息Q如同在L息@环里一栗?/div>
13、WH_SHELL Hook
外壳应用E序可以使用WH_SHELL HookL攉要的通知。当外壳应用E序是激zȝq且当顶层窗口徏立或者销毁时Q系l调用WH_SHELL Hook子程?/div>
WH_SHELL 共有Q钟情況Q?/div>
1. 只要有个top-level、unowned H口被生、v作用、或是被摧毁Q?/div>
2. 当Taskbar需要重L个按钮;
3. 当系l需要显C关于Taskbar的一个程序的最化形式Q?/div>
4. 当目前的键盘布局状态改变;
5. 当用者按Ctrl+EscL行Task ManagerQ或相同U别的程序)?/div>
按照惯例Q外壛_用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前Q应用程序必调用SystemParametersInfo function注册它自己?/div>

ȝ 2007-10-24 13:31 发表评论
]]> վ֩ģ壺 | | | ײ| | | | | Ӻ| | Ļ| | Ͽ| ɽ| ߴ| | Ϫ| Ϸ| Ԫı| ̩| ٹ| | | | ګ| Ͽ| | | | ɽʡ| | ޳| γ| | ڰ| | | | | | |