Сейчас на форуме: bartolomeo, -Sanchez- (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Исследование combobox
Посл.ответ Сообщение

Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 26 января 2006 07:38
· Личное сообщение · #1

Имеется combobox со свойством cbs_simple (сверху как бы Edit, а под ним как бы ListBox), который при выборе строки из списка мышью, подставляет сверху выбранную строку, но со всеми буквами в верхнем регистре.

Еще данный combobox имеет ограничение на количество вводимых символов.

Вопрос: как можно найти тот участок кода, который конвертирует буквы в верхний регистр и проверяет количество введенных символов.

Немного о проделанной работе: брикпоинт на API CharUpperA не срабатывает, подстановка вместо него nop, тоже не дает эффекта. Свойство cbs_uppercase не активно. Если вместо cbs_simple выставить cbs_dropdownlist, то выбор происходит нормально, но такой вид combobox не нужен. Пытался найти какое-нибудь событие, чтобы попасть в нужный код, но ничего кроме keydown не придумал. По keydown я попадаю во всякие gdi32 и kernel'ы и после выхода в тело программы оказываюсь в цикле с PeekMesage, по которому пошагово можно ходить целую вечность.

Программа: Схематик - sch.exe из состава P-CAD2002. Исследуемый combobox расположен в диалоговом окне Place Part, вызываемом командой place part. Сам диалог находится в schrsc.dll.

P.S. Просьба объяснять попроще, т.к. взломом занимаюсь не по призванию, а по нужде (необходимо сократить объем работ на своем рабочем месте), и в асме мало что смыслю.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 26 января 2006 12:08
· Личное сообщение · #2

CBS_UPPERCASE можеть быть также установлен после инициализации контрола
к тому же полезнее ставить также бряк на SendMessage... хотя не бряк - SendMessage может быть туча, лучше дизасмить прогу в IDA и там отследить обращение к этому контролу
посмотри, не берётся ли где хэндл (GetDlgItem) этого контрола для дальнейшего использования в SendMessage

-----
EnJoy!




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 января 2006 05:49
· Личное сообщение · #3

Jupiter пишет:
CBS_UPPERCASE можеть быть также установлен после инициализации контрола

Не думаю, т.к. выставлял cbs_lowercase, и он действовал как ему и полагается. Если бы cbs_uppercase выставлялся после инициализации, то я все равно бы видел строки в верхнем регистре.
Jupiter пишет:
лучше дизасмить прогу в IDA и там отследить обращение к этому контролу

На данном сайте дистрибутив IDA размером с мой месячный трафик. Нет ли варианта поменьше?
Jupiter пишет:
посмотри, не берётся ли где хэндл (GetDlgItem) этого контрола для дальнейшего использования в SendMessage

Могу я отловить "дальнейшее использование в SendMessage" с помощью OllyDBG?




Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 27 января 2006 08:01
· Личное сообщение · #4

Ysp
В дистрибе с MS Visual Studio утилка Spy++ (Spyxx.exe для запуска)
С ее помощью ты можешь отследить все сообщения, которые приходят нужному контролу... Или выбрать только те, которые хо увидеть...

-----
DREAMS CALL US





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 27 января 2006 15:43
· Личное сообщение · #5

Ysp пишет:
Не думаю, т.к. выставлял cbs_lowercase, и он действовал как ему и полагается.

ясно. я просто предупредил.
после установки тобой cbs_lowercase символы всё равно конвертятся?
какова задача? чтобы прога не переводила данные в верхний регистр?
к тому же ты не сказал, на каком языке написана сия прога, ведь зачастую в VC и Delphi используются внутренние библиотечные ф-ции, не вызывая системные типа CharUpper

я прочитал, что это за прога, но найти её не могу, выложи где-нить необходимый файл, я попробую глянуть.

-----
EnJoy!




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 января 2006 14:46
· Личное сообщение · #6

после установки тобой cbs_lowercase символы всё равно конвертятся?
Нет, все переводятся в нижний регистр. Из чего сделал вывод, что uppercase при инициализации не выставляется.
какова задача?
Использовать буквы обоих регистров. Снять ограничение в 30 вводимых символов (или увеличить до 40).
на каком языке написана сия прога
Microsoft Visual C++ 6.0

Выложил на webfile.ru/782536 . Доступно до 7 февраля. Архив около 2,7МБайт, т.к. прога выдернута из целого пакета программ P-CAD.
Размести распакованый каталог в корне диска C: (или поправь пути в ini), иначе не найдет свои файлы.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 02 февраля 2006 05:13
· Личное сообщение · #7

cкачал, установил в C:\P-CAD, всё работает
иду в меню Place->Part (можно и по клику на тулбаре)
открывается диалоговое окно Place Part (в ресурсах номер 622), вижу ComboBox, заполненный значениями типа "BCN16-4A 103 J7"
запускаю WinSpy++, смотрю на свойства данного Edit контрола (в составе комбобокса) - он имеет стиль ES_UPPERCASE, убираю этот стиль. в окне можно печатать любые буквы, но макс. 29 символов
при закрытии окна и его повторном открытии снова устанавливается стиль ES_UPPERCASE

итак, номер ComboBox (ID): 4009 | 0FA9h
через GetComboBoxInfo беру hwndItem (хэндл Edit контрола), устанавливаю стиль без ES_UPPERCASE (WS_CHILD or WS_VISIBLE or ES_NOHIDESEL)
но при повторном открытии окна стиль утсанавливается вновь
как я заметил, если установлен ES_UPPERCASE, то элемент не вставится, если в нём есть символы в нижнем регистре

-----
EnJoy!





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 02 февраля 2006 05:46
· Личное сообщение · #8

Ysp
сделал, чтобы ES_UPPERCASE не устанавливался
длина строки - та же, видимо, всё дело в коротком буфере под строку

напиши в ПМ твоё мыло - вышлю патч

-----
EnJoy!




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 03 февраля 2006 06:26
· Личное сообщение · #9

Jupiter пишет:
запускаю WinSpy++ ... устанавливаю стиль без ES_UPPERCASE...

Скачал WinSpy++, для моих целей подошла лучше чем Spy++ из MS Visual Studio. ES_UPPERCASE убирается, а вот как сделать через GetComboBoxInfo беру hwndItem (хэндл Edit контрола) не пойму.

WinSpy++ v1.6 Copyright(c) 2002 by Catch22 Productions.Written by J Brown.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 03 февраля 2006 17:02
· Личное сообщение · #10

Ysp пишет:
WinSpy++ v1.6

она самая. в отличие от MS Spy позволяет также изменять значения, а не только следить

Ysp пишет:
а вот как сделать через GetComboBoxInfo <...> не пойму.

я для этого прогу писал масенькую ;)
mov hTargetWnd,eax
invoke GetDlgItem,eax,IDC_TARGET_CTRL
.If eax
lea edx, pCBi
mov [edx].COMBOBOXINFO.cbSize, size COMBOBOXINFO
invoke GetComboBoxInfo,eax,edx
.If eax
lea edx, pCBi
mov eax, [edx].COMBOBOXINFO.hwndItem
mov hCtrl,eax
invoke SetWindowLong,hCtrl,GWL_STYLE,NEW_STYLE
...


P.S. ЛС на форуме глючат ;(

-----
EnJoy!




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 февраля 2006 15:14
· Личное сообщение · #11

Jupiter пишет:
напиши в ПМ твоё мыло - вышлю патч
...
P.S. ЛС на форуме глючат ;(

Если удалось прочесть личное сообщение, то высылай по указанному там адресу. Если нет, то на этот yesipov<собака>yandex.ru

Можешь ограничиться указанием в форуме куска кода, который надо править.



Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 04 февраля 2006 17:21
· Личное сообщение · #12

Jupiter пишет:
напиши в ПМ твоё мыло - вышлю патч

Уря-я-я! Уже не надо.
0046b460 PUSH 1E поправил на PUSH 28, получил ограничение в 40 символов.
005cae87 OR AL,8 заполнил nop'ами, es_uppercase больше выставляется функцией SetWindowLong.

Опиши, пожалуйста, свой путь выхода на нужный участок кода. Я по незнанию ходил пошагово F8, F7 и постоянно сверялся со справкой по API. Утомительно получилось.

Спасибо, сдвинул меня с мертвой точки.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 07 февраля 2006 18:11
· Личное сообщение · #13

Ysp
молодец, нашёл то, что нужно
итак, мой метод:

Поскольку при установке в редакторе ресурсов стиля для ComboBox'a, этот стиль сохранялся, значит прога перед установкой стиля запрашивает текущий стиль, т.е перед вызовом SetWindowLong идёт вызов GetWindowLong. Следовательно, нужно найти кусок кода, где вызывался бы GetWindowLong с параметром GWL_STYLE.
Синтаксис ф-ции: LONG GetWindowLong(HWND hWnd,int nIndex);
Первым параметром идёт хэндл контрола (окна), для которого устанавливается стиль.
Но для того, чтобы передать в ф-цию хэндл контрола, нужно его (хэндл) сначала получить. Делается это ф-цией GetDlgItem.
Синтаксис ф-ции: HWND GetDlgItem(HWND hDlg,int nIDDlgItem);
Значит в коде проге где-то должен быть код, передающий в ф-цию GetDlgItem параметр nIDDlgItem, равный ID контрола.
ID нашего ComboBox - 4009 (FA9h), это можно увидеть в редакторе ресурсов. Ищем в OllyDbg команду 'push 0FA9', либо её hex аналог 68 A90F0000.
для справки: Ctrl-F - поиск команды, Ctrl-B - поиск данных

находим:
1-й раз здесь:
0046B345 |. 68 A90F0000 push 0FA9
0046B34A |. 8BCE mov ecx, esi
0046B34C |. E8 8FF91500 call <SCH.CBResetContent>

здесь идёт очистка ComboBox

2-й раз
0046B410 . 68 A90F0000 push 0FA9
0046B415 . 8D8E A7020000 lea ecx, dword ptr ds:[esi+2A7]
0046B41B . E8 05C32F00 call SCH.00767725

уже близко!

3-й раз:
0046B460 6A 1E push 1E
0046B462 68 A90F0000 push 0FA9
0046B467 . 8BCE mov ecx, esi
0046B469 . E8 42F81500 call <SCH.SetCBTextLimit>
0046B46E . 6A 01 push 1
0046B470 . 68 A90F0000 push 0FA9
0046B475 . 8BCE mov ecx, esi
0046B477 . E8 94F91500 call <SCH.SetWndStyle>

нашли!

P.S. форматирование нихрена не сохраняется, по мылу те отправлю нормальный вар-т

-----
EnJoy!




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 февраля 2006 06:51
· Личное сообщение · #14

Jupiter
Еще раз спасибо. Нужно учить API, хоть в Delphi и без него обходился.
Jupiter пишет:
...
Ищем в OllyDbg команду 'push 0FA9'...
...

Да, после того как нашел в чем дело в остальных местах данного exe и остальных exe'шниках примерно так и поступал.

Теперь правда другая проблема всплыла. При создании (переименовании) компонента, p-cad все равно считывает по 30 символов, хоть и могу вписать 40. Вот, разбираюсь... GetDlgItemText, WriteFile... Но об этом, в другое время и в другом топике. Эту тему, полагаю, можно закрыть.


 eXeL@B —› Вопросы новичков —› Исследование combobox
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати