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

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

28.10.2011, 12:15. Показов 1780. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru