windows – 扩展现有程序的功能我没有源代码
我正在开发一个第三方程序,它聚合来自一系列不同的现有
Windows程序的数据.每个程序都有一个通过GUI导出数据的机制.最麻醉的方法是让我通过使用AutoIt或其他一些GUI操作程序生成提取物,以通过GUI生成提取.这样做的问题是,当突然某些自动程序接管时,人们可能正在与计算机进行交互.那不好.我真正想做的是以某种方式每天运行一次程序并默默地(即不弹出任何GUI)从每个程序中导出数据.
我的研究告诉我,我需要挂钩每个应用程序(假设这些应用程序始终在运行)并注入一个自定义DLL来触发每个导出.我是否正在接近正确的轨道?我是一个相当有经验的软件开发人员,但我不太了解逆向工程或挂钩.任何建议或方向将不胜感激. 编辑:我正在尝试管理某种类型的专业人员的可用性.他们的时间表存储在专有系统中.经过他们的许可,我想在他们的系统上安装一个应用程序,从他们使用的系统中提取他们的日程安排,并将信息上传到中央服务器,以便我可以将这些信息提供给潜在客户. 解决方法
我知道有四种方法可以提取您想要的信息,包括它们的优点和缺点.在您执行任何操作之前,您需要知道您创建的任何解决方案都无法保证,并且实际上如果目标应用程序更新,则不太可能继续工作.原因是在每种情况下,您都依赖于实现细节而不是通过其导出数据的预定义接口.
挂钩GUI 第一种方法是按照您的建议挂钩GUI.在这种情况下,您正在做的只是阅读实际用户会看到的内容.这通常更容易,因为您正在挂钩明确定义的WinAPI.一个危险是程序显示的内容与它应该表示的内部数据相比是不一致或不完整的. 通常,有两种常见的方法来执行WinAPI挂钩: > DLL注入.您创建一个DLL加载到另一个程序的虚拟地址空间.这意味着您可以对目标的整个内存进行读/写访问(可以通过VirtualProtect获得可写访问).从这里你可以蹦床调用设置UI信息的函数.例如,要检查窗口是否更改了其文本,您可以蹦床SetWindowText功能.请注意,每个control都有不同的界面用于设置它们显示的内容.在这种情况下,您将挂钩代码调用的函数来设置显示. 这种方法的一个警告是它只有在目标使用或扩展WinAPI控件时才有效. 从GUI读取 您也可以使用WinAPI直接从目标窗口读取,而不是挂钩GUI.但是,在某些情况下,可能不允许这样做.在这种情况下没什么可做的,但要试着看看它是否有效.事实上,这可能是最简单的方法.通常,您将发送诸如WM_GETTEXT之类的消息来查询目标窗口以获取当前显示的内容.为此,您需要获取包含您感兴趣的控件的确切窗口层次结构.例如,假设您要读取编辑控件,您需要在窗口层次结构中查看其上方的父窗口为了获得它的窗口句柄. 从内存中读取(高级) 这种方法是迄今为止最复杂的方法,但如果您能够对目标程序进行完全逆向工程,则最有可能为您提供一致的数据.这种方法可以帮助您从目标进程中读取内存.这种技术在游戏黑客中非常常用,可以添加“功能”并观察游戏的内部状态. 考虑到除了在GUI中存储信息之外,程序通常还拥有自己的所有数据的内部模型.当使用的控件是virtual并且只是查询要显示的数据的子集时尤其如此.这是前两种方法没有多大用处的情况的一个例子.这些数据通常以某种抽象数据类型保存,例如列表或甚至数组.诀窍是在内存中找到此列表并直接读取值.这可以通过ReadProcessMemory在外部完成,也可以通过DLL内部再次进行.困难主要在于两个先决条件: >首先,您必须能够可靠地找到这些数据结构.这样做的问题是代码不能保证在同一个地方,特别是对于像ASLR这样的功能.通俗地说,这有时被称为代码转换. ASLR可以通过使用来自模块库的偏移量来动作,并使用诸如GetModuleHandle之类的函数动态获取模块基地址.除了ASLR之外,发生这种情况的原因是动态内存分配(例如通过malloc).在这种情况下,您需要找到存储指针的堆地址(例如,它将返回malloc),取消引用并找到您的列表.该指针将倾向于ASLR而不是指针,它可能是双指针,三指针等. 您可能会注意到我无法在此处提供具体的信息.原因在于,就其性质而言,使用此方法需要对目标的内部结构进行深入了解,因此,具体情况仅根据目标的编程方式来定义.除非你有逆向工程的知识和经验,否则你不太可能想要走这条路. 挂钩目标的内部API(高级) 与上述解决方案一样,您不必挖掘数据结构,而是挖掘内部API.我在前面讨论vtable时简要介绍了这一点.您将尝试查找修改GUI时调用的内部API,而不是这样做.通常,当修改视图/ UI时,程序将拥有自己的包装函数,而不是直接调用WinAPI来更新它,而是调用WinPI调用WinAPI.你只需要找到这个函数并挂钩它.这是可能的,但需要逆向工程技能.您可能会发现自己想要调用的功能.在这种情况下,除了能够找到函数的位置之外,还必须对其所需的参数进行反向工程,调用约定,并且需要确保调用函数没有副作用. 我认为这种方法是先进的.它当然可以完成,是游戏黑客中用来观察内部状态和操纵目标行为的另一种常用技术,但很难! 前两种方法非常适合从WinAPI程序读取数据,并且更容易.后两种方法允许更大的灵活性.通过足够的工作,您可以阅读目标封装的任何内容和所有内容,但需要很多技巧. 另一个可能与您的案例有关或可能与您的案例无关的关注点是,如果每个目标都要更新,那么将解决方案更新到工作是多么容易.使用前两种方法,更有可能不需要进行任何更改或进行小的更改.使用后两种方法,即使源代码中的少量更改也可能导致重新定位您所依赖的偏移量.解决此问题的一种方法是使用字节签名来动态生成偏移.我前段时间写过another answer,它解决了这是如何完成的. 我所写的只是对可以用于实现目标的各种技术的简要总结.我可能错过了方法,但这些是我所知道并且有经验的最常见的方法.由于这些本身就是大型主题,如果您想获得有关任何特定主题的详细信息,我建议您提出一个新问题.请注意,在我讨论过的所有方法中,没有一个方法遭受外界可见的任何交互,因此您可以毫无问题地弹出任何内容.正如你所描述的那样,它将是“沉默的”. 这是关于迂回/蹦床的相关信息,我从previous answer中解除了这个信息:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在WINDOWS下安装MRTG全攻略
- office365 – 使用Microsoft OneDrive API / SDK的客户端分
- windows-8 – 在SuspensionManager.SessionState中存储字符
- windows – 如何以编程方式从脚本中确定已安装的IE版本
- 如何在.net Windows应用程序中实现“撤消”操作?
- win-universal-app – Windows 10的应用内存限制是什么?
- windows-phone-7 – 如何使应用程序出现在wp 7/8的游戏(xbo
- iis – 确定清除日志的原因
- 配置Windows Server 2008路由器
- Windows Server 2016-Win Ser 2016新增功能