Перехват кода последующей функции

Тема в разделе "WASM.BEGINNERS", создана пользователем newb, 18 сен 2009.

  1. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Я не знал, как назвать тему. Хотелось бы вот что реализовать. Если игра, при помощи Spy++ я узнаю, что идет мессага WM_CHAR 'A', где мне ставить бп, чтобы попасть на функцию, следующую за мессагой. Спасибо.
     
  2. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Получаешь адрес WNDPROC (GetWindowLong, GWL_WNDPROC), устанавливаешь на свою функцию (SetWindowLong, GWL_WNDPROC) где вызываешь оригинал. Когда идет месага WM_CHAR 'A' в своей функции ставишь бп и обрабатываешь как надо, а оттуда уже можешь попасть на функцию.

    возможно я тебя не правильно понял.
     
  3. newb

    newb New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2008
    Сообщения:
    39
    Наверное просто тебя смутило слово "Перехват" в заголовке, мне нужно просто знать зде мне искать WM_CHAR что-бы я мог просто тупо на неё сделать бп, затем поидее я должен попасть в код функции(в игре), которая следует после WM_CHAR... Вот и всё, просто не представляю где находится WM_CHAR.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    newb
    речь идет об отладчике? очевидно да, или я не понял насчет бп.

    Находишь оконную процедуру. Иногда это затруднительно, но все-таки вполне реально. Где-то в начале будет неизбежная гребенка сравнений. Находишь ветку с WM_CHAR - ставишь туда бп. Некоторые отладчики позволяют ставить бп на вход в оконную процедуру с условием (wparam=WM_CHAR). Тогда гребенку сравнений можно и не искать.

    Где находится WM_CHAR? В переменной, передаваемой параметром функции. Это не имя функции. WM - означает window message, или что-то в этом духе. На самом деле, эта некоторая константа, для которой исключительно из соображений удобства придумали буквенное обозначение.
     
  5. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Так ты знаешь адрес откуда она вызывается? Если нет - ставь бряк на MessageBox и когда появится нужны - трассируй др ret/retn или посмотри адрес возврата в стеке. Или я тебя не понял..
     
  6. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    в Spy++ ее адрес показывается, думаю труда ее найти не должно составлять в отладчике.
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    а что такое "гребенка" - это характерный участок кода типа
    ...
    cmp eax, 0
    jz Case_zero
    cmp eax, 1
    jz Case_one
    ...

    Выглядит как расческа :))) и в виде машинных команд, и в виде мнемоник. При большом количестве обрабатываемых вариантов может меняться на обращения к таблицам или вычисление перехода по некоторым правилам, но суть остается та же - на яву это (как правило) Select case.