gpt4 book ai didi

windows - 扩展我没有源代码的现有程序的功能

转载 作者:行者123 更新时间:2023-12-02 19:51:51 25 4
gpt4 key购买 nike

我正在开发一个第三方程序,该程序聚集了许多不同的现有Windows程序中的数据。每个程序都有通过GUI导出数据的机制。最死脑筋的方法是让我通过使用AutoIt或其他一些GUI操作程序来生成摘录,以通过GUI生成摘录。这样做的问题是,当突然有一些自动化程序接管时,人们可能正在与计算机进行交互。不好我真正想做的是以某种方式每天运行一次程序,然后以静默方式(即不弹出任何GUI)从每个程序导出数据。

我的研究告诉我,我需要挂钩每个应用程序(假设这些应用程序始终在运行),并注入(inject)一个自定义DLL来触发每个导出。我是否接近正确的方向?我是一个非常有经验的软件开发人员,但是我对逆向工程或钩子(Hook)一无所知。任何建议或指示将不胜感激。

编辑:我正在尝试管理某种类型的专业人员的可用性。他们的日程表存储在专有系统中。在他们的许可下,我想在他们的系统上安装一个应用程序,该应用程序可以从他们使用的任何系统中提取时间表,并将信息上载到中央服务器,以便可以将该信息提供给潜在的客户。

最佳答案

我知道有四种提取所需信息的方法,它们都有优点和缺点。在执行任何操作之前,您需要了解,您创建的任何解决方案均无法保证,并且即使目标应用程序不断更新,也很难继续工作。原因是,在每种情况下,您都依赖于实现细节,而不是通过其导出数据的预定义接口(interface)。
挂钩GUI
第一种方法是按照您的建议挂接GUI。在这种情况下,您所做的只是从实际用户的观察中读取。通常,这很容易,因为您要钩住明确定义的WinAPI。一种危险是程序显示的内容与其应该表示的内部数据相比不一致或不完整。
通常,有两种执行WinAPI挂钩的常用方法:

  • DLL注入(inject)。您创建一个DLL,然后将其加载到另一个程序的虚拟地址空间中。这意味着您对目标的整个内存具有读/写访问权限(可以使用VirtualProtect获得可写访问权限)。在这里,您可以蹦床调用用来设置UI信息的功能。例如,要检查窗口是否已更改其文本,可以在SetWindowText函数上执行蹦床操作。请注意,每个control都有用于设置其显示内容的不同接口(interface)。在这种情况下,您将钩住代码调用的功能以设置显示。
  • SetWindowsHookEx。在幕后,它的工作方式与DLL注入(inject)相似,在这种情况下,它实际上只是扩展/颠覆控件接收到的消息的控制流的另一种方法。在这种情况下,您想要执行的操作是挂接每个子控件的窗口过程。例如,将某项添加到ComboBox时,它将收到CB_ADDSTRING消息。在这种情况下,您将钩挂显示更改时收到的消息。

  • 使用此方法的一个警告是,仅当目标使用或扩展WinAPI控件时,它才有效。
    从GUI读取
    除了钩住GUI外,还可以使用WinAPI直接从目标窗口读取。但是,在某些情况下,这可能是不允许的。在这种情况下,没有什么可做的,而是尝试看看它是否有效。实际上,这可能是最简单的方法。通常,您将发送诸如 WM_GETTEXT之类的消息以查询目标窗口当前正在显示的内容。为此,您将需要获取包含您感兴趣的控件的确切窗口层次结构。例如,假设您要阅读一个编辑控件,则需要查看该窗口层次结构中位于其上方的父窗口为了获得它的窗口句柄。
    从内存读取(高级)
    到目前为止,这种方法最复杂,但是如果您能够对目标程序进行完全反向工程,那么它很可能为您提供一致的数据。通过从目标进程读取内存,可以使用此方法。此技术非常常用于游戏黑客中,以增加“功能”并观察游戏的内部状态。
    考虑到除了将信息存储在GUI中之外,程序通常还拥有所有数据的内部模型。当使用的控件是 virtual并仅查询要显示的数据子集时,尤其如此。这是前两种方法用处不大的情况的示例。该数据通常以某种抽象数据类型保存,例如列表,甚至数组。诀窍是在内存中找到此列表并直接读取值。可以使用 ReadProcessMemory在外部完成此操作,也可以在内部再次通过DLL注入(inject)完成此操作。困难主要在于两个先决条件:
  • 首先,您必须能够可靠地定位这些数据结构。问题在于,不能保证代码位于同一位置,尤其是使用ASLR之类的功能时。通俗地说,这有时称为代码移位。可以通过使用来自模块基的偏移量并使用诸如GetModuleHandle之类的函数动态获取模块基地址来击败ASLR。与ASLR一样,发生这种情况的原因也是由于动态内存分配(例如,通过malloc)。在这种情况下,您将需要找到一个存储指针的堆地址(例如返回malloc),对其进行取消引用并找到您的列表。该指针将易于使用ASLR,而不是指针,它可能是双指针,三指针等。
  • 您面临的第二个问题是,每个列表项都很少是原始类型。例如,您可能会遇到一系列对象,而不是字符数组(字符串)的列表。您将需要对每种对象类型进行进一步的逆向工程并了解内部布局(至少能够确定您感兴趣的原始值相对于对象库的偏移量)。更高级的方法围绕着实际上对对象的vtable进行反向工程并调用其“API”。

  • 您可能会注意到,我无法在此处提供具体信息。原因是,从本质上讲,使用此方法需要对目标内部进行深入了解,因此,仅通过对目标进行编程的方式来定义详细信息。除非您具有逆向工程的知识和经验,否则您不太可能想走这条路。
    挂钩目标的内部API(高级)
    与上述解决方案一样,您无需挖掘数据结构,而可以挖掘内部API。在前面讨论vtable时,我简要介绍了这一点。而不是这样做,您将尝试查找在修改GUI时调用的内部API。通常,当修改 View /UI时,程序将直接调用WinAPI,而不是直接调用WinAPI对其进行更新,而将具有自己的包装函数。您只需要找到此函数并将其挂钩。同样,这是可能的,但是需要逆向工程技能。您可能会发现自己发现了要调用的函数。在这种情况下,除了能够找到函数的位置之外,还必须对它所使用的参数,其调用约定进行反向工程,并且需要确保调用该函数没有副作用。
    我认为这种方法是先进的。当然可以做到这一点,这是在游戏黑客中观察内部状态并操纵目标行为的另一种常用技术,但很难!

    前两种方法非常适合从WinAPI程序中读取数据,并且到目前为止非常容易。后两种方法具有更大的灵活性。完成足够的工作,您就可以读取 的任何内容以及目标封装的的所有内容,但是需要很多技巧。
    可能与您的情况相关或不相关的另一个问题是,如果每个目标均得到更新,那么更新解决方案以使其工作将变得多么容易。使用前两种方法,很可能无需进行更改或进行较小的更改。使用后两种方法,即使源代码中的很小变化也可能导致您所依赖的偏移量的重新定位。解决此问题的一种方法是使用字节签名动态生成偏移量。我前段时间写了 another answer来解决这个问题。
    我所写的只是可用于实现目标的各种技术的简要概述。我可能错过了一些方法,但是这些是我最了解并有经验的方法。由于这些主题本身就是个大话题,因此,如果您想获取有关任何特定主题的更多详细信息,我建议您提出一个新问题。请注意,在我所讨论的所有方法中,它们都没有遭受外界可见的任何交互的影响,因此您不会遇到任何弹出的问题。正如您所描述的,这将是“沉默的”。

    这是我从写的 previous answer中删除的绕行/踩踏的相关信息:

    If you are looking for ways that programs detour execution of otherprocesses, it is usually through one of two means:

    • Dynamic (Runtime) Detouring - This is the more common method and is what is used by libraries such as Microsoft Detours. Here is arelevant paper where the first few bytes of a function are overwrittento unconditionally branch to the instrumentation.
    • (Static) Binary Rewriting - This is a much less common method for rootkits, but is used by research projects. It allows detouring to beperformed by statically analysing and overwriting a binary. An old(not publicly available) package for Windows that performs this isEtch. This paper gives a high-level view of how it worksconceptually.

    Although Detours demonstrates one method of dynamic detouring, thereare countless methods used in the industry, especially in the reverseengineering and hacking arenas. These include the IAT and breakpointmethods I mentioned above. To 'point you in the right direction' forthese, you should look at 'research' performed in the fields ofresearch projects and reverse engineering.

    关于windows - 扩展我没有源代码的现有程序的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10134630/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com