подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 12:45
Оценка:
Есть приложение, которое использует библиотеку ABC.dll
в этой библиотеке описана экспортная функция void aaa();
Я хочу что бы когда это приложение запускалось, оно бы грузило ABC.dll, а та, в свою очередь брала бы функцию aaa() не у себя, а из моей длл (где я тоже опишу всю эту функцию как мне надо).
Я начинаю понимать, что сначала мне надо написать свлю библиотеку (сделано) и своё приложение, которое будет уже запускать мне нужное и следить за подменой функции. Но я пока совершенно не понимаю — как это сделать?
Помогите разобраться? Если уж не конкретным примером, то хотя бы ткните куда читать?
Re: подмена функции в длл при запуске приложения (с++)
От: мыщъх США http://nezumi-lab.org
Дата: 03.06.11 12:58
Оценка:
Здравствуйте, ieroglif, Вы писали:

I>Помогите разобраться? Если уж не конкретным примером, то хотя бы ткните куда читать?

очень расплывчатые условия. исходные тексты есть? ладно, нету. библиотеку abc.dll можно переложить в другой каталог? если да -- задача тривиальная, если нет -- то антивирусы на перехват ругаться могут.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 13:09
Оценка:
Здравствуйте, мыщъх, Вы писали:

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


I>>Помогите разобраться? Если уж не конкретным примером, то хотя бы ткните куда читать?

М>очень расплывчатые условия. исходные тексты есть? ладно, нету. библиотеку abc.dll можно переложить в другой каталог? если да -- задача тривиальная, если нет -- то антивирусы на перехват ругаться могут.

да, исходные тексты есть (именно из них и обнаружил нужную мне для подмены функцию), и библиотеку abc.dll можно переложить в другой каталог — тоже без проблем. на антивирус вообще пофик — пишу для себя на своей машине, не вирус =) а если и отдам кому — там тоже люди будут понимать что они запускают =)
вариант пересобрать исходную abc.dll не катит из следующих соображений:
вместо текущей тупой void aaa() хочется написать нормальный (и весьма большой) код.
изначальная библиотека ABC.dll тоже весьма не мала и является частью ещё большего проекта — пересобирать это всё на дебаг режиме, да и вообще разбираться и ковыряться — я ёпнусь, извините =) мне кажется, что проще подменить void aaa() — да и бОльшего мне не требуется..
к тому же кто знает — может в итоге программу отдам кому, там тоже будет работать, и написать код перемещения библиотеки в другую папку, да установить окружение при запуске программы — это просто.
просто не разбираюсь я В ДАННОЙ теме (вообще с программированием дружу давно), а гугл что-то не подсказывает, на васме выдают просто ассемблерный код (изучать ассемблер и моменты его вкомпилирования в свой код — может и просто, но ради одного случая что-то пока с ходу не получилось.. да и придётся научить gcc дружить с masm-ом.. в общем, тоже та ещё развлекуха..
мне кажется что всё должно как-то просто и красиво решиться с++/winapi
Re[2]: подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 13:16
Оценка:
в общем, как обычно, стоит написать вопрос, как натыкаешься наконец-то на ответ =)
как я понимаю, мне надо написать врапер для длл? =)
если да, то я уже понял куда курить-копать и в целом рад =)
если только есть какой-то примитивный пример сквозного врапера на any-dll =)
Re[3]: подмена функции в длл при запуске приложения (с++)
От: мыщъх США http://nezumi-lab.org
Дата: 03.06.11 13:26
Оценка:
Здравствуйте, ieroglif, Вы писали:

I>Здравствуйте, мыщъх, Вы писали:


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


I>>>Помогите разобраться? Если уж не конкретным примером, то хотя бы ткните куда читать?

М>>очень расплывчатые условия. исходные тексты есть? ладно, нету. библиотеку abc.dll можно переложить в другой каталог? если да -- задача тривиальная, если нет -- то антивирусы на перехват ругаться могут.

I>вместо текущей тупой void aaa() хочется написать нормальный (и весьма большой) код.

I>изначальная библиотека ABC.dll тоже весьма не мала и является частью ещё большего проекта — пересобирать это всё на дебаг режиме, да и вообще разбираться и ковыряться — я ёпнусь, извините =) мне кажется, что проще подменить void aaa() — да и бОльшего мне не требуется..

на си -- это было бы без проблем. на плюсах -- разбираться придется. если это функция-член класса, то она вправе ожидать автоматического вызова конструктора. если эта функция выделяет память, а другая функция ее освобождает, то реализовав эту функцию в своей библиотеке вы должны будете еще и rtl родной библиотеки перехватить, а он не экспортируется.

если функция использует глобальные переменные -- вам, очевидно, придется перехватывать и их. в общем, без изучения кода перехват невозможен.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[3]: подмена функции в длл при запуске приложения (с++)
От: мыщъх США http://nezumi-lab.org
Дата: 03.06.11 13:28
Оценка:
Здравствуйте, ieroglif, Вы писали:

I>в общем, как обычно, стоит написать вопрос, как натыкаешься наконец-то на ответ =)

I>как я понимаю, мне надо написать врапер для длл? =)
I>если да, то я уже понял куда курить-копать и в целом рад =)
I>если только есть какой-то примитивный пример сквозного врапера на any-dll =)
proxy dll -- ответ в первой строке гугла. врапперы автоматизированы. парсят оригинальную dll и автогенерируют код. вы только дописываете свой код, который хотите исправить.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[4]: подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 14:49
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>на си -- это было бы без проблем. на плюсах -- разбираться придется. если это функция-член класса, то она вправе ожидать автоматического вызова конструктора. если эта функция выделяет память, а другая функция ее освобождает, то реализовав эту функцию в своей библиотеке вы должны будете еще и rtl родной библиотеки перехватить, а он не экспортируется.


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


нет, всё, хвала небу, проще =)
просто функция void aaa(). глобальных переменных (специальных, не предоставляемой либой во вне) не использует, методом класса не является.
Re[4]: подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 14:51
Оценка:
Здравствуйте, мыщъх, Вы писали:

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


I>>в общем, как обычно, стоит написать вопрос, как натыкаешься наконец-то на ответ =)

I>>как я понимаю, мне надо написать врапер для длл? =)
I>>если да, то я уже понял куда курить-копать и в целом рад =)
I>>если только есть какой-то примитивный пример сквозного врапера на any-dll =)
М>proxy dll -- ответ в первой строке гугла. врапперы автоматизированы. парсят оригинальную dll и автогенерируют код. вы только дописываете свой код, который хотите исправить.
ну так враппер мне и приятнее.
для proxy dll придётся ещё заморачиваться с выводом всей таблицы экспорта. или я чего-то не понимаю?
Re: подмена функции в длл при запуске приложения (с++)
От: Аноним  
Дата: 03.06.11 15:03
Оценка:
Посмотри на Microsoft Detours Express 2.1.
http://research.microsoft.com/en-us/projects/detours/
Там библиотечка в исходниках и куча примеров.

Просто механизм подмены вызовов из DLL — это попроще обертки.
Re[5]: подмена функции в длл при запуске приложения (с++)
От: мыщъх США http://nezumi-lab.org
Дата: 03.06.11 15:09
Оценка:
Здравствуйте, ieroglif, Вы писали:

I>Здравствуйте, мыщъх, Вы писали:


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


I>для proxy dll придётся ещё заморачиваться с выводом всей таблицы экспорта. или я чего-то не понимаю?

proxy dll генерируется автоматически. да, там импортируется весь экспорт перехватываемой библиотеки и снова экспортируется (технически это часто реализуется как forward функций, но в эти детали вам как разработчику вникать не обязательно). вам достаточно переписать те функции, которые вас интересуют.

враппер и есть proxy. просто разные названия одной и той же сущности.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[6]: подмена функции в длл при запуске приложения (с++)
От: ieroglif http://ieroglif.myau.su
Дата: 03.06.11 15:44
Оценка:
Здравствуйте, мыщъх, Вы писали:

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


I>>Здравствуйте, мыщъх, Вы писали:


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


I>>для proxy dll придётся ещё заморачиваться с выводом всей таблицы экспорта. или я чего-то не понимаю?

М>proxy dll генерируется автоматически. да, там импортируется весь экспорт перехватываемой библиотеки и снова экспортируется (технически это часто реализуется как forward функций, но в эти детали вам как разработчику вникать не обязательно). вам достаточно переписать те функции, которые вас интересуют.

М>враппер и есть proxy. просто разные названия одной и той же сущности.


теперь всё окончательно ясно =) спасибо большое =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.