Сейчас на форуме: bartolomeo, -Sanchez- (+4 невидимых) |
eXeL@B —› Вопросы новичков —› Исследование combobox |
Посл.ответ | Сообщение |
|
Создано: 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. Просьба объяснять попроще, т.к. взломом занимаюсь не по призванию, а по нужде (необходимо сократить объем работ на своем рабочем месте), и в асме мало что смыслю. |
|
Создано: 26 января 2006 12:08 · Личное сообщение · #2 CBS_UPPERCASE можеть быть также установлен после инициализации контрола к тому же полезнее ставить также бряк на SendMessage... хотя не бряк - SendMessage может быть туча, лучше дизасмить прогу в IDA и там отследить обращение к этому контролу посмотри, не берётся ли где хэндл (GetDlgItem) этого контрола для дальнейшего использования в SendMessage ----- EnJoy! |
|
Создано: 27 января 2006 05:49 · Личное сообщение · #3 Jupiter пишет: CBS_UPPERCASE можеть быть также установлен после инициализации контрола Не думаю, т.к. выставлял cbs_lowercase, и он действовал как ему и полагается. Если бы cbs_uppercase выставлялся после инициализации, то я все равно бы видел строки в верхнем регистре. Jupiter пишет: лучше дизасмить прогу в IDA и там отследить обращение к этому контролу На данном сайте дистрибутив IDA размером с мой месячный трафик. Нет ли варианта поменьше? Jupiter пишет: посмотри, не берётся ли где хэндл (GetDlgItem) этого контрола для дальнейшего использования в SendMessage Могу я отловить "дальнейшее использование в SendMessage" с помощью OllyDBG? |
|
Создано: 27 января 2006 08:01 · Личное сообщение · #4 |
|
Создано: 27 января 2006 15:43 · Личное сообщение · #5 Ysp пишет: Не думаю, т.к. выставлял cbs_lowercase, и он действовал как ему и полагается. ясно. я просто предупредил. после установки тобой cbs_lowercase символы всё равно конвертятся? какова задача? чтобы прога не переводила данные в верхний регистр? к тому же ты не сказал, на каком языке написана сия прога, ведь зачастую в VC и Delphi используются внутренние библиотечные ф-ции, не вызывая системные типа CharUpper я прочитал, что это за прога, но найти её не могу, выложи где-нить необходимый файл, я попробую глянуть. ----- EnJoy! |
|
Создано: 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), иначе не найдет свои файлы. |
|
Создано: 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! |
|
Создано: 02 февраля 2006 05:46 · Личное сообщение · #8 |
|
Создано: 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. |
|
Создано: 03 февраля 2006 17:02 · Личное сообщение · #10 Ysp пишет: WinSpy++ v1.6 она самая. в отличие от MS Spy позволяет также изменять значения, а не только следить Ysp пишет: а вот как сделать через GetComboBoxInfo <...> не пойму. я для этого прогу писал масенькую ;) mov hTargetWnd,eax
P.S. ЛС на форуме глючат ;( ----- EnJoy! |
|
Создано: 04 февраля 2006 15:14 · Личное сообщение · #11 |
|
Создано: 04 февраля 2006 17:21 · Личное сообщение · #12 Jupiter пишет: напиши в ПМ твоё мыло - вышлю патч Уря-я-я! Уже не надо. 0046b460 PUSH 1E поправил на PUSH 28, получил ограничение в 40 символов. 005cae87 OR AL,8 заполнил nop'ами, es_uppercase больше выставляется функцией SetWindowLong. Опиши, пожалуйста, свой путь выхода на нужный участок кода. Я по незнанию ходил пошагово F8, F7 и постоянно сверялся со справкой по API. Утомительно получилось. Спасибо, сдвинул меня с мертвой точки. |
|
Создано: 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! |
|
Создано: 08 февраля 2006 06:51 · Личное сообщение · #14 Jupiter Еще раз спасибо. Нужно учить API, хоть в Delphi и без него обходился. Jupiter пишет: ... Ищем в OllyDbg команду 'push 0FA9'... ... Да, после того как нашел в чем дело в остальных местах данного exe и остальных exe'шниках примерно так и поступал. Теперь правда другая проблема всплыла. При создании (переименовании) компонента, p-cad все равно считывает по 30 символов, хоть и могу вписать 40. Вот, разбираюсь... GetDlgItemText, WriteFile... Но об этом, в другое время и в другом топике. Эту тему, полагаю, можно закрыть. |
eXeL@B —› Вопросы новичков —› Исследование combobox |
Эта тема закрыта. Ответы больше не принимаются. |