Логический шрифт
-
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 945
Создано тем: 79
Рейтинг: 8
Репа: (131|131|0)
Баллы: 1676
Был: 2024-07-28 22:59
Лайков: 167
Nexus, подожди, не кипятись. Обрати внимание, я вместо инструкции MOV DWORD PTR [ESP+93],1, использую инструкцию MOV BYTE PTR [ESP+93],1. Она на три байта короче предыдущей за счет указания другого типа данных. Тип DWORD нуждается в 4-х байтах, а BYTE - всего лишь в одном байте. С таким же успехом можно задать набор символов RUSSIAN_CHARSET, записав вместо 1h значение CCh:MOV BYTE PTR [ESP+93],0СС. Нет нужды использовать тип данных "двойное слово", если нужно изменить всего лишь один байт. Экономия в три байта это вполне существенно, особенно при не хватке или отсутствии достаточно свободного места. Мне тоже попадались программы, где свободного места в конце секции кода не было вообще, и, конечно, приходилось выкручиваться описанными тобой способами.
В данном конкретном случае можно обойтись без переноса кода. Нужно всего лишь немного подумать. Смотрим код:
По адресу 00404026 находится инструкция MOV DWORD PTR [ESP+7С],0Е. Её можно изменить на MOV BYTE PTR [ESP+7С],0Е, т.к. ранее область памяти под характеристики шрифта была очищена (заполнена нулями). Таким образом получим выигрыш в три байта. Далее, по адресам 00404010 - 00404020 идет побайтовая запись строки с названием шрифта. Это все можно заменить двумя инструкциями. В итоге код программы примет следующий вид:
Как видишь, по адресу 00404038 у нас еще один байт лишний остался. Но полученный код делает все тоже самое, что и оригинальный, но кроме него добавлена еще одна инструкция по установке набора символов (по адресу 00404030). Если нужна кириллица, то замени в ней значение 1h на CCh. Еще раз посмотри: мы ничего и никуда не переносили, только переделали участок кода.31 мая 2015 - 11:26 / #21 -
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 945
Создано тем: 79
Рейтинг: 8
Репа: (131|131|0)
Баллы: 1676
Был: 2024-07-28 22:59
Лайков: 167
Nexus, подожди, не кипятись. Обрати внимание, я вместо инструкции MOV DWORD PTR [ESP+93],1, использую инструкцию MOV BYTE PTR [ESP+93],1. Она на три байта короче предыдущей за счет указания другого типа данных. Тип DWORD нуждается в 4-х байтах, а BYTE - всего лишь в одном байте. С таким же успехом можно задать набор символов RUSSIAN_CHARSET, записав вместо 1h значение CCh:MOV BYTE PTR [ESP+93],0СС. Нет нужды использовать тип данных "двойное слово", если нужно изменить всего лишь один байт. Экономия в три байта это вполне существенно, особенно при не хватке или отсутствии достаточно свободного места. Мне тоже попадались программы, где свободного места в конце секции кода не было вообще, и, конечно, приходилось выкручиваться описанными тобой способами.
В данном конкретном случае можно обойтись без переноса кода. Нужно всего лишь немного подумать. Смотрим код:
По адресу 00404026 находится инструкция MOV DWORD PTR [ESP+7С],0Е. Её можно изменить на MOV BYTE PTR [ESP+7С],0Е, т.к. ранее область памяти под характеристики шрифта была очищена (заполнена нулями). Таким образом получим выигрыш в три байта. Далее, по адресам 00404010 - 00404020 идет побайтовая запись строки с названием шрифта. Это все можно заменить двумя инструкциями. В итоге код программы примет следующий вид:
Как видишь, по адресу 00404038 у нас еще один байт лишний остался. Но полученный код делает все тоже самое, что и оригинальный, но кроме него добавлена еще одна инструкция по установке набора символов (по адресу 00404030). Если нужна кириллица, то замени в ней значение 1h на CCh. Еще раз посмотри: мы ничего и никуда не переносили, только переделали участок кода.31 мая 2015 - 11:26 / #22 -
Оффлайн
Звание: Ветеран
Команда
Сообщений: 1211
Создано тем: 39
Рейтинг: 8
Репа: (42|41|-1)
Баллы: 86
Был: 2018-12-02 14:30
Лайков: 18
Leserg, Nexus, это уже высшая математика, нам простым смертным да такого очень далекоВозможно всё! На невозможное просто требуется больше времени.
Мудрец из Шангри Ла31 мая 2015 - 21:45 / #23 -
1 июня 2015 - 00:01 / #24
-
Leserg, ты допустил ошибку что похерил цикл побайтовой записи строки с названием шрифта Arial. Теперь программа не воспринимает название шрифта и выдает на экран тот, который стоит по умолчанию в системе пользователя. Попробуй после своей модификации поменять название шрифта Arial на Arial Black. В результате ничего не поменяется. А в оригинальном файле текст в окне About будет написан жирным шрифтом. В чем же причина? Причина в том, что на стек нужно запсывать собственно название шрифта, а после твоей правки на стек записывается адрес, где лежит название шрифта. В результате API функция CreateFont считывает какую-то белиберду вместо названия шрифта, ищет его в системе, естественно не находит и выставляет систеный шрифт по умолчанию, смотря у кого какой установлен.
Единственное место где можно подоптимизировать - это поменять MOV DWORD PTR [ESP+8C], 320 на MOV WORD PTR [ESP+8C], 320. Выигрыш будет еще в один байт. Дело в том, что DWORD - это 4 байта, а число 320 - это два байта, поэтому поставим WORD,т.е. двухбайтовое выражение. Только толку от такой оптимизации все равно никакой...Цитата: gazon01Leserg, Nexus, это уже высшая математика, нам простым смертным да такого очень далеко
Фигней страдаем1 июня 2015 - 00:07 / #25 -
Leserg, ты допустил ошибку что похерил цикл побайтовой записи строки с названием шрифта Arial. Теперь программа не воспринимает название шрифта и выдает на экран тот, который стоит по умолчанию в системе пользователя. Попробуй после своей модификации поменять название шрифта Arial на Arial Black. В результате ничего не поменяется. А в оригинальном файле текст в окне About будет написан жирным шрифтом. В чем же причина? Причина в том, что на стек нужно запсывать собственно название шрифта, а после твоей правки на стек записывается адрес, где лежит название шрифта. В результате API функция CreateFont считывает какую-то белиберду вместо названия шрифта, ищет его в системе, естественно не находит и выставляет систеный шрифт по умолчанию, смотря у кого какой установлен.
Единственное место где можно подоптимизировать - это поменять MOV DWORD PTR [ESP+8C], 320 на MOV WORD PTR [ESP+8C], 320. Выигрыш будет еще в один байт. Дело в том, что DWORD - это 4 байта, а число 320 - это два байта, поэтому поставим WORD,т.е. двухбайтовое выражение. Только толку от такой оптимизации все равно никакой...Цитата: gazon01Leserg, Nexus, это уже высшая математика, нам простым смертным да такого очень далеко
Фигней страдаем1 июня 2015 - 00:07 / #26 -
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 945
Создано тем: 79
Рейтинг: 8
Репа: (131|131|0)
Баллы: 1676
Был: 2024-07-28 22:59
Лайков: 167
Цитата: Nexus;16429Фигней страдаем
Ага, и не говори. Он даже gazon01"у стало интересно, чем это мы тут занимаемся. Там гляди народ потянется и больше не будет проблемы под названием "кракозябры". Надо почаще такие диспуты устраивать.Цитата: dinis124А программой Topo v1.2 можно решать такие проблемы?
Я не знаю, никогда такой программой не пользовался. Вообще весь мой опыт по удлинению секций сводился к дописыванию нулевых байтиков в конце файла при помощи НЕХ-редактора.2 июня 2015 - 00:43 / #27 -
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 945
Создано тем: 79
Рейтинг: 8
Репа: (131|131|0)
Баллы: 1676
Был: 2024-07-28 22:59
Лайков: 167
Цитата: NexusLeserg, ты допустил ошибку
Твоя правда. Тогда можно сделать так:
В этом случае тоже, ничего и никуда переносить не нужно.
Для адресации используем адрес из регистра ECX, который в текущий момент там находится. Тогда смещение будет меньше значения 7F, что уменьшит длину инструкций. Также не забываем оперировать типами данных (BYTE, WORD, DWORD).Цитата: NexusФигней страдаем
Ага, и не говори. Он даже gazon01"у стало интересно, чем это мы тут занимаемся. Там гляди народ потянется и больше не будет проблемы под названием "кракозябры". Надо почаще такие диспуты устраивать.Цитата: dinis124А программой Topo v1.2 можно решать такие проблемы?
Я не знаю, никогда такой программой не пользовался. Вообще весь мой опыт по удлинению секций сводился к дописыванию нулевых байтиков в конце файла при помощи НЕХ-редактора.2 июня 2015 - 00:43 / #28 -
Может кто помочь исправить кракозябры https://yadi.sk/d/5y-g6KHLmhuwR
Перевод не получился на тебя .. свалился...
6 января 2016 - 17:33 / #29 -
aNNiPAk, Просьба ни о чем. Да и не в нужной теме. Так что какой вопрос, такой и ответ - 0.7 января 2016 - 01:22 / #30
Статистика форума, пользователей онлайн: 0 (за последние 20 минут)
- Создано тем
- 1197
- Всего сообщений
- 15762
- Пользователей
- 18015
- Новый участник
- HELIUM