Automatic Mouse and Keyboard

Решение проблем с размерами элемента
  1. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Automatic Mouse and Keyboard


    ВОПРОС:
    При переводе текста на изображении и изменения его размера оно не помещается на кнопке.
    Подскажите, пожалуйста, как мне изменить размеры кнопки, чтобы новое изображение полностью помещалось на кнопке?

    Automatic Mouse and Keyboard

    Рис. 1

    Кто ищет, тот всегда найдет!

    22 апреля 2024 - 20:15 / #1
  2. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    ОТВЕТ:

    Инструменты:
    - отладчик x64dbg (в описании используется англоязычный интерфейс);
    - сканер оконных классов WinSpy++ (официальная или неофициальная).

    Решение:

    Для начала определяемся с размерами изображения для кнопки "Play". Оригинальное изображение, файл start.png из папки "images", имеет размеры 80x31 пикс., а, к примеру, новое изображение, с переведенным текстом, получилось с размерами 190x31 пикс (см. рис. 1).

    Automatic Mouse and Keyboard

    Рис. 1


    Таким образом, исходная ширина изображения 80 пикс., а новая ширина 190 пикс.

    Далее запускаем программу. Пользуясь утилитой WinSpy++ определяем идентификатор кнопки, на которой находится это изображение. Для этого захватываем мышкой курсор-мишень в окне утилиты, наводим его на кнопку в окне программы и отпускаем курсор-мишень. В окне утилиты получаем информацию об этом элементе управления (см. рис. 2).


    Рис. 2


    Здесь нам нужны следующие данные: ID элемента – 8008 и размеры (WxH) – 83x37. Значение ширины при помощи калькулятора Windows переводим в шестнадцатеричный вид: 83 -> 53h, 37 -> 25h.

    Примечание: значение высоты по-большому счёту не нужно, т.к. высота изображения после перевода текста не изменилась, но может пригодиться при поиске в коде, если значения ID элемента и ширины нам не помогут.

    Открываем отладчик x64Dbg и присоединяемся к процессу программы: меню File -> Attach, выбираем из списка процесс AutoMouseKey и нажимаем кнопку [Attach]. Присоединившись к процессу продолжаем работу программы, нажав в отладчике [Run]. Тут же на вкладке "Memory Map" находим модуль нашей программы automousekey.exe и двойным щелчком по строке ".text" отправляем код программы в дизассемблер, вкладка "CPU".

    Теперь пробуем найти в коде значение 8008 – ID элемента. Одно из мест в коде, когда идёт обращение к элементу по его ID, является инициализация этого элемента управления (создание). Найдя такой участок кода, можно легко изменить свойства этого элемента управления. Делаем правый щелчок в окне дизассемблера и контекстном меню выбираем команду Search for -> Current Region -> Constant. В открывшемся диалоге, в поле "Expression", вводим значение 8008 и нажимаем [ОК]. Упс... Ничего нет. Такое может быть, если программа использует внешние библиотеки или она чем-то запакована. Смотрим в каталог с установленной программой и видим там файл библиотеки с именем главного исполняемого файла программы – AutoMouseKey.dll. Если переводили интерфейс, то уже знаете, что здесь находятся ресурсы файла AutoMouseKey.exe. Если ещё нет, то на него нужно обратить внимание в первую очередь.

    Возвращаемся в отладчик. На вкладке "Memory Map" находим модуль библиотеки automousekey.dll и двойным щелчком по строке ".text" отправляем код библиотеки в дизассемблер, вкладка "CPU". Здесь повторяем поиск константы 8008. Будет найдено 6 ссылок, которые будут показаны на вкладке "References". Исследуя код библиотеки по эти ссылкам нужно найти участок, где происходит инициализация элемента управления. А помогут с этим значения ширины и/или высоты данного элемента.

    Двойной щелчок по первой ссылке (команда push 8008) и мы в коде (на вкладке "CPU"). Изучаем код на предмет наличия значений 53h или 25h. Также могут быть другие признаки: заголовок элемента, текст всплывающей подсказки и др. Все это нужно держать в голове и учитывать при поиске. В данном случае по первой ссылке мы сразу же оказались в нужном месте (см. рис. 3).


    Рис. 3


    По адресу 7998С083 (у вас может быть другая адресация) к значению в регистре EAX прибавляется значение 53h (команда add eax,53). Это значение ни что иное, как ширина нашей кнопки. На самом деле здесь вычисляется значение координаты Х2: к значению координаты Х1 прибавляется значение с шириной элемента управления (кнопки). Далее по полученным координатам эта кнопка будет уже создана. Теперь дело за малым: записать в коде вместо 53h (83 пикс.) новое значение BEh (190 пикс.). Но сделать это напрямую нельзя из-за разной длины команды: add eax,53 – 3 байта, add eax,BE – 5 байт. При записи этой команды с новым значением, последующая команда в коде будет испорчена, что в конечном итоге приведёт к сбою программы. Поэтому по-нормальному нужно в коде найти свободное место (или использовать место в конце секции), добавить туда изменяемую команду и организовать безусловный переход туда и обратно. Но в данном конкретном случае в этом нет необходимости. Смотрим на последующие две команды, в которых по адресу в памяти [esp+1C] сначала записывается значение из регистра ECX, а потом оно перезаписывается значением из регистра EAX.


    Рис. 4


    Очевидно, что команда с переносом значения из регистра ECX является "пустой" (возможно ошибка программиста или причуды компилятора) и место, которое она занимает, можно использовать для модификации кода. Этим и воспользуемся. Ставим курсор на строку с командой add eax,53, нажимаем на клавиатуре клавишу "Пробел" и в открывшемся окне изменяем значение на свое. Здесь же обязательно отмечаем опцию "Fill with NOP's" (оставшиеся байты от испорченной команды будут заменены ничего не значащими инструкциями NOP) и нажимаем [OK].


    Рис. 5


    После подтверждения код в окне дизассемблера будет обновлен, а окно ассемблера предложит изменить следующую команду. Просто закрываем его, больше ничего нам менять не нужно. Теперь хорошо видно как отличается команда с новым значением от оригинальной: она благополучно затерла команду по адресу 7998C086 (см. рис. 4), оставив от неё два байта с инструкциями NOP (см. рис. 6).


    Рис. 6


    Сохраняем сделанные изменения в файл. Для этого открываем окно патча (меню View -> Patch file...), нажимаем кнопку [Patch File].


    Рис. 7


    Указываем новое имя файла библиотеки, например, AutoMouseKey-1.dll и подтверждаем запись. Готово.

    Проверяем сделанные изменения. Закрываем программу (или непосредственно или в отладчике). Оригинальный файл AutoMouseKey.dll переносим в безопасное место или переименовываем, а новому файлу с именем AutoMouseKey-1.dll даём оригинальное имя. После запускаем программу. Смотрим.


    Рис. 8


    Теперь изображение полностью помещается на кнопке и сама она выглядит корректно. Проверим поведение кнопки при наведении на неё курсора мышки. Обычные кнопки на панели инструментов в этом приложении выделяется прямоугольником другого цвета и соответствующего размера. Но в нашем случае ширина выделения изменённой кнопки осталась без изменений, что выглядит некорректно (см. рис. 9).


    Рис. 9


    Раз на кнопке применялось изображение, то возможно для состояния наведения также используется изображение. Проверяем изображения в папке "images". И в ней действительно обнаруживаются подобные изображения в формате .bmp. Конкретно нашей кнопки соответствует файл изображения tool_bk_play.bmp. Ширина этого изображения - 83 пикс. Откроем его в графическом редакторе и отредактируем на значение новой ширины - 190 пикс.


    Рис. 10


    Сохраним изменения и перезапустим программу. Подведём к кнопке курсор. Вот теперь выделение кнопки отображается корректно.


    Рис. 11


    Вот и всё.
    NNK_RTR, Смотрящий, 78Sergey нравится это сообщение.

    Кто ищет, тот всегда найдет!

    22 апреля 2024 - 20:29 / #2

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1177
Всего сообщений
15352
Пользователей
17856
Новый участник
Daniel7375ysk