Automatic Mouse and Keyboard
Решение проблем с размерами элемента
-
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 1003
Создано тем: 79
Рейтинг: 8
Репа:
(133|133|0)
Баллы: 1971
Был: 2025-09-11 22:24
Лайков: 216
Automatic Mouse and Keyboard
ВОПРОС:
При переводе текста на изображении и изменения его размера оно не помещается на кнопке.
Подскажите, пожалуйста, как мне изменить размеры кнопки, чтобы новое изображение полностью помещалось на кнопке?
Рис. 1Кто ищет, тот всегда найдет!
22 апреля 2024 - 20:15 / #1 -
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 1003
Создано тем: 79
Рейтинг: 8
Репа:
(133|133|0)
Баллы: 1971
Был: 2025-09-11 22:24
Лайков: 216
ОТВЕТ:
Инструменты:
- отладчик x64dbg (в описании используется англоязычный интерфейс);
- сканер оконных классов WinSpy++ (официальная или неофициальная).
Решение:
Для начала определяемся с размерами изображения для кнопки "Play". Оригинальное изображение, файл start.png из папки "images", имеет размеры 80x31 пикс., а, к примеру, новое изображение, с переведенным текстом, получилось с размерами 190x31 пикс (см. рис. 1).
Рис. 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
Вот и всё.Кто ищет, тот всегда найдет!
22 апреля 2024 - 20:29 / #2
Статистика форума, пользователей онлайн: 1 (за последние 20 минут)
- Создано тем
- 1223
- Всего сообщений
- 16484
- Пользователей
- 18265
- Новый участник
- scoocker1988
Powered by Bullet Energy Forum
