简单的工作室

跨进程获取其他程序的DBGrid内容

时间:2011-01-25 16:02来源:未知 作者:admin 点击:
哎,刚才转载的两篇HOOK抓封包的方法一点也不好使,那篇delphi获取数据封包的方法我测试下,成功注入,可是执行到getCurrentProcess 目标软件就出错退出了,下面这篇文章倒是很经典的。我用这个方法成功或取到Tadvstringgrid表格里的数据,可是用他来获取Visual stuido.net

哎,刚才转载的两篇HOOK抓封包的方法一点也不好使,那篇delphi获取数据封包的方法我测试下,成功注入,可是执行到getCurrentProcess 目标软件就出错退出了,下面这篇文章倒是很经典的。我用这个方法成功或取到Tadvstringgrid表格里的数据,可是用他来获取Visual stuido.net C++写的程序,findcontrol也无法找到实例的! 

关键词:钩子Hook, DLL注入, FindControl

一、思考与启发
 1.对于Windows的Standard Controls,基本上大家应该是都会的:
  GetWindowText,WM_GETTEXT可以获取EDIT的文本内容;
  LB_GETTEXT可以获取LISTBOX列表项的文本内容;
  CB_GETLBTEXT可以获取COMBOBOX下拉列表项的文本内容;
  这里我就不多说了。
  对于Windows的Common Controls,如LISTVIEW、TREEVIEW等,在本进程自身中获取的话可以直接用LVM_GETITEMTEXT,TVM_GETITEM 消息,跨进程的话,还需要另外用到一些API函数,有兴趣的可以看看这个贴子:
  http://www.delphibbs.com/delphibbs/dispq.asp?lid=3224504
  DBGrid是Delphi的自写控件,不是Windows控件,没有什么消息可以利用来获取它所显示的数据记录内容。
2.运用鼠标屏幕取词的技术,可以获取到鼠标位置的显示内容,这个是采用的ApiHook技
  术,截获屏幕输出函数,从而得到输出内容,其实现原理这里我不想多说,delphibbs
  论坛上相关的贴子很多,大家搜索一下就能找到。不过这种方法的实用性不很强,因为
  它需要在鼠标位置使输出重画,才能截获到输出内容的;而且如果DBGrid显示不完整有
  滚动条的情况下,没有显示的字段、记录的内容就不能截获到。
3.在本进程自身中,是可以获得DBGrid显示的记录内容的,如
  DBGrid1.Columns[1].Field.DisplayText,不过前提是要得到对象实例DBGrid1,假如
  我们只知道DBGrid1的句柄。这个当然也没有什么问题,FindControl函数可以完成这个
  功能。
4.上面说到,只要能够得到DBGrid的对象实例,我们就能够获得它的内容啦。前面讲的是
  在本进程可以获取到DBGrid内容,而我们现在要讲的是跨进程获取其他程序的DBGrid    内容,那么是不是真的能够得到其他进程的DBGrid对象实例呢?如果能够的话,又该怎么
  实现呢?另外,还有一个问题,我们获取到了这个DBGrid的对象实例,但是这个地址是
  其他进程地址空间中的一个虚拟地址,我们能够DBGrid1.Columns[1].Field.DisplayText
  这样在自己的进程中访问获取其内容吗?
二、必备知识基础
 1.进程地址空间
  Win32系统,所有32位应用程序都有4GB的进程地址空间(32位地址最多可以映射4GB的内存)。应用程序可以访问2GB的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余2GB为操作系统保留(也称为内
  核模式地址空间)。
  而从Win2000 Server开始的所有操作系统版本,还有一个boot.ini
  开关,可以为应用程序提供访问3GB的进程地址空间的权限,从而将内核模式地址空间
  压缩为1GB。一般地,一个用户进程不可以直接访问另外一个用户进程的地址空间。进
  程地址空间的描述请参考 http://msdn2.microsoft.com/zh-cn/library/ms189334.aspx
  和《Windows核心编程》的第13章 Windows的内存结构。 
  顺便说一句,《Windows核心编程》是一本相当经典的好书,呵呵,建议大家都应该购
  买收藏一本,认认真真地把它看几遍。题外话,呵呵 
 2.DLL 基础
 1)先说说为什么要使用DLL?
 a.它可以动态装载,这样不必要在应用程序初始化就装载所有的代码,可以根据需要、操
  作再装载DLL,这样启动速度比较快,也更节省内存;
b.便于项目管理,不同的开发人员、开发小组在不同的模块上工作;
c.有助于解决操作系统平台的差异,比如98/2000/XP等枚举进程可以用
  CreateToolhelp32Snapshot,Process32First,Process32Next,而NT上就不能用,而要
  用psapi.dll中的EnumProcesses,EnumProcessModules,GetModuleFileNameEx等函数;
d. 可以用多种编程语言编写,开发人员可以选用自己最擅长的语言;
e.有助于资源的共享和应用程序的本地化,DLL可以包含对象框模板、图标、字符串、位
  图等资源;
打错了,是对话框模板
 f.可以实现一些特殊的目的,如系统范围的全局钩子,就要求写在DLL中才行。
2)EXE 程序的全局变量不能被同一个EXE程序的多个运行实例所共享,DLL中的全局变量的处理方法也是一样的。也就是说,当一个进程将一个DLL映射到它的地址空间中去的时
 候,系统会同时创建全局变量的实例。
也就是说不同进程间用的同一个DLL,全局变量的值可能是不一样的,不能共享
 3)DLL 和EXE之间的数据共享,这有很多技术,全局原子、内存映射、WM_COPYDATA消息等,
  这个不是本文的重点,这里我们就不一一赘述。
 4)Delphi 写DLL要注意的问题:
这一点我们需要注意 
 a.参数和返回值为string、动态数组类型时,DLL和EXE都要把 ShareMem作为.dpr工程的第一个单元引用。当然最好是不要使用string、动态数组类型,可以改用PChar、数组指
  针类型,如果是混合语言编程使用的话,就一定不能用string、动态数组类型。这样做
(责任编辑:简单的工作室)
顶一下
(1)
33.3%
踩一下
(2)
66.7%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容