Простите за дебильный вопрос, однако сталкнулся с такой проблемой: Скомпилировал консольную программу "hello word" на C и решил посмотреть вызов функции печати консольной строки "hello word" в отладчике OllyDbg. Программа состояла из десятка функций типа CRTDDL.fputc, CRTDDL.memcpy, CRTDLL.fwrite etc. Я установил точку останова на функцию fwrite (bpx fwrite), которая судя по названию и должна писать строку в консоль, однако программа выполнилась до конца (RETN), то есть вызова функции не последовало. Как я понял у каждого языка собственные названия функций делающих по сути одно и тоже. Собственно как узнать правильное имя этой конкретной функции и вообще подскажите общий подход к определению имени нужной функции.
Почитать описание API например... Что советовать то что не знаешь сам. Таких функций в описании API нет и быть не может. До меня дошло что это стандартные C-функции спрятанные в модуле CRTDDL, следовательно fprintf() просто управляет функцией fputc(), которая и выводит символы в консоль, искать в отладчике надо было ее. Вот блин знатоки...
Под описанием API подразумевался MSDN, там же описаны и функции CRT. Так что не зарывайся. А вот за оскорбление участников форума тебе <font color="red]предупреждение</font><!--color-->.
basil > "Вот блин знатоки..." Ты прав - знатоков психиатрии и парапсихолгии тут не много Когда научишся задавать нормальные вопросы - заходи А пока ты не только вопрос (цитирую) "дебильный" задал, но и сам на него такой же ответ нашел "Дебильность" в том, что fputc с точки зрения здравой логики ничем не "правильнее" fprintf. Если ты покопаешься в сишных исходниках или продолжишь ковыряние в отладчике, то увидишь что fputc в свою очередь вызывает _write, которая вызывает kernel32.WriteFile, которая наконец-то вызывает kernel32.WriteConsoleA, которую можно считать "правильной" функцией, записывающей строку в скрин-буфер консоли (хотя при желании можно проследить путь и дальше до системного вызова). Если ты считаешь, что fputc это "правильная" и "нужная" функция, а WriteConsole "неправильная" и "ненужная", то тебе действительно стоит к другим знатокам обратиться ))) А если не считаешь, то должен признать, что вопрос был сформулирован неверно и совет "почитать описание API" был не лишним Если бы ты поставил бряк на WriteConsoleA, то по View Call stack сразу бы увидел бы всю цепочку вызовов от fprintf до WriteConsoleA и не морочил бы голову - ни себе, ни другим ) PS: Надеюсь - без обид
Уважаемый IceStudent у вас нестандартное понимание о том что есть оскорбление. Дабы не скатываться во флуд скажу что докопался отладчиком до WriteConsoleA. То есть схема вызова такая: fputc --> _flsbuf --> _write --> writefile --> WriteConsoleA. Спасибо leo за подсказку. Однако замечу что поставить бряк на WriteConsoleA сразу я не смог так как Олька в окне "Intermodular calls" в начале видит только явно вызываемые функции (то есть "bpx WriteConsoleA" - некатит). P.S. Здесь почти на каждый вопрос посылают погуглить и что-нибудь почитать. Лучше вообше ничего не отвечать, чем отвечать таким образом. P.P.S. Пока чему-нибудь научишься тебя смешают с грязью и повесят ярлык дебила, а вдобавок еще и выкинут с форума за "оскорбление участников форума".
bazil Если хочешь узнать, почему так, пожалуй, тебе всё же придётся прочитать это Если осилишь — сам поймёшь.
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, находишь функцию и ставишь бряк