Автор Тема: Удлинение строки  (Прочитано 11263 раз)

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« : 07 Апреля 2014, 18:51:01 »
В программе имеются вкладки, строки которых расположены в строковом ресурсе. При этом WinHex их не находит вообще, а в Radialx отсутствуют ссылки на эти строки. У меня сложилось впечатление, что тут используются поля, которые и ограничивают длину слова. Для просмотра данных строки использовал WinSpy, который показал класс Static  (см. скрин). Не пойму, как с этим бороться.

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Удлинение строки
« Ответ #1 : 07 Апреля 2014, 23:26:58 »
Длина строки ограничена размером элемента управления, в котором находится эта строка.



С помощью того же WinSpy попробуйте увеличить ширину (W) элемента. Будет получаться? Если да, то нужно будет в отладчике искать этот элемент управления и менять его ширину. К сожалению мне не удалось в сети найти рабочие ссылки на DrawPlus Х5, скачал только DrawPlus Х6 и там этой проблемы нет.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« Ответ #2 : 08 Апреля 2014, 09:03:01 »
В DrawPlus Х6 это поле увеличивается автоматически даже при изменении ширины вкладки, а вот в Х5 стоит ограничение. И где искать это поле - не имею представления.

Оффлайн Metabolic

  • Новичок
  • *
  • Сообщений: 42
    • http://
Удлинение строки
« Ответ #3 : 08 Апреля 2014, 18:32:22 »
миха04 если есть желание поработать с OllyDbg посмотри данный пост: ->Изменение размеров и координат<-

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« Ответ #4 : 08 Апреля 2014, 20:00:06 »
Metabolic, к сожалению у меня ничего не получилось. Искать в отладчике можно только по размеру, так как ID имеет значение 0000FFFF. А вот с поиском по размеру тёмный лес, выпадает большая куча строк. Убил больше часа, но так ничего и не добился. Проще наверное взяться за DrawPlus Х6, там хоть такой проблемы нет.

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Удлинение строки
« Ответ #5 : 10 Апреля 2014, 21:01:55 »
Нашел на одном из торрентов 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

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« Ответ #6 : 10 Апреля 2014, 21:56:13 »
leserg73, большое спасибо за объяснение. На одном из сайтов попадалась ваша тема, похожая чем-то. Я её читал, но...путного ничего не смог сделать. Я, честно говоря, так глубоко копать не готов. Приму к сведению ваше объяснение на будущее. Но переводить продолжу Х6.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« Ответ #7 : 12 Апреля 2014, 16:42:44 »
leserg73, пробовал сделать всё по вашему объяснению...полный облом, вообще ничего не нахожу. Например, на вкладке Line имеется элемент Join (Стык), при переводе обрезается буква С. ID элемента в WinSpy равно 09E6FEA0.То ли ОляДБГ не такая, или данные ввожу неправильно, то ли руки не для этого.  
« Последнее редактирование: 12 Апреля 2014, 17:30:38 от миха04 »

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Удлинение строки
« Ответ #8 : 13 Апреля 2014, 04:10:36 »
Если я правильно понял, то речь идет о 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

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1130
  • The Vigilant Observer
    • nrgizer.msilab.net
Удлинение строки
« Ответ #9 : 13 Апреля 2014, 06:47:40 »
Цитата: leserg73
P.S. А почему ты перевел Join как "Стык"? Правильно будет "Соединение". А вот там дальше есть надпись Cap, так вот это есть "Стык".
Прошу прощения что вмешиваюсь, но...
Join переводится как Углы, а Cap это Концы а не как не Стык, это даже по картинке видно. Посмотрите в любом графическом редакторе. Во множественном числе, потому что применяется ко всем углам и обоим концами на линии.
« Последнее редактирование: 13 Апреля 2014, 06:59:08 от NedMaker »

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Удлинение строки
« Ответ #10 : 13 Апреля 2014, 19:30:29 »
Цитата: NedMaker
Прошу прощения что вмешиваюсь, но...
Одна голова хорошо, а две ещё лучше.

миха04, добил твою надпись "Join". Если глянуть начало подпрограммы, в которой я предлагал изменить команду по адресу 005D2C64, то там видно, что значение ширины указанного и других элементов на этой вкладке берется из ресурсов:



Поэтому имеет смысл изменить значение ширины в ресурсах программы, а не в коде. Открой файл программы в НЕХ-редакторе и задай поиск строки "LineTabJoinLabelWidth" в кодировке Unicode.



Нажми ОК. Первое найденное вхождение это будет имя переменной, которое показано в отладчике (см. первый рисунок в этом сообщении). Пропусти его и продолжи поиск. Будет найдена следующее вхождение. Вот оно то нам и надо. Смотри внимательно на текстовую часть редактора, после искомого слова.



Измени значение на желаемое (формат значения - Unicode!) и сохрани изменения в файле. Если посмотришь файл ниже от того места, где изменил значения, то увидишь там значения ширины и для некоторых других элементов управления. При необходимости их также можно подогнать в соответствии с переводом.

Вот пожалуй и все. Желаю удачи!

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Удлинение строки
« Ответ #11 : 13 Апреля 2014, 22:31:13 »
leserg73, ещё раз большое спасибо за объяснения, буду ковыряться. Ну а по поводу перевода Join(Стык), его я взял из описания к Adobe Illustrator, так как стыкуются линии. В справке к Х6 это описывается как Контур угла двух пересекающихся линий, так что действительно это более похоже на Угол, NedMaker прав.

Пы.сы. Попробовал последний совет про WinHex, как наиболее простой - помогло . С Олей я конечно пытаюсь подружиться, но...любовь пока не взаимная.
« Последнее редактирование: 13 Апреля 2014, 23:02:01 от миха04 »