shell 编程,如何hook对目录的双击?
解决方案 »
- 如何能够得到要显示的图片的相关数据?
- SetTimer的问题
- ANSI 转 Unicode 后程序编译成功,运行就自动退出
- 怎样在CHtmlView中实现菜单->编码->自动选择功能?
- 请问哪有介绍directshow的基础书籍(电子版)?
- 程序员》杂志第8期,“永不停息的程序”介绍的书《Programming Server-side Applications for Windows2000》,哪里能买到?
- 关于消息的简单问题
- 如何使用一个控制台程序来结束另一个控制台程序?
- delete []array时系统怎么知道该释放多少内存?
- 请问高手 怎么实现一个char changx[];这样的数组,要求程序在运行时changx会变为chang1,chang2,chang3..........
- ActiveX怎么捕获IE菜单的另存为
- 关于CAB包中的文件执行
是的
点击资源管理器, 如何HOOK?
要分的话我也开贴
[email protected]
如果必须要追踪双击可以Hook窗口过程。
GetWindowLongW(窗口句柄,GWL_WNDPROC)返回的是窗口过程的地址。
(资源管理器不能使用GetWindowLongA获取窗口过程)
得到这个地址后Hook它,
窗口过程的定义如下:
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
第2个参数就可以判断是不是双击消息,或者还可以看下是不是感兴趣的控件消息
00CE0000 60 pushad ; esp减小0x20,本来第一个参数是[esp+4],执行后就是[esp+24]
00CE0001 8BEC mov ebp, esp
00CE0003 57 push edi ; 执行后第一个参数为[esp+28]
00CE0004 56 push esi ; 执行后第一个参数为[esp+2C]
00CE0005 52 push edx ; 执行后第一个参数为[esp+30]
00CE0006 51 push ecx ; 执行后第一个参数为[esp+34]
00CE0007 53 push ebx ; 执行后第一个参数为[esp+38]
00CE0008 50 push eax ; 执行后第一个参数为[esp+3C]
00CE0009 8D4424 3C lea eax, dword ptr [esp+3C] ; 获取第一个参数的地址
00CE000D 50 push eax ; 第一个参数的地址进栈
00CE000E E8 00000000 call 00CE0013 ; 调用Hook处理函数
00CE0013 8BE5 mov esp, ebp
00CE0015 61 popad
00CE0016 90 nop ; 留32(0x20)个字节用来写入原Hook位置被覆盖的代码
00CE0017 90 nop
00CE0018 90 nop
00CE0019 90 nop
00CE001A 90 nop
00CE001B 90 nop
00CE001C 90 nop
00CE001D 90 nop
00CE001E 90 nop
00CE001F 90 nop
00CE0020 90 nop
00CE0021 90 nop
00CE0022 90 nop
00CE0023 90 nop
00CE0024 90 nop
00CE0025 90 nop
00CE0026 90 nop
00CE0027 90 nop
00CE0028 90 nop
00CE0029 90 nop
00CE002A 90 nop
00CE002B 90 nop
00CE002C 90 nop
00CE002D 90 nop
00CE002E 90 nop
00CE002F 90 nop
00CE0030 90 nop
00CE0031 90 nop
00CE0032 90 nop
00CE0033 90 nop
00CE0034 90 nop
00CE0035 90 nop
00CE0036 E9 C5FF31FF jmp 00000000 ; 返回原来函数合适位置
jmp指令、CALL指令的机器码生成可以参考如下函数:void MakeJmp(DWORD addr1,DWORD addr2,BYTE* buff) //在buff中生成处于 位置addr1的汇编语言:“jmp addr2”的机器码。
{
buff[0]=0xE9;
*(DWORD*)(&(buff[1]))=addr2-(addr1+5);
}void MakeCall(DWORD addr1,DWORD addr2,BYTE* buff) //在buff中生成处于 位置addr1的汇编语言:“call addr2”的机器码。
{
buff[0]=0xE8;
*(DWORD*)(&(buff[1]))=addr2-(addr1+5);
}