我现在需要抓取另一个程序里某个自定义控件上的文本,之前发了个帖子,大部分人建议用api hook textouta俺一点都不懂,看资料很吃力
哪位大虾能给大体讲讲啊?比如这样的情况我需要用线程钩子还是全局钩子还有用户可能同时会打开两个窗口,那我应该如何处理呢?不懂这块,看资料很吃力!万分感谢!!!
解决以后另开贴放分。

解决方案 »

  1.   

    首先,hook api就是替换导入表中的函数地址。当你调用一个api的时候,编译程序会生成类似如下的语句:
    mov ebx, __imp_TextOutA
    call ebx
    其中__imp_TextOutA就是导入表的内容,它被编译成一个单独的段。在这个地方,写了如下的指令:
    jmp XXXXXXXX
    其中jmp一个字节,地址4个字节。(这里的jmp是near jmp,所以地址是相对地址)
    所以只要替换导入表,就可以hook到API了至于为什么要用钩子,那是因为进程空间的问题。替换的导入表如果不在本进程,当然会出问题,所以我们需要有一个dll插入到对方进程里面。因此需要一个全局钩子。(用进程注入也可以的)鼠标钩子和低层键盘钩子都可以的。关于两个窗口的问题,要看两个窗口是不是同一进程了。但是,既然已经使用了全局钩子,那么在别的进程也会有这个dll插入进去的,所以不存在问题。
      

  2.   

    多谢楼上的!明白了一些!
    还有问题就是:我要监视的是一个控件上的文本,那用钩子 挂textout的话是会取到一些什么信息呢?
    仅仅是该控件的文本的变化吗?也就是说能够过滤其他的控件上的文本吗?
      

  3.   

    用hook api来做通常是没问题的。但重在实践。
    总的来讲有两个问题:
    1.修改exe文件的导入节并不一定对控件有效。如果这个控件是由静态库提供或者是exe中的自定义控件,那么通常是没问题的;如果它是引用的dll,例如普通的静态控件label,它应当是在user32.dll中,那就应当修改相应dll的导入节;
    2.控件上的文本并不一定是用TextOut画的,或者说它通常都不是用TextOut画的。好在输出文件的API也就那么几个:ExtTextOut, DrawText, TabbedTextOut这些。多试试就好了。
      

  4.   

    过滤的是所有使用此API的文本。必须做好判断。
      

  5.   

    多谢多谢!实在是太感激了!还有问题就是:
    只能通过文本内容来判断吗? 不能通过某个方法获取是哪个控件的textout吗?
    因为我抓取得文本,如果只通过内容来判断的话,是很难判断的!