Исследование MFC

Тема в разделе "WASM.RESEARCH", создана пользователем blueboar, 15 мар 2008.

  1. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Кто-нибудь реверсировал программы, работающие с MFC? Там вместо WinMain четыре PUSH'а и переход на подпрограмму из MFC. Собственно хотелось во-первых узнать, как получить настоящий WinMain (или мож там еще несколько есть, не специалист). Пока я просто отладчиком прохожу несколько команд в библиотеке MFC и как вываливаюсь обратно в свою программу - ОНО :). Ну а во-вторых, где можно поподробнее почитать про внутреннюю структуру таких программ - какие там поля есть, где, как взаимодействие с MFC происходит и так далее. В крайнем случае - хотя бы список классов и методов MFC. Но хотелось бы побольше.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    blueboar
    Imho исходные тексты mfc доступны.
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    blueboar

    А ты писал программы и использованием MFC? Просто такие вопросы задаёшь, кажется, что MFC ты видел только в отладчике уже в виде набора опкодов :) Можно почитать про саму MFC, про её устройство и основные концепции написано и в MSDN, и в любой другой книге (самая новая Beginning Visual C++ 2005 by Ivon Horton). Так же, при исследовании полезно иметь соответствующии сигнатуры для иды и символы.
     
  4. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Да, видел в отладчике в вид набора опкодов. Вот и хотел узнать основные концепции. То есть в онлайне нету - только покупать?
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Можно поискать книжку Румянцева "MFC -- внутренний мир" (вышла ещё в 2003-м, так что, может быть, где-нибудь и выложена в электронном виде).
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    И еще есть неплохая статья о МФЦ в www.rsdn.ru
    Вобщем, blueboar - google first
     
  7. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    blueboar
    "В темную" концепция такая : действительно ты заполняешь поля, а сама MFC крутится где-то
    в своей среде. Дело имел только два раза : первый раз просто брейк на память делал,
    а второй раз использовал сигнатуры в ИДА, чтобы увидеть имена функций вместо ordinal.
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    c:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\
     
  10. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Итак, следуя совету, поразбирался с MFC изнутри и снаружи. Хотелось бы узнать вот чего (не кидайтесь тухлыми помидорами сразу, я ж только начинающий :)).

    В MFC-программе в секции данных лежит куча VTBL классов. Собсно возникают вопросы - как определить какому классу принадлежит VTBL
    Далее, в секции данных лежит также куча таблиц сообщений. Вопрос - как их можно быстро искать и как узнать к какому классу они относятся.
    Как их искать я примерно уже определился - одна из подпрограмм VTBL как раз возвращает указатель на них. Но тогда возникает еще один вопрос - где-то есть стандарт на порядок процедур в VTBL или нет? Как MFC узнает что вот третья процедура это рисование окошка а пятая это выход из программы? Ладно бы они все были однинаковы, так ведь для каждого класса разные и порядок и количество функций.

    В общем чем подробнее расскажете тем больше буду благодарен :))))
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Похоже недоразбирался ты еще, раз такие вопросы задаёшь.

    Виртуальные методы располагаются в порядке их объявления. Корневой класс для всех MFCшных классов - это CObject. Смотрим, какие у него есть виртуальные методы:
    Код (Text):
    1.     virtual CRuntimeClass* GetRuntimeClass() const;
    2.     virtual ~CObject() = 0;
    3.     virtual void Serialize(CArchive& ar);
    Таким образом, любая виртуальная таблица MFC-класса начинается с этих трёх методов. В частности, если исследовать, что возвращает GetRuntimeClass(), то можно выйти на структуру CRuntimeClass для данного класса, которая содержит в том числе и его имя. Нужно заметить, что за объявление этого метода и структуры CRuntimeClass в потомках отвечают макрос DECLARE_DYNAMIC. Иногда программисты забывают его добавить и тогда GetRuntimeClass() наследуется от родителя. Поэтому не нужно удивляться если в программе обнаружится несколько классов с вроде бы как одинаковым именем (например CDialog).
     
  12. blueboar

    blueboar New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2004
    Сообщения:
    110
    Адрес:
    Россия, Курган
    Ага, то есть указатель на структуру CRuntimeClass это значение, возвращаемое функцией GetRuntimeClass(). Хорошо. Тогда еще один вопрос - как получить для класса указатель на его карту сообщений? Сами карты я нахожу и интерпретировать умею, а связывать их с конкретными классами пока нет.