Изменение программы для имитации нажатия кнопки

У меня есть приложение MFC, которое мне дали (без исходного кода), которое открывает окно с кнопкой «Обновить», которая затем выполняет очень долгое обновление после нажатия.

Я хотел бы изменить программу так, чтобы при создании окна (или где-то еще, например, DoModal) в программу отправлялось сообщение, чтобы она думала, что кнопка была нажата.

Я некоторое время играл с этим в Ida Pro и OllyDbg, но безрезультатно. Я рассматривал возможность использования PumpMessage, но это не принесло никакого успеха.

Любой совет?


person samoz    schedule 10.06.2009    source источник


Ответы (4)


Если вам не нравится идея использования вторичной «макро» программы, вы можете исправить двоичный файл исходной программы, чтобы вызвать обработчик кнопки BM_CLICK. Если вы можете найти место для вызова (минимум 5 байт без аргументов), вы можете сделать это с одним OllyDbg (после редактирования кода выберите его, и выберите "Копировать в исполняемый файл" -> "Выбор" из правой кнопки мыши меню). В противном случае вам нужно будет создать новый раздел кода с помощью редактора PE (например, LordPE или PE Tools) и добавить туда свой код (обычно вы хотите изменить вызов в программе на переход к вашему разделу, где вы выполните исходный вызов плюс вызов обработчика щелчка кнопки, а затем вернитесь к старой позиции после вашего исправленного перехода).

person Vladimir Panteleev    schedule 10.06.2009
comment
Как/куда мне поставить этот патч? - person samoz; 10.06.2009
comment
Если вы не собираетесь создавать новый раздел, вы можете попробовать найти пещеру кода, которая практически представляет собой небольшую область памяти, не используемую программой. Обычно это может быть в мертвом коде (код, который никогда не вызывается программой, по крайней мере, не в тех случаях, когда вы собираетесь его использовать) или в пространстве, оставленном компилятором для выравнивания (обычно вы не получаете более 15 байт таким образом). - person Vladimir Panteleev; 11.06.2009
comment
Прочтите эту статью: codeproject.com/KB/cpp/codecave.aspx. - он не описывает добавление нового раздела (что является промежуточным звеном между использованием пещер кода и DLL). Однако, если вы согласны с добавлением DLL в пакет, вы также можете просто добавить DLL в таблицу импорта (опять же, с помощью редактора PE), а затем исправить соответствующий код из вашей DLL, используя простые операции с указателями. - person Vladimir Panteleev; 11.06.2009

Есть несколько способов сделать это с помощью методов автоматизации тестирования, но самый простой — просто получить дескриптор окна для нужной кнопки и отправить ему BM_CLICK сообщение. Это предполагает, что у вас есть практические знания C/C++ в Windows. Если нет, есть другие средства, использующие .NET или другие технологии. Я не знаком с ida-pro или ollydbg.

person Lee    schedule 10.06.2009

См. этот Perl-модуль win32::guitest, он может помочь вам в этом. Вы можете написать с его помощью perl-скрипт и встроить его в свою программу. или вы можете использовать API-интерфейс win32, который упаковывает ваши необходимые потребности и использует его.

person dan    schedule 04.12.2009

Просто создайте вторую программу, которая запустит ее и отправит щелчок мышью, используя SendInput(...)

person Shay Erlichmen    schedule 10.06.2009