Форум программистов, компьютерный форум CyberForum.ru

Получение прототипа функции имея ее адрес - C++

Восстановить пароль Регистрация
 
webprofusa
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
28.10.2011, 12:15     Получение прототипа функции имея ее адрес #1
здравствуйте!, писать, и разбираться в программировании на C++ только начал, поэтому если вопрос покажется глупым, не обессудьте)

Итак, у меня есть dll в которой я перехватываю функции WinApi, с перехватом все ок, но возникла необходимость капнуть глубже...
А именно, перехватить вызов функции вызывающей WinApi, затем предыдущую и тд. В общем-то сильно не хватает знаний в организации функций и их параметров в памяти, фактически, как я понимаю, задача сводиться к получению прототипа функции имея лишь ее адрес, адрес возврата перехваченной функции WinApi я получаю(в ее подмененном варианте так):

C++
1
DWORD addr=*((DWORD*)&param1-1);
Где param1 - первый параметр вызванной функции WinApi, собственно два вопроса:
1) действительно ли я получаю правильный адрес функции вызвавшей WinApi?
2) как мне получить список параметров функции по полученному адресу(ведь для перехвата мне нужен точный прототип функции и ее параметров, собственно как их можно, и можно ли в принципе получить из памяти)?

Не могу понять в какую сторону копать, что гуглить и что искать(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 12:15     Получение прототипа функции имея ее адрес
Посмотрите здесь:

C++ чем отличается определение функции от прототипа?
Использование прототипа функции C++
Адрес функции C++
C++ Адрес функции
C++ Адрес функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 13:48     Получение прототипа функции имея ее адрес #2
Цитата Сообщение от webprofusa Посмотреть сообщение
здравствуйте!, писать, и разбираться в программировании на C++ только начал, поэтому если вопрос покажется глупым, не обессудьте)

Итак, у меня есть dll в которой я перехватываю функции WinApi, с перехватом все ок, но возникла необходимость капнуть глубже...
А именно, перехватить вызов функции вызывающей WinApi, затем предыдущую и тд. В общем-то сильно не хватает знаний в организации функций и их параметров в памяти, фактически, как я понимаю, задача сводиться к получению прототипа функции имея лишь ее адрес, адрес возврата перехваченной функции WinApi я получаю(в ее подмененном варианте так):

C++
1
DWORD addr=*((DWORD*)&param1-1);
Где param1 - первый параметр вызванной функции WinApi, собственно два вопроса:
1) действительно ли я получаю правильный адрес функции вызвавшей WinApi?
2) как мне получить список параметров функции по полученному адресу(ведь для перехвата мне нужен точный прототип функции и ее параметров, собственно как их можно, и можно ли в принципе получить из памяти)?

Не могу понять в какую сторону копать, что гуглить и что искать(
В addr будет записано значение по адресу param - 4 адреса (по-байтно), но никак не адрес
А вот, если убрать первую * и оставить
C++
1
((DWORD*)&param1)-1
то получите как-раз предыдущий адрес.
По вопросам ничего рассказать не могу, только догадки и то не на всё.
webprofusa
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
28.10.2011, 14:02  [ТС]     Получение прототипа функции имея ее адрес #3
спасибо)и как раз предыдущий адрес и есть адрес функции, которая вызвала WinApi? а как мне получить указатель на ее параметры? и, опережая, допустим я получил указатель на парметры.. как мне узнать их тип?(ведь мне нужно их явно указать в прототипе в своей длл-ке)
заранее спасибо!
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 14:36     Получение прототипа функции имея ее адрес #4
Цитата Сообщение от webprofusa Посмотреть сообщение
спасибо)и как раз предыдущий адрес и есть адрес функции, которая вызвала WinApi? а как мне получить указатель на ее параметры? и, опережая, допустим я получил указатель на парметры.. как мне узнать их тип?(ведь мне нужно их явно указать в прототипе в своей длл-ке)
заранее спасибо!
Предыдущий адрес никак не будет адресом предыдущей функции.

Только что смотрел, Win XP 32 бита VS 2008, создал 4 разных функции и адреса функции различались 5 байтами, т.е. 0x004112C1, следующая 0x004112C6, затем 0x004112CB и 0x004112D0.
Короче как-то хитро там все.
webprofusa
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
28.10.2011, 15:19  [ТС]     Получение прототипа функции имея ее адрес #5
"предыдущая", имеется в виду в стеке вызовов, логика какая-то должна быть иначе как винда понимает куда ей возвращать значение выполненной функции? короче вот так может быть будет наглядней:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int func2(sockaddr param1,char * param2,int param3)
{
    DWORD addr=((DWORD*)&param1)-1; //получим адрес func1
   //теперь тут получим список ее(функции func1) параметров и их тип... .как?????
}
 
int func1(/*тут параметры, тип которых, порядок следования, а также кол-во нам и надо найти*/)
{
   int a=winMainsimle1(); //что-то делаем вообщем не важно что
   int b=winMainsimle1(); //еще какие-то неинтересные нам вызовы
   int c=func2(param1,param2,param3);
}
 
int main()
{
   func1(/*тут параметры, тип которых, порядок следования, а также кол-во нам и надо найти*/);
}
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 00:45     Получение прототипа функции имея ее адрес #6
Как я понимаю выражение
C++
1
((DWORD*)&param1)-1
не дает адрес функции, а дает адрес второго параметра...
Т.е. при вызове функции стек выглядит так:
Assembler
1
2
3
4
5
6
Локальные переменные (если имеются)
Адрес возврата из функции
Параметр N
...
Параметр 2
Параметр 1
Соответственно, выражение
C++
1
((DWORD*)&param1)-1
Должно указывать на второй параметр, если он имеется, но на 100% не уверен )
webprofusa
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
30.10.2011, 00:48  [ТС]     Получение прототипа функции имея ее адрес #7
спасибо, т.е. получается так:
C++
1
((DWORD*)&param1)-N
я получу адрес возврата функции, если N-число параметров? таким образом я смогу поулчить адрес возврата(что собственно и нужно)?
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 00:52     Получение прототипа функции имея ее адрес #8
Ну как-то так, только адрес возврата не дает адрес родительской функции, к сожалению...
а только место вызова дочерней функции.
webprofusa
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
30.10.2011, 02:00  [ТС]     Получение прототипа функции имея ее адрес #9
Haster, спасибо)
тут я затупил неимоверно, это же действительно адрес возврата( это мне ничего не даст.. впрочем я пошел иным путем, я начал изучать в дизассемблере приложение, в котором я хотел все эти операции произвести, нашел нужную мне функцию, но возникли опять трудности(знаний не хватает( ), как этим воспользоваться впрочем топик можно закрывать проблема перекочевала: http://www.cyberforum.ru/cpp-beginne...ead374509.html
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.10.2011, 09:52     Получение прототипа функции имея ее адрес #10
Цитата Сообщение от Mustik Посмотреть сообщение
((DWORD*)&param1)-1
Учитывая, что компилятор может менять порядок аргументов, их количество и относительное расположение, то это не очень надёжный способ. Т.е. для конкретной версии может сработать, но после апдэйта может вновь потребоваться танцевать с бубном.
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 11:15     Получение прототипа функции имея ее адрес #11
Deviaphan, насколько я знаю, в WINAPI используется STDCALL, т.е. параметры всегда передаются в стек одинаковым способом, начиная с первого параметра
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 11:24     Получение прототипа функции имея ее адрес
Еще ссылки по теме:

Объясните синтаксис программы по полочкам с использованием локальных переменных и прототипа функции C++
Макрос прототипа функции C++
Как узнать адрес функции Winexec C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.10.2011, 11:24     Получение прототипа функции имея ее адрес #12
Цитата Сообщение от Haster Посмотреть сообщение
т.е. параметры всегда передаются в стек одинаковым способом, начиная с первого параметра
Упустил, что речь о WinAPI функциях.)
Yandex
Объявления
30.10.2011, 11:24     Получение прототипа функции имея ее адрес
Ответ Создать тему
Опции темы

Текущее время: 14:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru