Получить текст из окна специфического компонента

Тема в разделе "WASM.WIN32", создана пользователем prus, 7 фев 2009.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Всем привет!

    Стоит такая задача.
    Нужно получить текст из окна компонента.
    Есть некое приложение с компонентами, куда периодически выводится текстовая информация. С помощью Spy++ могу определить хендлы окон кампонентов. Думал сначала, что смогу вытащить оттуда текст при помощи GetWindowText или SendMessage(..., WM_GETTEXT, ...), однако это не помогло. Тем же Spy++ определил, что окошкам этих компонентов приходит сообщение WM_ERASEBACKGROUND, а WM_SETTEXT нету. Насколько я понимаю, получается, что информация представлена в этих компонентах как картинка. С помощью Process Explorer'a посмотрел, какие библиотеки подгружает это приложение и увидел там специфичные, насколько понял, разработанные разработчиками данной программы библиотеки.

    Каким образом можно определить, какая функция в данном приложении отвечает за отрисовку текста? Как вообще бы потрейсить приложение? Есть ли какие-нить готовые решения кроме OllyBbg и прочих отладчиков? Или только отладчиками это можно сделать?

    Помогите советом или мнением.

    Заранее благодарен!
     
  2. int2e

    int2e New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2009
    Сообщения:
    169
    Вариант 1. Черезжжооппный.
    1) Запускаешь приложение в OllyDbg.
    2) Запускаешь АртМани Про и Ищешь строку с текстом.
    Там же узнаешь адрес памяти, где хранится текст.
    3) Находишь этот указатель в ольке. Ставишь хардварный бряк на запись.
    4) Находишь кодес, который эту запись производит
    5) Сплайсишь.
    6) В импорт добавляешь свою дллку, куда ведет сплайс. В дллке получаешь нужный текст

    Вариант 2. Уё%#щный
    Открываешь приложение в отладчике и реверсишь.
    Наблюдаешь как выводится текст на окно. Если через жжоппу - тогда к варианту 1
    Если в пределах нормы - получаем текст иными путями, в зависимости от кода

    Вариант 3. Обычный
    Перепроверяешь свой код на ошибки. Есть большая вероятность, что ты просто не находишь нужное дочернее окно.
     
  3. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    int2e

    Спасиб за ответ!

    Мне больше понравился 3 вариант :).
    HWND для компонента беру из Spy++ и дальше GetWindowText:
    Код (Text):
    1. ...
    2. HWND hWnd = HWND(0x00030056);
    3. CHAR chMsg[256] = {0};
    4.  
    5. GetWindowText(hWnd, chMsg, 255);
    6. ...
    В результате в chMsg[] пусто, GetLastError() = 0.
    С окнами других приложений, например, NOTEPAD.EXE, такой вариант работает.

    Проблема в том, что я не знаю какую функцию перехватить и какие у нее параметры (один из которых должен содержать текст). Вот мне и нужно найти функцию (в каком модуле она расположена) и определить ее параметры. А сам перехват сделать, наверное, не составит большого труда.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а тебе не приходило в голову, что hwnd меняются от раза к разу? а вот поискать по имени и классу - это надежнее!
     
  5. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    max7C4

    Да, конечно. При каждом запуске приложения в Spy++ заного получаю информацию об окошках...

    Я уже говорил, что там, похоже, картинка а не текст. Распознавать не охото. Хочу перехватить функцию, которая получает текст и потом отрисовывает его на окне компонента. Но не знаю как найти эту функцию и какие у нее параметры и в каком модуле она располагается.
     
  6. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Ну если отрисовывает, то есть не так много вариантов: TextOut / DrawText или могли через GDI+ вывести текст (не помню чем, ищется по GDI+ Flat API).