[Гайд] Разбираем шрифты клиента, OllyDBG + картинки

Автор Valorus, 2013 Июль 13, 20:34

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlineollydbgmu разработки developmentшрифты клиента

Valorus

Всем доброго времени суток. Недавно столкнулся с проблемой маленького шрифта в клиенте, и когда разобрался, решил написать этот гайд. Дело в том, что все шрифты(кроме, разумеется, кнопок) клиент отрисовывает с помощью GDI32.CreateFontA. Вот её прототип.
Спойлер
HFONT CreateFont(
int nHeight,              // высота шрифта
int nWidth,                // средняя ширина символа
int nEscapement,          // угол наклона
int nOrientation,          // угол ориентации базисной линии
int fnWeight,              // толщина шрифта
DWORD fdwItalic,          // описатель параметра курсивного шрифта
DWORD fdwUnderline,        // описатель параметра подчеркивания
DWORD fdwStrikeOut,        // описатель параметра зачеркивания
DWORD fdwCharSet,          // идентификатор набора символов
DWORD fdwOutputPrecision,  // точность вывода
DWORD fdwClipPrecision,    // точность отсечения
DWORD fdwQuality,          // качество вывода
DWORD fdwPitchAndFamily,  // шаг между символами шрифта и семейство
LPCTSTR lpszFace          // имя гарнитуры шрифта
);
[свернуть]
Итак, поехали.
1.Открываем main в ollydbg. Затем ПКМ по окну Disassembly -> Search for -> All Intermodular calls.

2.Нажали? теперь для ускорения поиска кликаем на заголовок колонки Destination для упорядочивания.

3.Теперь набираем на клавиатуре "createfont". Проверьте, чтобы была включена англ. раскладка. Когда закончите набор, увидите примерно следующее.

У меня, как видите, функция вызывается 5 раз, но у вас может быть и другое количество вызовов.
Перепишите адреса функций, т.к. они отвечают за разные шрифты, и чтобы увеличить весь шрифт, понадобится обработать все.
4.Нажимаем Enter , нас кидает в Disassembly на место вызова CreateFontA. Ну и отлично. Перед нами будет примерно такая картина:

Красной стрелочкой обозначен аргумент, отвечающий за размер шрифта. Меняя его, не забываем перевести желаемое значение из десятичной системы в шестнадцатиричную. Теперь, прыгая по адресам вызовов с помощью  Ctrl + G , меняем значения под себя. Пример смены значения : PUSH desiredSize , где desiredsize - желаемый размер. Я для себя поставил 0A , что соответствует 10px.
Вот, то получилось у меня :
Спойлер




[свернуть]
Спасибо за внимание.

Profesor08

И для каких разрешений окна этот метод приемлемый? Причем он уже описан был в разделе помощи с подводными камнями.

Valorus

Для любых разрешений. А в чем проблема? выставить размер то можно любой, но при большом размере, больше чем
интервал строк, разумеется буквы будут налазить.

GreeNLine


UnnamedNewbie

Цитироватьт.е изменяем PUSH ECX на PUSH 0A ?
Насколько я понимаю ECX - это регистр, а не значение.Не его менять нужно.
В принципе гайд хороший, вот только что менять автор так и не разложил по полкам.

Похожие темы (5)