shell 编程,如何hook对目录的双击?

解决方案 »

  1.   

    没有测试过,猜测了一下:hook WH_CALLWNDPROC看看,当消息为WM_NOTIFY,通知消息为NM_DBLCLK时,调用GetModuleFileName查看下当前进程是否为Explorer.EXE,再用GetClassName查看类名是否为SysTreeView32。。
      

  2.   

    >> 是资源管理器的左边目录么?
    是的
      

  3.   

    〉〉hook WH_CALLWNDPROC看看
    点击资源管理器, 如何HOOK?
      

  4.   

    呵呵,hook文件夹双击的技术是当时我们小组攻关好几天才解决的,也属于比较难的技术了,网上并没有解决方案,我可以有偿提供。
      

  5.   

    楼上求源码
    要分的话我也开贴
    [email protected]
      

  6.   

    如果只是想追踪新进程的创建可以直接Hook  kernel32.dll的CreateProcessW
    如果必须要追踪双击可以Hook窗口过程。
    GetWindowLongW(窗口句柄,GWL_WNDPROC)返回的是窗口过程的地址。
    (资源管理器不能使用GetWindowLongA获取窗口过程)
    得到这个地址后Hook它,
    窗口过程的定义如下:
    typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
    第2个参数就可以判断是不是双击消息,或者还可以看下是不是感兴趣的控件消息
      

  7.   

    写1段类似如下的代码到被Hook的进程里:
    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                  ; 返回原来函数合适位置
      

  8.   

    在被Hook的函数头写入指令jmp到自己的代码里。
    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);
    }