Поиск нужной функции при отладке

Тема в разделе "WASM.BEGINNERS", создана пользователем bazil, 6 ноя 2005.

  1. bazil

    bazil New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    4
    Адрес:
    Russia
    Простите за дебильный вопрос, однако сталкнулся с такой проблемой:

    Скомпилировал консольную программу "hello word" на C и решил посмотреть вызов функции печати консольной строки "hello word" в отладчике OllyDbg. Программа состояла из десятка функций типа CRTDDL.fputc, CRTDDL.memcpy, CRTDLL.fwrite etc. Я установил точку останова на функцию fwrite (bpx fwrite), которая судя по названию и должна писать строку в консоль, однако программа выполнилась до конца (RETN), то есть вызова функции не последовало. Как я понял у каждого языка собственные названия функций делающих по сути одно и тоже. Собственно как узнать правильное имя этой конкретной функции и вообще подскажите общий подход к определению имени нужной функции.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348




    Почитать описание API например...
     
  3. bazil

    bazil New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    4
    Адрес:
    Russia
    Почитать описание API например...

    Что советовать то что не знаешь сам. Таких функций в описании API нет и быть не может. До меня дошло что это стандартные C-функции спрятанные в модуле CRTDDL, следовательно fprintf() просто управляет функцией fputc(), которая и выводит символы в консоль, искать в отладчике надо было ее.

    Вот блин знатоки...
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine




    Под описанием API подразумевался MSDN, там же описаны и функции CRT. Так что не зарывайся.



    А вот за оскорбление участников форума тебе <font color="red]предупреждение</font><!--color-->.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    basil

    > "Вот блин знатоки..."

    Ты прав - знатоков психиатрии и парапсихолгии тут не много ;)

    Когда научишся задавать нормальные вопросы - заходи ;)

    А пока ты не только вопрос (цитирую) "дебильный" задал, но и сам на него такой же ответ нашел ;)

    "Дебильность" в том, что fputc с точки зрения здравой логики ничем не "правильнее" fprintf. Если ты покопаешься в сишных исходниках или продолжишь ковыряние в отладчике, то увидишь что fputc в свою очередь вызывает _write, которая вызывает kernel32.WriteFile, которая наконец-то вызывает kernel32.WriteConsoleA, которую можно считать "правильной" функцией, записывающей строку в скрин-буфер консоли (хотя при желании можно проследить путь и дальше до системного вызова). Если ты считаешь, что fputc это "правильная" и "нужная" функция, а WriteConsole "неправильная" и "ненужная", то тебе действительно стоит к другим знатокам обратиться :)))) А если не считаешь, то должен признать, что вопрос был сформулирован неверно и совет "почитать описание API" был не лишним ;) Если бы ты поставил бряк на WriteConsoleA, то по View Call stack сразу бы увидел бы всю цепочку вызовов от fprintf до WriteConsoleA и не морочил бы голову - ни себе, ни другим ;))



    PS: Надеюсь - без обид ;)
     
  6. bazil

    bazil New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    4
    Адрес:
    Russia
    Уважаемый IceStudent у вас нестандартное понимание о том что есть оскорбление.

    Дабы не скатываться во флуд скажу что докопался отладчиком до WriteConsoleA. То есть схема вызова такая: fputc --> _flsbuf --> _write --> writefile --> WriteConsoleA. Спасибо leo за подсказку. Однако замечу что поставить бряк на WriteConsoleA сразу я не смог так как Олька в окне "Intermodular calls" в начале видит только явно вызываемые функции (то есть "bpx WriteConsoleA" - некатит).

    P.S. Здесь почти на каждый вопрос посылают погуглить и что-нибудь почитать. Лучше вообше ничего не отвечать, чем отвечать таким образом.

    P.P.S. Пока чему-нибудь научишься тебя смешают с грязью и повесят ярлык дебила, а вдобавок еще и выкинут с форума за "оскорбление участников форума".
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    bazil



    Если хочешь узнать, почему так, пожалуй, тебе всё же придётся прочитать это :) Если осилишь — сам поймёшь.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    basil

    > "Однако замечу что поставить бряк на WriteConsoleA сразу я не смог"

    Потому, что нужно использовать не Intermodular calls, а Search for Name (label) in current module. Получаешь полный список всех импортируемых имен, находишь нужное имя и дальше можно поставить бряки на все вызовы Set breakpoint on every reference или для начала посмотреть вызовы Find references to import и поставить Toggle breakpoint на нужные вызовы (т.к. на переходник thunk JMP ставить бряк в NT смысла нет)



    PS: Хе, написал и понял, что не в ту степь ;), т.к. в твоей проге WriteConsoleA может явно и не импортироваться. Правильный ответ такой: зная что вывод текста в консоль производится WriteConsoleA(W) переключаешь View на kernel32.dll и делаешь Search for Name, находишь функцию и ставишь бряк