Основные форумы > RusMe - РусМи!

Удлинение строки

<< < (2/3) > >>

leserg73:
Нашел на одном из торрентов DrawPlus Х5 (тянул 2 дня, т.к. был один сид) и глянул вашу проблему. Если она еще актуальна, то предлагаю решение. Надеюсь, что вы умеете работать в отладчике OllyDbg. Итак нас интересует элемент управления с надписью "Opacity":



ID элемента равно FFFF, а его размеры 40х15 (ширина=40 (28h), высота=15 (Fh)). Загрузим исполняемый файл программы в отладчик OllyDbg и выполним поиск константы FFFF. Обычно, перед вызовом ID элемента идет инициализация его свойств (размеры, надпись, шрифт, цвет и т.д.) которые, обычно, выполняются командой PUSH. Получив список найденных констант, просмотрите код программы, по каждому пункту. Необходимо обращать внимание на то, чтобы рядом находились значения высоты или ширины искомого элемента. Но в данном случае мы ничего не найдем. Тогда можно попытаться определить место инициализации нашего элемента по ID строки с надписью "Opacity". Возможно где-то рядом есть вызов размеров элемента посредством условных или безусловных переходов, или при помощи вложенных функций или процедур (CALL). ID строки можно узнать в любом редакторе ресурсов, например, в том же Radialix:



Как видите порядковый номер строки 49, в шестнадцатеричном формате это значение 31h. Теперь в отладчике, нужно просмотреть код программы со всеми найденными значениями FFFF и обращать на команду помещения в стек значения 31h перед тем, как будет занесено в стек значение FFFF. Вы найдете одно такое место в коде программы:



Отметьте себе где-то найденный адрес, например, установите на него точку останова (бряк). Итак, у меня это адрес 0052DD38. Если просмотреть код чуть выше по листингу, или исследовать все рядом расположенные процедуры, то нас опять постигнет неудача: рядом нигде нет инициализации таких свойств данного элемента, как ширина (28h) и высота (Fh). Значит их формирование идет отдельным блоком (подпрограммой) где-то ранее. Как найти это место?

Зайдем с другой стороны. Выполним поиск другого, рядом расположенного элемента. Например элемента, который показывает значение в процентах параметра "Opacity". Вообще из своего опыта скажу, что если не удается напрямую найти элемент ни по его ID или по одному из размеров, то ищите его по одному из рядом расположенных элементов, у которого размеры выбиваются из ряда стандартных для данного интерфейса программы или являются уникальными. Выяснить это можно при помощи утилиты WinSpy и анализом значений размеров.



Его ID=D7B, тут же выпишем себе его размеры ширина=31 (1Fh), высота=18 (12h). Выполним поиск константы 1Fh, которая обозначает ширину данного элемента управления. Получим довольно внушительный список. Но, в первую очередь просмотрите только команды PUSH, и те, что находятся рядом с адресом 0052DD38, который мы нашли ранее, где в стек помещается ID строки "Opacity". В данном случае это адрес 0052B0FD.



Перейдем на этот адрес в отладчике и посмотрим на код. Здесь сразу бросается в глаза расположенная рядом команда PUSH 12. 12h в десятичном формате это число 18, которое также соответствует высоте элемента. Внимательный взгляд заметит также, что в данном участке кода похоже перечисляются размеры элементов управления исследуемой нами части интерфейса программы.



Теперь пролистайте листинг вверх, пока вам на глаза не попадутся значения ширины и высоты элемента управления с надписью "Opacity". Вот они:



Измените значение 28h, например, на 64h (100 px), сохраните изменения в файле. Вот и все. После перевода строка будет полностью помещаться в элементе. Можно, конечно, процедуру корректировки размеров элемента сделать после перевода, когда будет получен локализованный файл программы. Тогда в отладчике нужно будет уже работать с ним.

P.S. До этого был уверен, что в программах не может быть элементов управления с одинаковыми идентификаторами. Но продукция этого разработчика, в лице программы DrawPlus Х5,  поломала этот стереотип.

миха04:
leserg73, большое спасибо за объяснение. На одном из сайтов попадалась ваша тема, похожая чем-то. Я её читал, но...путного ничего не смог сделать. Я, честно говоря, так глубоко копать не готов. Приму к сведению ваше объяснение на будущее. Но переводить продолжу Х6.

миха04:
leserg73, пробовал сделать всё по вашему объяснению...полный облом, вообще ничего не нахожу. Например, на вкладке Line имеется элемент Join (Стык), при переводе обрезается буква С. ID элемента в WinSpy равно 09E6FEA0.То ли ОляДБГ не такая, или данные ввожу неправильно, то ли руки не для этого.  

leserg73:
Если я правильно понял, то речь идет о DrawPlus Х6, поэтому продолжу уже на ней.

На этой вкладке все немного по-другому. Во-первых, если идентификатор выбранного элемента больше FFFF, то его искать бесполезно, т.к. в статическом коде программы его попросту нет.  По крайней мере в моей практике ID с большим значением еще не встречалось, поэтому утверждать точно не берусь.



Нужно искать элемент или по его размерам (ширина, высота) или по другому элементу, расположенному рядом и если у него вменяемый идентификатор. Например, следующий



Здесь также, как в предыдущем примере, желательно делать перекрестную проверку по идентификатору искомой строки "Join". В Radialix'e можно глянуть номер строки ID=142, в шестнадцатеричном формате 8Eh. Необходимо смотреть, чтобы вызов строки и идентификатора элемента находились в одной подпрограмме.



После этого продолжаем поиск уже по значению или ширины элемента, или высоты. Например, я искал привязку по другому элементу (второй рисунок). У него одинаковые высота и ширина. И потом, таких элементов 7 штук, т.е. при поиске нужно обратить внимание на семикратное повторение команд типа PUSH 14, соответственно для ширины и высоты в одной подпрограмме. Вот смотри, есть такое место:



Вот теперь начинается самое интересное и это будет во-вторых. Если ты обратил внимание, то при изменении ширины всей панели, элементы управления на вкладке Line центрируются, причем у строк с надписями "Join", "Miter Limit" и "Dash Pattern" сделано выравнивание по правой стороне элемента. В этом случае компоновка элементов будет выполняться иначе и возможно потребуется изменять не только ширину элемента, но и его координату Х, но этого может и не быть. Изучаем этот участок кода дальше, пока не находим необходимый нам элемент и его формирование:



В общем, здесь есть одна засада. Дело в том, что размеры нашего элемента управления со строкой Join на этом участке кода берутся уже из стека. А вот откуда они туда попадают? Из-за недостаточного опыта работы в OllyDbg для меня это пока загадка. С такой проблемой я сталкиваюсь уже не первый раз, поэтому выход из положения нашел другой, неоднократно проверенный и рабочий на практике. Ставим точку останова по адресу 005D2C64 и запускаем программу на выполнение. После останова переходим в стек и изучаем дамп памяти на предмет подходящих нам значений.



Как видишь, выше есть значение 27h (в десятичном формате 39, что больше 25 (19h)). Теперь нужно просто подкорректировать смещение относительно адреса EBP. Обрати внимание, что размер значения должен быть DWORD (4 байта), а размер смещения не должен превышать 7F.

12DA48 - 12D9F0 = 58 (На твоем ПК адресация будет другой, но величина смещения для выбранного значения останется без изменений!)

Теперь по адресу 005D2C64 изменим команду:



Наконец, сохрани сделанные изменения в файл. Все. После этого переведенная строка будет помещаться в элементе управления полностью.

P.S. А почему ты перевел Join как "Стык"? Правильно будет "Соединение". А вот там дальше есть надпись Cap, так вот это есть "Стык".

NedMaker:

--- Цитата: leserg73 ---P.S. А почему ты перевел Join как "Стык"? Правильно будет "Соединение". А вот там дальше есть надпись Cap, так вот это есть "Стык".
--- Конец цитаты ---
Прошу прощения что вмешиваюсь, но...
Join переводится как Углы, а Cap это Концы а не как не Стык, это даже по картинке видно. Посмотрите в любом графическом редакторе. Во множественном числе, потому что применяется ко всем углам и обоим концами на линии.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии