Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll?
1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?
3. Что делать дальше? В начало функции писать jump на мою функцию ?
4. Есть ли какие то средства облегчающие проведение таких операций?
Здравствуйте, Аноним, Вы писали:
А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll? А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода? А>2. Получается мне надо лопатить сегмент кода в поисках требуемой функции? А>3. Что делать дальше? В начало функции писать jump на мою функцию ? А>4. Есть ли какие то средства облегчающие проведение таких операций?
А Detours разве не умеет перехватывать функции не импортируемые из DLL?
Здравствуйте, Аноним, Вы писали:
А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll? А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
в случае статической линковки — да
А>2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?
да. нужна сигнатура функции.
т.к. для разных сборок функция может оказаться в разных местах, то лопатить код придется...
А>3. Что делать дальше? В начало функции писать jump на мою функцию ?
да.
либо 0xCC (int 3) и ловить exception (могу ошибаться)
А>4. Есть ли какие то средства облегчающие проведение таких операций?
для поиска сигнатуры функции можно использовать IDA Pro
или дебаггеры, но потратишь больше времени
и еще сигнатуры для сборки Release и Debug скорее всего будут отличаться.
Завидую людям, которые могут себе позволить никуда не спешить.
2 remark
На счет Detours ин. Может я не внимательно читал, но я что то не увидел этого явно. Ну вообщето там написано что Detours перехватывает что хочешь...Вы уверены что это можно сделать с помощью данной библиотеки?
Здравствуйте, _Dinosaur, Вы писали:
_D>Здравствуйте, Аноним, Вы писали:
А>>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll? А>>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
_D>в случае статической линковки — да
А>>2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?
_D>да. нужна сигнатура функции. _D>т.к. для разных сборок функция может оказаться в разных местах, то лопатить код придется...
А>>3. Что делать дальше? В начало функции писать jump на мою функцию ?
_D>да. _D>либо 0xCC (int 3) и ловить exception (могу ошибаться)
А>>4. Есть ли какие то средства облегчающие проведение таких операций?
_D>для поиска сигнатуры функции можно использовать IDA Pro _D>или дебаггеры, но потратишь больше времени _D>и еще сигнатуры для сборки Release и Debug скорее всего будут отличаться.
Ну хорошо что это выполнимо вообще ) но я надеюсь таки найти какие то удобные инструменты для этого ))
Здравствуйте, <Аноним>, Вы писали:
А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll? А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
И больше того, она может быть инлайном и даже интринсиком.
Поэтому "в общем виде" такие задачи не решаются.
А в частном виде — зависит от.
Можно разжиться отладочной информацией (program database). Можно взять декомпилятор или дизассемблер. Можно расковырять исходники и подправить. Можно взять штатные точки кастомизации.
Например, перенаправить потоки ввода-вывода в твои пайпы, и делать с ними что хошь.
Поэтому расскажи о задаче, которая перед тобой стоит.
Здравствуйте, INsect, Вы писали:
IN>2 remark IN>На счет Detours ин. Может я не внимательно читал, но я что то не увидел этого явно. Ну вообщето там написано что Detours перехватывает что хочешь...Вы уверены что это можно сделать с помощью данной библиотеки?
detours перехватывает вставкой постоянного jmp (перезаписанный код он копирует себе, вставляя после него jmp на продолжение). см доку.
Здравствуйте, Alexander G, Вы писали:
AG>detours перехватывает вставкой постоянного jmp (перезаписанный код он копирует себе, вставляя после него jmp на продолжение). см доку.
Это он динамически длину команд вычисляет?
Завидую людям, которые могут себе позволить никуда не спешить.
Ну опишем условия задачи так:
1. Есть некая программа, необходимо подкорректировать ее поведение
2. Исходники на руках, но править их — крайний случай. не чистая работа скажем так.
3. править нужно поведение программы относительно вызова fwrite, а именно перехватывать эту функцию при вызове и в зависимости от аргументов глушить либо нет.
4. проект это ацкое поделие в borland 5-6, в лучших традициях code that smels hard)
5. сейчас рассматриваем именно такой вариант действий, других пока не предлагать...
PVOID DetourFindFunction(
PCHAR pszModule,
PCHAR pszFunction
);
Parameters
pszModule
The path of the DLL or binary in which the function should be found.
pszFunction
The name of the function to be found.
Как вы думаете почему она так лажает?
Re[3]: Перехват вызова не WINAPI функции
От:
Аноним
Дата:
14.10.08 22:04
Оценка:
IN>Как вы думаете почему она так лажает?
А может проще #define fwrite hacked_fwrite ?
Здравствуйте, Аноним, Вы писали:
IN>>Безусловно проще, но к исходному коду прикасаться нежелательно. А>А к настройкам проекта, forceinclude сделать?
Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь.
Re[7]: Перехват вызова не WINAPI функции
От:
Аноним
Дата:
15.10.08 07:18
Оценка:
IN>Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь.
Сплайсинг считается менее рисковым чем пересборка проекта. Ужас какой
Здравствуйте, Аноним, Вы писали:
IN>>Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь. А>Сплайсинг считается менее рисковым чем пересборка проекта. Ужас какой
Здравствуйте, INsect, Вы писали:
IN>Как вы думаете почему она так лажает?
Он может найти указатель по:
1. Таблице экспорта
2. Отладочной информации
Насколько я помню, Delphi не позволяет создавать .pdb файл, но он позволяет встраивать отладочную информацию в бинарник. Тогда бинарник будет в неск раз больше.
Если требуется вообще никогда не пересобирать бинарник, можно захардкодить адрес. Пересобирая, можно экспортировать этот адрес.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, INsect, Вы писали:
IN>>Как вы думаете почему она так лажает?
AG>Он может найти указатель по: AG>1. Таблице экспорта AG>2. Отладочной информации AG>Насколько я помню, Delphi не позволяет создавать .pdb файл, но он позволяет встраивать отладочную информацию в бинарник. Тогда бинарник будет в неск раз больше.
AG>Если требуется вообще никогда не пересобирать бинарник, можно захардкодить адрес. Пересобирая, можно экспортировать этот адрес.
Получается тогда, что искать придется вручную. плохо.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, INsect, Вы писали:
IN>>Получается тогда, что искать придется вручную. плохо.
AG>Вы таки хотите чтобы хак выглядел красиво ?