为什么Hook GDI函数无法得到目标程序全部的绘图内容?

来源:百度知道 编辑:UC知道 时间:2024/06/01 07:38:39
主要是要截获目标程序绘制的文字内容,但是截获的内容总是缺了一部分。比如目标程序绘制了“我是中华人民共和国公民”,但是我截获到的内容总是缺了几个字,变成“中名和公民“。一共挂钩了这些函数:
ExtTextOutA;
DrawTextA;
TextOutA;
DrawTextExA;
ExtTextOutW;
DrawTextW;
DrawTextExW;
TextOutW;
PolyTextOutA;
PolyTextOutW;
TabbedTextOutA;
TabbedTextOutW;
GrayStringA;
GrayStringW;
BeginPaint;
SetMapMode;
OffsetRgn;
目标程序是使用DirectDraw绘图的,但是没有使用IDirectDrawSurface::GetDC()取得DC,但是ExtDrawTextW确可以截获到一部分输出,我想不明白这是为什么。难道还可以使用其他函数输出文字?或者用了其他方法?还望高手指点,先给100分,还可以加分!
感谢k4me的特别支持哈,缺字的问题不是偶然的,每次都缺那几个字,说明这个问题跟速度无关。通过挂钩IDirectDrawSurface接口,目标程序并没有通过QueryInterface来得到更高版本的DirectDrawSurface对象,说明程序并没有使用高版本的对象。另外,除了我列出来的函数以外还有哪些函数可以用来在IDirectDrawSurface上面输出文字的?或者不是函数,是另外一个COM对象,但是是什么COM或函数我还不知道,有知道的吗?给点提示。
目标程序是大话,不知道他为什么要一个字一个字画,反正它就是那么画的。如果在我的Hook函数中不执行原来的函数,目标程序显示不出任何字符,但是就是不能截获到全部字符。
那些字没有规律啊,比如我在对话框里输入ababababababab,然后我截获到的信息有时候有aba,有时候就一个a,有时什么都没有。

感慨万千,终于见到高手了,不过高手在提问.
一大堆汗,以后请多为Baidu朋友做贡献啊.
-----------------
猜猜问题出现的可能,先说明我不会dx,全当作支持支持
1,变换输入字符测试是否和字串有关,比如"我是中华人民共和国公民"转换成"我我是是中中华华人人民民共共和和国国公公民民",这样测测是不是小处失误.
2,程序反应速度不够,抓丢了东西.
3,是不是渲染帧缓冲人家用了3,4,5,6而不只是2,好像有这种技术.
-----------回答者:k4me - 探花 十一级 12-2 21:22
---继续补充
第一项的意思是,你把字串继续变化一下找找规律,分析出规律可能有帮助.比如"一二三四五六七八九十ABCDEFGH",然后分析截获的跳越有没有相似性.字串长点才有用.
----你搞笑啊,字串要很长而且局部不会有重复才能测出到底截到了那些,你那个abab怎么能判断位置呢.不过,这个恐怕不是问题产生的原因.

准我瞎猜几句~~
你试没试过换个目标程序测试你的截获程序?
你的那个目标程序在画的那句"我是中华人民共和国公民"是什么样子的?别拍我 我只是不太明白为什么画一句话还要一个字符一个字符的来 居然还可以截获一部分漏掉一部分
如果那个目标程序变态的话,你是不是还需要考虑它预先把你没有截获的那几个字做成了图片然后用画图的函数显示出来?

楼主说的意思是不是这样:
截获的绘图函数只有ExtDrawTextW,截获的文字不全;如果截获后不执行绘图函数的话,一个字都没有;如果截获后执行的话,就能显示出所有的字,一个都不缺,是这样吗?
如果是,那...真是比较汗

首先楼主,既然知道对方是使用的DirectDraw方式进行输出的,那么为什么还直接去hook gdi函数?楼主出现这种情况只有一种可能,那就是为了某些考虑,部分字体使用GDI帮助去绘制的而没有使用DirectDraw。

................虽然我不会,我我可以说几句吗
很难哦,很多人看到你的问题都