窃取GUI元件内部文字资料

Multithreads 2009-08-24 11:22:13
本人想得到其他应用程式control的文字内容
如果对象是mfc的,听人说大概可以用sendmessage得到
但现在我是面对的是大约是grid的ATL的东西,
应该怎样办


...全文
140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
taiyang631 2009-08-26
  • 打赏
  • 举报
回复
帮顶一下
雪影 2009-08-25
  • 打赏
  • 举报
回复
给你贴一段取词代码
都是上面那个网页中的
//截取TextOut

typedef UINT (WINAPI* ALLOCCSTODSALIAS)(UINT);

ALLOCCSTODSALIAS AllocCsToDsAlias;

BYTE NewValue[5];//保存新的入口代码
BYTE OldValue[5];//API原来的入口代码
unsigned char * Address=NULL;//可写的API入口地址
UINT DsSelector=NULL;//指向API入口的可写的选择符
WORD OffSetEntry=NULL;//API的偏移量

BOOL bHookAlready = FALSE; //是否挂钩子的标志

BOOL InitHook()
{
HMODULE hKernel,hGdi;
hKernel = GetModuleHandle("Kernel");
if(hKernel==NULL)
return FALSE;

AllocCsToDsAlias = (ALLOCCSTODSALIAS)GetProcAddress(hKernel,"AllocCsToDsAlias");//这是未公开的API所以要这样取地址
if(AllocCsToDsAlias==NULL)
return FALSE;

hGdi = GetModuleHandle("Gdi");
if(hmGdi==NULL)
return FALSE;

FARPROC Entry = GetProcAddress(hGdi,"TextOut");
if(Entry==NULL)
return FALSE;

OffSetEntry = (WORD)(FP_OFF(Entry));//取得API代码段的选择符
DsSelector = AllocCsToDsAlias(FP_SEG(Entry));//分配一个等同的可写的选择符
Address = (unsigned char*)MK_FP(DsSelector,OffSetEntry);//合成地址

NewValue[0]=0xEA;
*((DWORD*)(NewValue+1)) = (DWORD)MyTextOut;

OldValue[0]=Address[0];
*((DWORD*)(OldValue+1)) = *((DWORD*)(Address+1));
}

BOOL ClearHook()
{
if(bHookAlready)
HookOff();

FreeSelector(DsSelector);
}

BOOL HookOn()
{
if(!bHookAlready){
for(int i=0;i<5;i++){
Address[i]=NewValue[i];
}
bHookAlready=TRUE;
}
}

BOOL HookOff()
{
if(bHookAlready){
for(int i=0;i<5;i++){
Address[i]=OldValue[i];
}
bHookAlready=FALSE;
}
}

//钩子函数,一定要和API有相同的参数和声明
BOOL WINAPI MyTextOut(HDC hdc,int nXStart,int nYStart,LPCSTR lpszString,UINT cbString)
{
BOOL ret;
HookOff();
ret = TextOut(hdc,nXStart,nYStart,lpszString,cbString);//调原来的TextOut
HookOn();
return ret;
}
雪影 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 multithreads 的回复:]
引用 4 楼 tttyd 的回复:
这么难办,你不知道控件中的文本是否是自绘的。
如果是自绘的,除非你能获取控件的接口,且有相应的方法。
否则很难获取自绘控件中的窗口文本。


我用金山词霸看见它们能够抽取到文字内容,所以应该是可行的
[/Quote]
金山词霸使用的是hook技术。
这里有一个金山词霸取词原理分析,楼主好好看看先
http://www.pediy.com/bbshtml/BBS4/kanxue201.htm
Multithreads 2009-08-25
  • 打赏
  • 举报
回复
不是自绘应该如何办
要用什么API,烦请详细说明
whg01 2009-08-25
  • 打赏
  • 举报
回复
如果控件中的文本可以用鼠标、键盘选择,那就更简单了。直接写个程序发送鼠标键盘事件,不停的拷贝、粘贴。
whg01 2009-08-25
  • 打赏
  • 举报
回复
基本原理:做一个hook截取Windows的画字符函数,然后用一个程序逐个像素在目标程序上覆盖、取消覆盖,就是让它调用系统函数重画字符。这样你就能获取到了。
去Google上搜“屏幕取词程序VC源码”,有你想要的。
wsc1509 2009-08-25
  • 打赏
  • 举报
回复
帮顶,学习,关注!
Multithreads 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
这么难办,你不知道控件中的文本是否是自绘的。
如果是自绘的,除非你能获取控件的接口,且有相应的方法。
否则很难获取自绘控件中的窗口文本。
[/Quote]

我用金山词霸看见它们能够抽取到文字内容,所以应该是可行的
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
呵呵。如果自绘的话...囧了就
雪影 2009-08-24
  • 打赏
  • 举报
回复
这么难办,你不知道控件中的文本是否是自绘的。
如果是自绘的,除非你能获取控件的接口,且有相应的方法。
否则很难获取自绘控件中的窗口文本。
WaistCoat16 2009-08-24
  • 打赏
  • 举报
回复
如果控件不是自绘文字也可以通过获取窗口句柄然后获取文字的
Multithreads 2009-08-24
  • 打赏
  • 举报
回复
我已用spy++得到了class name是ATL:1004AB80
window handle,control id等的资料
  • 打赏
  • 举报
回复
帮顶,学习,关注!

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧