各位高人:
    小弟遇见这样的问题:
    我做了一个dll,此dll是有钩子函数的,可以来记录键盘的输入,然后我通过CreateRemoteThread,WriteProcessMemory的远程注入的方式将此dll注入远程进程,由于有钩子,所以在dll的DLL_PROCESS_ATTACH下用了_beginthread函数来新开一个线程来挂载钩子(不开新线程的话,可能会有问题,我试过),结果是可以正常记录目标进程的输入的,可是在卸载dll的时候遇到了问题.
    本来,如果没有钩子,通过CreateRemoteThread方式调用FreeLibrary是可以卸载加载的dll模块的,可是我发现在有开线程挂钩子之后,那样就卸载不了了,而且DLL_THREAD_DETACH也会被调用,影响到DLL_PROCESS_DETACH的调用,现在我的问题就是,对于这样的钩子,到底该如何卸载,是要先unhook钩子吗,还是要先关线程,如果要关,是在DLL_THREAD_DETACH里还是在DLL_PROCESS_DETACH中调用呢?
   烦请高人解答....

解决方案 »

  1.   

    DLL_PROCESS_ATTACH中最好不要干什么特殊的事,如调用其他API函数
    你要初始化或者执行清理,可以定义类及全局对象,在构造函数中初始化,在析构函数中清理
      

  2.   

    对你的问题没有理解清楚,看起来你是用SetWindowsHookEx来监视键盘事件的,既然是这样就不需要再WriteProcessMemory和CreateRemoteThread了,只要SetWindowsHookEx的最后参数给0,会Hook当前桌面的所有线程,也不需要另开一个线程,卸载时只需要执行UnhookWindowsHookEx就可以了。
      

  3.   

    不明白为什么还要启动一个线程来挂载钩子,实在不行你这样,在dll里面导出一个函数,然后在这个函数里面去卸载钩子,卸载的时候调用这个导出函数
      

  4.   

    Dll会被目标进程下的所有线程按照顺序依次加载,在DLL_PROCESS_ATTACH下开个新线程,新线程没有办法在其他线程调用DllMain之前顺利初始化。
      

  5.   

    如果你没用_beginthreadex,你可以试试,不带ex版有bug,你可能无法等待线程结束。对了,你新开的线程关了没有?
      

  6.   

    应该不需要新开一个线程来挂载钩子,如果你非要这样,可以试试通过CreateRemoteThread方式调用UnhookWindowsHookEx,然后再freelibrary
      

  7.   

    UnhookWindowsHookEx,后不一定马上能FreeLibrary,因为其实你卸载了,但是可能还有一些消息在处理。
      

  8.   

    其实用SetWindowHookEx就已经把目标dll注入进程了,不知道你还CreateRemoteThread干嘛
      

  9.   

    肯定要关掉线程,释放所有DLL占用的资源,你那个线程本来就在DLL的地址空间运行的,你说能FreeLibrary吗?先把该清理的都清理吧.
      

  10.   

    问题已解决,关掉线程,dll就可以卸了