Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7

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

28.10.2011, 12:15. Показов 1807. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте!, писать, и разбираться в программировании на C++ только начал, поэтому если вопрос покажется глупым, не обессудьте)

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

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

Не могу понять в какую сторону копать, что гуглить и что искать(
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2011, 12:15
Ответы с готовыми решениями:

В описании прототипа функции на C параметры это сами данные или адрес данных
И всётаки как самому читать мсдн? Нужен в голове твёрдый конвертер! Всегда с боем сдаётся. ...

Возможно ли, имея динамический IP-адрес?
Возможно ли, имея динамический IP-адрес, держать сайт на своем компьютере ? Читал в вики о "ДМЗ" - какая то...

Как, имея адрес буфера, записать что-то в него?
В данном вопросе я полный профан .В задаче сказано что в P1 хранится адрес буфера для пароля ,а в P2 его величина в символах . Мне надо...

11
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 13:48
Цитата Сообщение от 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
то получите как-раз предыдущий адрес.
По вопросам ничего рассказать не могу, только догадки и то не на всё.
1
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
28.10.2011, 14:02  [ТС]
спасибо)и как раз предыдущий адрес и есть адрес функции, которая вызвала WinApi? а как мне получить указатель на ее параметры? и, опережая, допустим я получил указатель на парметры.. как мне узнать их тип?(ведь мне нужно их явно указать в прототипе в своей длл-ке)
заранее спасибо!
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 14:36
Цитата Сообщение от webprofusa Посмотреть сообщение
спасибо)и как раз предыдущий адрес и есть адрес функции, которая вызвала WinApi? а как мне получить указатель на ее параметры? и, опережая, допустим я получил указатель на парметры.. как мне узнать их тип?(ведь мне нужно их явно указать в прототипе в своей длл-ке)
заранее спасибо!
Предыдущий адрес никак не будет адресом предыдущей функции.

Только что смотрел, Win XP 32 бита VS 2008, создал 4 разных функции и адреса функции различались 5 байтами, т.е. 0x004112C1, следующая 0x004112C6, затем 0x004112CB и 0x004112D0.
Короче как-то хитро там все.
0
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
28.10.2011, 15:19  [ТС]
"предыдущая", имеется в виду в стеке вызовов, логика какая-то должна быть иначе как винда понимает куда ей возвращать значение выполненной функции? короче вот так может быть будет наглядней:
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(/*тут параметры, тип которых, порядок следования, а также кол-во нам и надо найти*/);
}
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 00:45
Как я понимаю выражение
C++
1
((DWORD*)&param1)-1
не дает адрес функции, а дает адрес второго параметра...
Т.е. при вызове функции стек выглядит так:
Assembler
1
2
3
4
5
6
Локальные переменные (если имеются)
Адрес возврата из функции
Параметр N
...
Параметр 2
Параметр 1
Соответственно, выражение
C++
1
((DWORD*)&param1)-1
Должно указывать на второй параметр, если он имеется, но на 100% не уверен )
1
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
30.10.2011, 00:48  [ТС]
спасибо, т.е. получается так:
C++
1
((DWORD*)&param1)-N
я получу адрес возврата функции, если N-число параметров? таким образом я смогу поулчить адрес возврата(что собственно и нужно)?
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 00:52
Ну как-то так, только адрес возврата не дает адрес родительской функции, к сожалению...
а только место вызова дочерней функции.
1
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
30.10.2011, 02:00  [ТС]
Haster, спасибо)
тут я затупил неимоверно, это же действительно адрес возврата( это мне ничего не даст.. впрочем я пошел иным путем, я начал изучать в дизассемблере приложение, в котором я хотел все эти операции произвести, нашел нужную мне функцию, но возникли опять трудности(знаний не хватает( ), как этим воспользоваться впрочем топик можно закрывать проблема перекочевала: https://www.cyberforum.ru/cpp-... 74509.html
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.10.2011, 09:52
Цитата Сообщение от Mustik Посмотреть сообщение
((DWORD*)&param1)-1
Учитывая, что компилятор может менять порядок аргументов, их количество и относительное расположение, то это не очень надёжный способ. Т.е. для конкретной версии может сработать, но после апдэйта может вновь потребоваться танцевать с бубном.
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 11:15
Deviaphan, насколько я знаю, в WINAPI используется STDCALL, т.е. параметры всегда передаются в стек одинаковым способом, начиная с первого параметра
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.10.2011, 11:24
Цитата Сообщение от Haster Посмотреть сообщение
т.е. параметры всегда передаются в стек одинаковым способом, начиная с первого параметра
Упустил, что речь о WinAPI функциях.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2011, 11:24
Помогаю со студенческими работами здесь

Макрос прототипа функции
Существует ли он? __FILE__ подставляет путь к файлу, в котором находится строка, в которой применён макрос. __LINE__ номер строки, в...

Объявление прототипа функции
Доброго времени суток. Разбираю пример из книги Кернигана и Ричи, а именно следующий: #include <stdio.h> #define MAXLINE...

Использование прототипа функции
Привет форумчанам!Помогите пожалуйста! 1.Нужно написать функцию которая вычисляет максимальное и минимальное число массива введенного с...

определение прототипа функции
допустим есть некоторый класс class myclass { void foo(); int boo(int b);//прототипы ... }; Как мне теперь...

Объяснить синтаксис прототипа функции
float drob(int k1, char *S1); обьясните строчку пажалуйста зачем задавать флоат потом в скобках инт?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru