本人初学hookapi,问题多多,请指教。 
问题1:《windows核心编程》中介绍了修改输入节来替换函数,我想问的是在1个线程中调用了installhook(注:我写的函数,修改输入节),整个进程的该函数是不是都替换了? 
问题2:如果问题1的答案是肯定的,那么下面的代码(伪代码)怎么解释(installhook 中用MyTextOutA替换了TextOutA): 
        
Button1单击事件: onButton1() 
              { 
                installhook(currentThreadID); 
              } 
Button1单击事件:onButton2() 
              { 
                  TextOutA();//按下Button1后,这里能跳转到MyTextOutA,也就是说真正替换了 
                             } 替换函数的实现: MyTextOutA() 
                            { 
                  MessageBox(); 
                                    TextOutA();//但是在这里,为什么调用的是未修改的函数? 
                             } 
谢谢大家帮忙!

解决方案 »

  1.   

    要注意的是:如果是全局HOOK,则必须写在DLL中,将想办法将该DLL注入其他进程。
      

  2.   

    1、确认你的代码改写IAT表成功。
    2、如果是不同程序,必须修改目标进程的IAT表。
    3、如果上述情况没有出现,可以单步调试代码查看具体原因。
      

  3.   

      我认为你伪代码写错了 如果TextOutA是一个导入函数,
      你HOOK这个API 修改了本DLL符号表中TextOutA的地址 定向到MyTextOutA  
      如果MyTextOutA也在这个DLL中 你想调用原来TextOutA
    应用GetProcAddress来得到真实地址来调用.
      如我说的不对,请指正..
      

  4.   

    我没有在DLL中导入TextOutA,TextOutA在GDI32.dll中        我另外还编写了一个MFC的EXE程序,EXE调用DLL中的InstallHook()函数,运行结果是:在EXE中的Button2的事件中调用TextOutA函数能成功定向到我自己写的替换函数中,但是这个替换函数中调用TextOutA却定向到未修改的函数?“修改了本DLL符号表中TextOutA的地址”什么意思啊?你的意思是说我在EXE中调用这个函数的时候只修改了EXE中的符号表而没有修改DLL中的符号表?