Сейчас на форуме: _MBK_ (+6 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Изменение позиции и размера пользовательского элемента |
Посл.ответ | Сообщение |
|
Создано: 29 марта 2011 18:18 · Личное сообщение · #1 Решения не обнаружил, или из-за недостаточности знаний может не заметил, поэтому решил обратиться за помощью. Иногда при загрузке подопытного в редактор ресурсов (чаще всех используется Radialix) случается так, что в диалоговом ресурсе на форме не отображаются пользовательские элементы (контролы). При этом текст, который в них используется, обнаруживается, как "зашитый" в код. Хотя ссылки присуствуют, что означает на возможность удлинения текста без лишних хлопот, удлинить его на необходимую длину, превышающую оригинал, так чтобы текст отображался полностью, не удается. Причиной этому является недостаточный размер контрола. Хотелось бы в этом случае научиться изменять позицию и размер интересуемого элемента с помощью дизассемблера или отладчика (лучше с OllyDBG, так как он более ближе знаком из всех подобных). В целях экономии трафика желающих помочь, а также и времени на поиски подопытного рассматриваю один из ресурсов OllyDBG (в свое время, в ресурсе с диалогом настроек был замечен подобный случай). В попытке решить самому... загрузил в OllyDBG копию его же исполняемого файла (OLLYDBG.EXE) версии 1.10. Выполнил поиск ссылок на текст. Из всех интересуемых "скрытых" контролов обнаружился только текст "Browse", который имеется на двух кнопках в вкладке Appearance\Directories. По найденному перешел к дизассемблерному коду - скриншот ниже: ![]() Из имеющихся у меня знаний, получается, что за формирование элемена отвечает функция CreateWindowE, а за его размеры код, который я выделил на скриншоте. Поставил брекпоинт в начало (по адресу 0046EB1C) и после срабативания далее пошаговая отладка (F7\F8) до вызова функции (до адреса 0046EB5F). В стеке оказалось следующее: ![]() Судя по результатам WinSpy++, с помощью которого предварительно перед этим вычислял размеры интересуемых кнопок, этот найденный дизассемблированный код относится к верхней кнопке. Пробовал изменить вычитание в квадратных скобках (к примеру [EBP-588] заменял на [EBP-58C]) - в результате обе кнопки становятся квадратными. Почему обе, а не только верхняя не могу понять. Вычитание в квадратных скобках дает адреса в которых имеются значения позиции и размера (на скриншоте ниже адрес полученый при вычитании [EBP-594] в котором находися значение позиции по горизонтали): ![]() Чтобы продвинутся далее, не хватает знаний - не могу собразить как бы после изменений этих значений сохранить изменения. Почему такое большое различие адресов значеный и найденного кода? Если по этим адресам находятся временные значения, то в каком направлении двигатся чтобы найти постоянные значения? Направьте пожалуйста на путь истинный. ![]() |
|
Создано: 29 марта 2011 19:00 · Личное сообщение · #2 Меняются размеры обеих кнопок потому как приведённым вами кодом создаются обе кнопки. Вычитание в квадратных скобках - это есть локальная переменная, в которую где-то производится запись. Думаю правильнее будет менять значение самой переменно вместо того чтобы её подменять другой. Пропатчить экзешник, если он не накрыт каким-либо протом, можно прямо из Olly (Dump debugged prosess). Путь истенный, нужна практика. ----- Следуй за белым кроликом ![]() |
|
Создано: 29 марта 2011 19:57 · Поправил: inffo · Личное сообщение · #3 BaLera если надо поменять размер кнопки с сохранением изменений используй Restorator (редактор ресурсов) ![]() add: сорри не внимательно читал (Иногда при загрузке подопытного в редактор ресурсов). Согласен с neomant, а также если нужно сохранить изменения в Ольке правой клавишей давишь в окне дизасма и выбираешь Copy to executable -> All modifications -> Copy all -> правая клавиша -> Save file и будут тогда твои кнопки квадратные ![]() ![]() |
|
Создано: 29 марта 2011 20:49 · Поправил: BaLera · Личное сообщение · #4 После проведения эксперементов (с подменной в квадратных скобках) когда одновременно изменились обе кнопки тоже предполагаю, что приведенный код создает их обе, но вот только не пойму почему в стек заносятся значения (ID кнопки, позиция по вертикали) относящиеся имено к верхней кнопке. С подменной экспериментировал чисто для того чтобы убедится, что с помощью этой строке формируется нужное значение. Может неправильно понимаю, но считаю что вычитание в скобках и указывает на адрес переменной куда временно заносится значение. Но вот как вычислить место откуда производится запись остается пока для меня загадкой и желание прийти к решению не дает спокойствия. Может поможете с этим разобратся на примере какого-нибудь контрола Знаний и практики с Олькой пока к сожалению действительно маловато. Обычно когда производил изменения, то использовал Copy to executable. Что такое Dump debugged prosess пока не очень. P.S Пока сочинял пост пришол еще ответ написал inffo выбираешь Copy to executable -> All modifications -> Copy all -> правая клавиша -> Save file и будут тогда твои кнопки квадратные Назначение Copy to executable и его подпунктов мне знакомо, а вот почему их нельзя применить к строкам на третьем скриншоте не понятно. Наверное это связано с адресом. Квадратные кнопки мне не нужны, мне нужны кнопки (или другие элементы) нужного размера и в нужной позиции, вернее научится это делать. ![]() |
|
Создано: 29 марта 2011 21:08 · Личное сообщение · #5 |
|
Создано: 29 марта 2011 21:10 · Поправил: inffo · Личное сообщение · #6 BaLera посмотри, что происходит в dump поставь железный бряк на 0012D030, когда будешь стоять на адресе 0046EB32 в окне дизасма и посмотри, что происходит, как меняются значения. Максимум, что ты можешь сделать для своего варианта я написал в 3-ем посте ![]() BaLera пишет: вот почему их нельзя применить к строкам на третьем скриншоте не понятно Потому что на третьем скриншоте СТЕК, который меняется. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Изменение позиции и размера пользовательского элемента |