Перехват вызова не WINAPI функции
От: Аноним  
Дата: 14.10.08 08:33
Оценка:
Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll?
1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?
3. Что делать дальше? В начало функции писать jump на мою функцию ?
4. Есть ли какие то средства облегчающие проведение таких операций?
Re: Перехват вызова не WINAPI функции
От: remark Россия http://www.1024cores.net/
Дата: 14.10.08 09:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll?

А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?
А>2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?
А>3. Что делать дальше? В начало функции писать jump на мою функцию ?
А>4. Есть ли какие то средства облегчающие проведение таких операций?

А Detours разве не умеет перехватывать функции не импортируемые из DLL?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Перехват вызова не WINAPI функции
От: _Dinosaur Россия  
Дата: 14.10.08 09:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll?

А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?

в случае статической линковки — да

А>2. Получается мне надо лопатить сегмент кода в поисках требуемой функции?


да. нужна сигнатура функции.
т.к. для разных сборок функция может оказаться в разных местах, то лопатить код придется...

А>3. Что делать дальше? В начало функции писать jump на мою функцию ?


да.
либо 0xCC (int 3) и ловить exception (могу ошибаться)

А>4. Есть ли какие то средства облегчающие проведение таких операций?


для поиска сигнатуры функции можно использовать IDA Pro
или дебаггеры, но потратишь больше времени
и еще сигнатуры для сборки Release и Debug скорее всего будут отличаться.
Завидую людям, которые могут себе позволить никуда не спешить.
Re[2]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 14.10.08 10:41
Оценка:
2 remark
На счет Detours ин. Может я не внимательно читал, но я что то не увидел этого явно. Ну вообщето там написано что Detours перехватывает что хочешь...Вы уверены что это можно сделать с помощью данной библиотеки?
Re[2]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 14.10.08 10:44
Оценка:
Здравствуйте, _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 скорее всего будут отличаться.


Ну хорошо что это выполнимо вообще ) но я надеюсь таки найти какие то удобные инструменты для этого ))
Re: Перехват вызова не WINAPI функции
От: Кодт Россия  
Дата: 14.10.08 12:03
Оценка: 2 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день. В сети полно примеров перехвата апи функций. Меня заинтересовала данная тем и я наткнулся на вопрос, а как быть с функциями не импортируемыми из dll?

А>1. Ведь я так понимаю что когда в коде используется функция например из stdio.h, то в исполняемом файле она находится не в таблице импорта, а целиком помещается в сегмент кода?

И больше того, она может быть инлайном и даже интринсиком.
Поэтому "в общем виде" такие задачи не решаются.
А в частном виде — зависит от.

Можно разжиться отладочной информацией (program database). Можно взять декомпилятор или дизассемблер. Можно расковырять исходники и подправить. Можно взять штатные точки кастомизации.
Например, перенаправить потоки ввода-вывода в твои пайпы, и делать с ними что хошь.

Поэтому расскажи о задаче, которая перед тобой стоит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Перехват вызова не WINAPI функции
От: Alexander G Украина  
Дата: 14.10.08 12:12
Оценка:
Здравствуйте, INsect, Вы писали:

IN>2 remark

IN>На счет Detours ин. Может я не внимательно читал, но я что то не увидел этого явно. Ну вообщето там написано что Detours перехватывает что хочешь...Вы уверены что это можно сделать с помощью данной библиотеки?

detours перехватывает вставкой постоянного jmp (перезаписанный код он копирует себе, вставляя после него jmp на продолжение). см доку.
Русский военный корабль идёт ко дну!
Re[4]: Перехват вызова не WINAPI функции
От: _Dinosaur Россия  
Дата: 14.10.08 12:41
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>detours перехватывает вставкой постоянного jmp (перезаписанный код он копирует себе, вставляя после него jmp на продолжение). см доку.


Это он динамически длину команд вычисляет?
Завидую людям, которые могут себе позволить никуда не спешить.
Re[5]: Перехват вызова не WINAPI функции
От: Alexander G Украина  
Дата: 14.10.08 13:04
Оценка:
Здравствуйте, _Dinosaur, Вы писали:

_D>Это он динамически длину команд вычисляет?

To copy instructions, Detours uses a simple table-driven disassembler.

Русский военный корабль идёт ко дну!
Re[2]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 14.10.08 21:50
Оценка:
Ну опишем условия задачи так:
1. Есть некая программа, необходимо подкорректировать ее поведение
2. Исходники на руках, но править их — крайний случай. не чистая работа скажем так.
3. править нужно поведение программы относительно вызова fwrite, а именно перехватывать эту функцию при вызове и в зависимости от аргументов глушить либо нет.
4. проект это ацкое поделие в borland 5-6, в лучших традициях code that smels hard)
5. сейчас рассматриваем именно такой вариант действий, других пока не предлагать...

Вот кстати заюзал Detours. Вернее попытался.
void* ptr = DetourFindFunction("text.exe", "fwrite")

функция возвращает NULL. В референсе написано:

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 ?
Re[4]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 15.10.08 05:44
Оценка:
Здравствуйте, Аноним, Вы писали:

IN>>Как вы думаете почему она так лажает?

А>А может проще #define fwrite hacked_fwrite ?

Безусловно проще, но к исходному коду прикасаться нежелательно.
Re[5]: Перехват вызова не WINAPI функции
От: Аноним  
Дата: 15.10.08 07:06
Оценка:
IN>Безусловно проще, но к исходному коду прикасаться нежелательно.
А к настройкам проекта, forceinclude сделать?
Re[6]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 15.10.08 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

IN>>Безусловно проще, но к исходному коду прикасаться нежелательно.

А>А к настройкам проекта, forceinclude сделать?

Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь.
Re[7]: Перехват вызова не WINAPI функции
От: Аноним  
Дата: 15.10.08 07:18
Оценка:
IN>Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь.
Сплайсинг считается менее рисковым чем пересборка проекта. Ужас какой
Re[8]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 15.10.08 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:

IN>>Все действия, требующие пересборки проекта будут рассматриваться в последнюю очередь.

А>Сплайсинг считается менее рисковым чем пересборка проекта. Ужас какой

Дело не в рискованности. Не будем об этом пока.
Re[3]: Перехват вызова не WINAPI функции
От: Alexander G Украина  
Дата: 15.10.08 07:39
Оценка:
Здравствуйте, INsect, Вы писали:

IN>Как вы думаете почему она так лажает?


Он может найти указатель по:
1. Таблице экспорта
2. Отладочной информации
Насколько я помню, Delphi не позволяет создавать .pdb файл, но он позволяет встраивать отладочную информацию в бинарник. Тогда бинарник будет в неск раз больше.

Если требуется вообще никогда не пересобирать бинарник, можно захардкодить адрес. Пересобирая, можно экспортировать этот адрес.
Русский военный корабль идёт ко дну!
Re[4]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 15.10.08 07:45
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, INsect, Вы писали:


IN>>Как вы думаете почему она так лажает?


AG>Он может найти указатель по:

AG>1. Таблице экспорта
AG>2. Отладочной информации
AG>Насколько я помню, Delphi не позволяет создавать .pdb файл, но он позволяет встраивать отладочную информацию в бинарник. Тогда бинарник будет в неск раз больше.

AG>Если требуется вообще никогда не пересобирать бинарник, можно захардкодить адрес. Пересобирая, можно экспортировать этот адрес.


Получается тогда, что искать придется вручную. плохо.
Re[5]: Перехват вызова не WINAPI функции
От: Alexander G Украина  
Дата: 15.10.08 07:49
Оценка: :)
Здравствуйте, INsect, Вы писали:

IN>Получается тогда, что искать придется вручную. плохо.


Вы таки хотите чтобы хак выглядел красиво ?
Русский военный корабль идёт ко дну!
Re[6]: Перехват вызова не WINAPI функции
От: INsect  
Дата: 15.10.08 07:53
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, INsect, Вы писали:


IN>>Получается тогда, что искать придется вручную. плохо.


AG>Вы таки хотите чтобы хак выглядел красиво ?


Хочу!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.