如何像金山快译,东方快车那样获得程序窗口中的文本,难道没有相关的api吗?100分 用GetWindowText,在APIViewer里找,3个参数如下:hWnd,你要获得文本的窗体的句柄(进)lpstring,返回的文本(出)nMaxCount,允许复制到缓存里的字符的个数(进) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 GetWindowText 得到的是窗口的标题,根本不是床体显示的文本 API HOOK 请说具体点好吗?? API是需要的但是与屏幕取词这个核心功能直接间接相关的绝对没有! 想了解API HOOK技术的话,请看Jeffrey Richter大牛的《Windows 核心编程》,从545页开始…… 原来如此,看不懂呀浅谈API HOOK技术(一)APIHook一直是使大家感兴趣的话题。屏幕取词,内码转化,屏幕翻译,中文平台等等都涉及到了此项技术。有很多文章涉及到了这项技术,但都闪烁其词不肯明明白白的公布。我仅在这里公布以下我用Delphi制作APIHook的一些心得。 通常的APIHOOK有这样几种方法: 1、自己写一个动态链接库,里面定义自己写的想取代系统的API。把这个动态链接库映射到2G以上的系统动态链接库所在空间,把系统动态链接库中的该API的指向修改指向自己的函数。这种方法的好处就是可以取代系统中运行全部程序的该API。但他有个局限,就是只适用于Win9x。(原因是NT中动态链接库不是共享的,每个进程都有自己的一份动态链接库在内存中的映射) 2、自己写一个动态链接库,里面定义自己写得象替代系统的API。把这个动态链接库映射到进程的空间里。将该进程对API的调用指向自己写的动态链接库。这种方法的好处是可以选择性的替代哪个进程的API。而且适用于所有的Windows*作系统。 这里我选用的是第二种方法。 第二种方法需要先了解一点PE文件格式的知识。 首先是一个实模式的的DOS文件头,是为了保持和DOS的兼容。 接着是一个DOS的代理模块。你在纯DOS先运行Win32的可执行文件,看看是不是也执行了,只是显示的的是一行信息大意是说该Windows程序不能在DOS实模式下运行。 然后才是真正意义上的Windows可执行文件的文件头。它的具体位置不是每次都固定的。是由文件偏移$3C决定的。我们要用到的就是它。 如果我们在程序中调用了一个MessageBoxA函数那么它的实现过程是这样的。他先调用在本进程中的MessageBoxA函数然后才跳到动态链接库的MessageBoxA的入口点。即: call messageBoxA(0040106c) jmp dword ptr [_jmp_MessageBoxA@16(00425294)] 其中00425294的内容存储的就是就是MessageBoxA函数的入口地址。如果我们做一下手脚,那么...... 那就开始吧! 我们需要定义两个结构 type PImage_Import_Entry = ^Image_Import_Entry; Image_Import_Entry = record Characteristics: DWORD; TimeDateStamp: DWORD; MajorVersion: Word; MinorVersion: Word; Name: DWORD; LookupTable: DWORD; end; type TImportCode = packed record JumpInstruction: Word; file: //定义跳转指令jmp AddressOfPointerToFunction: ^Pointer; file: //定义要跳转到的函数 end; PImportCode = ^TImportCode; 然后是确定函数的地址。 function LocateFunctionAddress(Code: Pointer): Pointer; var func: PImportCode; begin Result := Code; if Code = nil then exit; try func := code; if (func.JumpInstruction = $25FF) then begin Result := func.AddressOfPointerToFunction^; end; except Result := nil; end; end; 参数Code是函数在进程中的指针,即那条Jmp XXX的指令。$25FF就是跳转指令的机器码。 再下一篇我会讲如何替换下那个XXX的内容,让他跳到你想去的地方。 全VB写这样的程序很困难,最好用VC写 用VB也不难,关键是你要明白三个技术:1、PE引入表(import table)的结构2、远程线程注入3、写别的进程的内存数据的方法 如何将Inet接收的图片显示到PictureBox中? 关于ActiveX的问题。 ADO DATA控件中移动记录的问题 各位大虾:请问如何用VB6备份和恢复加密的ACCESS97和2000数据库? 请教各位大侠!关于数据库的 一段代码,在线等 急NT服务程序... 如何定义data report的纸张大小? 请问大虾:如何在ActiveReport报表每页的尾部进行某字段的合计(小计) 一个关于存储过程参数传入的问题 如果没人进来,我就要见马克思去了,sql加减问题。 如何知道textbox或richtextbox中某一行字的个数?
但是与屏幕取词这个核心功能直接间接相关的
绝对没有!
原来如此,看不懂呀
浅谈API HOOK技术(一)
APIHook一直是使大家感兴趣的话题。屏幕取词,内码转化,屏幕翻译,中文平台等等都涉及到了此项技术。有很多文章涉及到了这项技术,但都闪烁其词不肯明明白白的公布。我仅在这里公布以下我用Delphi制作APIHook的一些心得。
通常的APIHOOK有这样几种方法:
1、自己写一个动态链接库,里面定义自己写的想取代系统的API。把这个动态链接库映射到2G以上的系统动态链接库所在空间,把系统动态链接库中的该API的指向修改指向自己的函数。这种方法的好处就是可以取代系统中运行全部程序的该API。但他有个局限,就是只适用于Win9x。(原因是NT中动态链接库不是共享的,每个进程都有自己的一份动态链接库在内存中的映射)
2、自己写一个动态链接库,里面定义自己写得象替代系统的API。把这个动态链接库映射到进程的空间里。将该进程对API的调用指向自己写的动态链接库。这种方法的好处是可以选择性的替代哪个进程的API。而且适用于所有的Windows*作系统。
这里我选用的是第二种方法。
第二种方法需要先了解一点PE文件格式的知识。
首先是一个实模式的的DOS文件头,是为了保持和DOS的兼容。
接着是一个DOS的代理模块。你在纯DOS先运行Win32的可执行文件,看看是不是也执行了,只是显示的的是一行信息大意是说该Windows程序不能在DOS实模式下运行。
然后才是真正意义上的Windows可执行文件的文件头。它的具体位置不是每次都固定的。是由文件偏移$3C决定的。我们要用到的就是它。
如果我们在程序中调用了一个MessageBoxA函数那么它的实现过程是这样的。他先调用在本进程中的MessageBoxA函数然后才跳到动态链接库的MessageBoxA的入口点。即:
call messageBoxA(0040106c)
jmp dword ptr [_jmp_MessageBoxA@16(00425294)]
其中00425294的内容存储的就是就是MessageBoxA函数的入口地址。如果我们做一下手脚,那么......
那就开始吧!
我们需要定义两个结构
type
PImage_Import_Entry = ^Image_Import_Entry;
Image_Import_Entry = record
Characteristics: DWORD;
TimeDateStamp: DWORD;
MajorVersion: Word;
MinorVersion: Word;
Name: DWORD;
LookupTable: DWORD;
end;
type
TImportCode = packed record
JumpInstruction: Word; file: //定义跳转指令jmp
AddressOfPointerToFunction: ^Pointer; file: //定义要跳转到的函数
end;
PImportCode = ^TImportCode;
然后是确定函数的地址。
function LocateFunctionAddress(Code: Pointer): Pointer;
var
func: PImportCode;
begin
Result := Code;
if Code = nil then exit;
try
func := code;
if (func.JumpInstruction = $25FF) then
begin
Result := func.AddressOfPointerToFunction^;
end;
except
Result := nil;
end;
end;
参数Code是函数在进程中的指针,即那条Jmp XXX的指令。$25FF就是跳转指令的机器码。
再下一篇我会讲如何替换下那个XXX的内容,让他跳到你想去的地方。
最好用VC写
1、PE引入表(import table)的结构
2、远程线程注入
3、写别的进程的内存数据的方法