可以通过“人偶串线”捕获/重放 GUI 功能吗?

逆向工程 艾达 视窗
2021-06-27 00:53:48

单击 GUI 时,会在某处执行底层代码。是否可以捕获这种“木偶串线”,以便可以按需手动调用它(无需单击 GUI)?

例如:

在 Internet Explorer 的开发控制台中,有一个用于“清除域 cookie”的按钮,但只能通过拉起开发控制台并通过单击按钮来访问它。

是否有可能“捕捉”这个被调用的底层函数,然后通过程序化的木偶串接我自己调用它?

1个回答

理论上,是的,你可以做类似的事情。在普通的窗口对话框中,您可以获得按钮的 onClick 功能,即使您的程序使用其他方式创建 GUI 元素(Java/Swing、QT、GTK、wxWidgets、Delphi....),您也可以找到通过附加调试器、单步执行、在仿真模式下运行等方式按下按钮时会发生什么。

其中一些方法可以很好地自动化(找到按钮的 onClick 函数,这意味着或多或少地检查窗口过程在发送WM_COMMAND带有BN_CLICKED参数或WM_LBUTTONDOWN消息时的行为,或从 Java JButton 获取 ActionHandler 列表) ,有些需要更多的人工调查。

然后,您可以将一个 DLL 注入到程序中,该程序会在“发生某事”时调用您找到的函数,其中“发生某事”是您与 DLL 通信以告诉它“调用 cookie-cleaner”的方式。

但是,您很可能会导致程序崩溃,因为按钮的部分功能可能与程序的状态(尤其是 GUI 状态)密切相关。也许处理函数在您单击按钮后禁用它,并在完成后重新启用它。或者处理程序函数在按钮旁边的框中显示一些消息。如果您只是调用处理程序,而没有 GUI 元素,您的程序很可能会崩溃。

所以要做到这一点,你必须反汇编程序的大部分内容,了解它在做什么,并将后端过程(清除缓存)与前端(处理 GUI)分开;根据代码分离到后端和前端的程度,这甚至可能是不可能的。在确定您可以安全调用的后端部分后,您必须弄清楚如何从您的 DLL 中找到该部分(ASLR 可能会将它放在不同的地址;软件的本地化版本可能有不同的地址;并且在您的下一个自动化之后windows 更新,整个软件布局可能会改变),然后创建一个仅适用于该版本软件的 DLL,直到下一次更新。

使用 AutoHotKey 之类的软件可能会获得更好的结果,它允许您创建一个宏来在窗口层次结构中查找按钮,并允许您向按钮发送点击事件。这将要求您让 GUI 处于显示按钮并允许单击它的状态,但是让 AutoHotKey(或类似程序)找到该按钮将比找出要调用的内容和调用该按钮更容易且不易出错不知何故。