powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию
36 сообщений из 36, показаны все 2 страниц
указатель на функцию
    #32805999
тот самый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет народ!

Пожалуйста, расскажите основное для использования указателей на функцию: описание, присвоение указателю на функцию адреса функции, разименовывание указателя на функцию.


Спасибо.
...
Рейтинг: 0 / 0
указатель на функцию
    #32808299
А то конкретно интересует? Или тебе реферат на эту тему нужен?
...
Рейтинг: 0 / 0
указатель на функцию
    #32813834
Siebentearb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нипонил...

void (*f)(); - объявили указатель на функцию без аргументов и без возвращаемого значения.
f(); - позвали её (забыв проинициализировать указатель)

А вот вопрос поинтереснее - кто-нибудь создавал функции динамически? :)
...
Рейтинг: 0 / 0
указатель на функцию
    #32814337
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это как - самомодифицируемый код ?
Тогда при чем здесь c/C++ - это на ассемблере надо писать, причем не под виндами однозначно.
...
Рейтинг: 0 / 0
указатель на функцию
    #32814639
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТогда при чем здесь c/C++ - это на ассемблере надо писать, причем не под виндами однозначно.
Сильное утверждение. Вообще-то пару примеров такого нетрудно найти, например, в дельфовой VCL вполне себе под виндами :)
...
Рейтинг: 0 / 0
указатель на функцию
    #32814885
Sieb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вот что думаю...

Если есть некая статическая/полустатическая_с_параметрами функция, конечной длинны, то можно выделить кусок памяти в куче, скопировать код туда, сделать указатель на функцию, присвоить ему значение адреса этого куска памяти и позвать. Что будет? По идее - отработает... Кто-нибудь пробовал?
Вызов должен облажиться скидыванием/вытаскиванием стека, а внутренности - они код и есть... Или функции лежат в одном определённом месте памяти и из другого места быть вызваны не могут?...

Эх, блин, времени нет... Но оно будет, тогда я это дело раскопаю.. :)
...
Рейтинг: 0 / 0
указатель на функцию
    #32814913
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вроде у кучи и у кода сегменты разные.
нарушение доступа к памяти - вот наилучший результат, на который можно рассчитывать :-)
...
Рейтинг: 0 / 0
указатель на функцию
    #32814953
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и проще: "на лету" состряпать exe'шник, туда написать, что нужно и запустить. Вот и самомодифицируемый код получится.
...
Рейтинг: 0 / 0
указатель на функцию
    #32815542
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
На лету собирать ехе-шник тоже нехорошо - код может меняться очень быстро, тормоза будут.

А вот нарушение доступа к памяти - это да...
...
Рейтинг: 0 / 0
указатель на функцию
    #32815767
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer MasterZivТогда при чем здесь c/C++ - это на ассемблере надо писать, причем не под виндами однозначно.
Сильное утверждение. Вообще-то пару примеров такого нетрудно найти, например, в дельфовой VCL вполне себе под виндами :)


Ты что-то путаешь. В виндах, как и во многих других нормальных операционных системах, это невозможно.
...
Рейтинг: 0 / 0
указатель на функцию
    #32815775
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebЕсли есть некая статическая/полустатическая_с_параметрами функция, конечной длинны, то можно выделить кусок памяти в куче, скопировать код туда, сделать указатель на функцию, присвоить ему значение адреса этого куска памяти и позвать. Что будет? По идее - отработает... Кто-нибудь пробовал?
Вызов должен облажиться скидыванием/вытаскиванием стека, а внутренности - они код и есть... Или функции лежат в одном определённом месте памяти и из другого места быть вызваны не могут?...


Именно невозможно. Процессор работает в защищенном режиме, код лежит в сегменте (памяти) кода , данные - в памяти данных. при попытке передать управление в область данных просто будет защита памяти.
...
Рейтинг: 0 / 0
указатель на функцию
    #32815873
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИменно невозможно. Процессор работает в защищенном режиме, код лежит в сегменте (памяти) кода , данные - в памяти данных. при попытке передать управление в область данных просто будет защита памяти.

Можно поменять тип сегмента с данных на сегмент кода, предварительно записавт туда что нужно. Потом передать туда управление.
...
Рейтинг: 0 / 0
указатель на функцию
    #32815951
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 9х может и можно, а в nt наврядли :-)
...
Рейтинг: 0 / 0
указатель на функцию
    #32815996
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв 9х может и можно, а в nt наврядли :-)
Почему же :). Нужны лишь соответсвующие привилегии (а может и нет). В конце концов сама операционная система делает нечто подобное.
...
Рейтинг: 0 / 0
указатель на функцию
    #32817048
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так всё-таки как? :)

Мне скоро это станет актуально.
...
Рейтинг: 0 / 0
указатель на функцию
    #32817140
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМне скоро это станет актуально
А если не секрет, что эта за задача такая, что требует использования самомодефицирующегося кода? Уж ли не вирус али троян какой :)
...
Рейтинг: 0 / 0
указатель на функцию
    #32817192
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv при попытке передать управление в область данных просто будет защита памяти.
Ну например, такой вот изврат (у меня полное впечатление, что кто-то из борландеров просто решил покуражиться, то есть смысла делать именно так я не вижу):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 constructor  TLanguages.Create;
 type 
  TCallbackThunk =  packed   record 
    POPEDX: Byte;
    MOVEAX: Byte;
    SelfPtr: Pointer;
    PUSHEAX: Byte;
    PUSHEDX: Byte;
    JMP: Byte;
    JmpOffset: Integer;
   end ;
 var 
  Callback: TCallbackThunk;
 begin 
   inherited  Create;
  Callback.POPEDX := $5A;
  Callback.MOVEAX := $B8;
  Callback.SelfPtr := Self;
  Callback.PUSHEAX := $ 50 ;
  Callback.PUSHEDX := $ 52 ;
  Callback.JMP     := $E9;
  Callback.JmpOffset := Integer(@TLanguages.LocalesCallback) - Integer(@Callback.JMP) -  5 ;
  EnumSystemLocales(TFNLocaleEnumProc(@Callback), LCID_SUPPORTED);
 end ;

Вполне себе работает везде, где работают дельфовые программы.
...
Рейтинг: 0 / 0
указатель на функцию
    #32817557
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiebЯ вот что думаю...

Если есть некая статическая/полустатическая_с_параметрами функция, конечной длинны, то можно выделить кусок памяти в куче, скопировать код туда, сделать указатель на функцию, присвоить ему значение адреса этого куска памяти и позвать. Что будет? По идее - отработает... Кто-нибудь пробовал?
Я пробовал. Работает влёт.
...
Рейтинг: 0 / 0
указатель на функцию
    #32817567
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Без цитат. Всем умникам, рассуждающим про сегменты кода,
данных и т. д. и т. п. Помимо популярных книжек про процессоры
нелишне познакомиться с flat моделью памяти. Узнать, что в ней у
процесса селекторы содержат индекс одного и того же дескриптора,
что делает приведенные аргументы против совершенно несостоятельными.
Заодно придёт понимание природы многих эксплойтов, основанных
на переполнении буфера и выполнении кодов из стека.
Короче говоря, если нет твёрдых знаний, то перед тем, как отвечать
на вопрос, не мешает подумать.
...
Рейтинг: 0 / 0
указатель на функцию
    #32817727
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
R10Уж ли не вирус али троян какой :)
Нет, я таким не занимаюсь. Хотя, на самом деле, полезная штука для развития (как и все другие задачи, включая написание игр).

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

if(a)
{
a = !a;
прыг();
}
и так 10000 раз, к примеру.
Можно написать 2 функции и пользоваться указателем.
А чё делать со свичами? Если их штук сто реально и в 99% времени используется 2, остальные проверки просто жрут память? Тогда было бы удобнее на ходу собрать функцию с парой кейсов и счастье есть :)

ГамычЯ пробовал. Работает влёт.
Ура! Под всеми виндами?

ГамычПомимо популярных книжек про процессоры
нелишне познакомиться с flat моделью памяти. Узнать, что в ней у
процесса селекторы содержат индекс одного и того же дескриптора,
что делает приведенные аргументы против совершенно несостоятельными.
Заодно придёт понимание природы многих эксплойтов, основанных
на переполнении буфера и выполнении кодов из стека.
А можно немного подробнее? Или хотяб ссылку? Но лучше своими словами :)

Щас разберёмся с этим вопросом, и у меня есть ещё один интересный...
...
Рейтинг: 0 / 0
указатель на функцию
    #32817824
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если есть какой-то хак в какой-то системе, стоит ли основывать на нем свою прогграмму? в другой системе этого хака может и не быть
...
Рейтинг: 0 / 0
указатель на функцию
    #32819080
Siebentearb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, так это хак или не хак?
...
Рейтинг: 0 / 0
указатель на функцию
    #32819727
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sie
Ура! Под всеми виндами?

Не знаю. W2K WS, W2K Server, Advanced Server, WinXP Pro - под этими работает. А так же и в Linux проблем не испытываю.
Повторюсь, принципиальная возможность этого не связана с конкретной ОС,а только с моделью памяти. Модель flat не предусматривает сегментации адресного пространства процесса - отсюда вытекает всё остальное.

Sie
А можно немного подробнее? Или хотяб ссылку? Но лучше своими словами :)

Немного поподробнее не получится - тема одновременно обширная и глубокая. Рекомендую прочесть несколько книг по архитектуре современных процессоров, виндовая модель памяти неплохо расписана в MSDN. Не мешает ознакомиться с хелпами из DDK в части касающейся менеджера памяти. В таком вот акцепте :-)
...
Рейтинг: 0 / 0
указатель на функцию
    #32819728
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex_kесли есть какой-то хак в какой-то системе, стоит ли основывать на нем свою прогграмму? в другой системе этого хака может и не быть
Система здесь ни при чём. Пока используется модель flat - будет оставаться принципиальная возможность работы такого кода. Сменится модель памяти - будет видно.
...
Рейтинг: 0 / 0
указатель на функцию
    #32819767
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в этом форуме мы с++ обсуждаем или модели памяти?
с++ может быть реализовано на любой платформе...

хотя, если на большинстве платформ дело обстаит таким образом, и писать прикладуху для конкретного набора платформ, то наверное флаг в руки
...
Рейтинг: 0 / 0
указатель на функцию
    #32819846
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алех_кв этом форуме мы с++ обсуждаем или модели памяти?
Ну дык, всё взаимосвязано.
с++ сам по себе ничего не даёт, пока не привязан к какой-нить оси.

Ни текст вывести, ни на кнопку нажать :)

В этом формуме обсуждаем всё, что пишется благодаря С++.
(форума по апям тут нету)
...
Рейтинг: 0 / 0
указатель на функцию
    #32824320
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex_kв этом форуме мы с++ обсуждаем или модели памяти?
с++ может быть реализовано на любой платформе...

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

Я ответил по существу вопроса. Если же топик не соответствует эхотагу, то прибей его. Ежели, конечно, полномочия на то есть ;-)
...
Рейтинг: 0 / 0
указатель на функцию
    #32824412
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я не про то.
все течет, все меняется, платформы уходят в прошлое и возникают из ниоткуда :-)
жить будет та кпрограмма, которая будет как можно меньше использовать специфические фишки и как можно больше стандартные. для того и стандарт думают :-)
ну заработает твой алгоритм на трех - пяти платформах. и все... потом переписывать придеться, время тратить.
если цель - именно работа именно на этих платформах, тогда нет вопросов.
...
Рейтинг: 0 / 0
указатель на функцию
    #32826062
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
хм... а я так понял, что модель памяти flat - это не от платвормы зависит... или я не прав?
...
Рейтинг: 0 / 0
указатель на функцию
    #32826144
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все зависит от платформы :-)
разве под дос небыло с++?
...
Рейтинг: 0 / 0
указатель на функцию
    #32826685
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
Нет, имхо есть вещи внеплатформенные.
С++ под дос - это иллюзия :)
Есть набор компиляторов для с++ под дос.
...
Рейтинг: 0 / 0
указатель на функцию
    #32826870
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иллюзия? сам не юзал врать не стану, но что-то не верится.
да и потом, разве "компилятор с++ под дос" не тоже самое что "с++ под дос"?
или он, компилятор, сам под дос не работает?
...
Рейтинг: 0 / 0
указатель на функцию
    #32827620
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sieхм... а я так понял, что модель памяти flat - это не от платвормы зависит... или я не прав?
Не прав.
...
Рейтинг: 0 / 0
указатель на функцию
    #32827874
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
авторразве "компилятор с++ под дос" не тоже самое что "с++ под дос"?
Всмысле, компиляторы разные бывают, некоторые что-то не умеют.
В том же MS компиляторе не по страндарту сделано объявление переменной в цикле. В отличие от ВС++.

авторНе прав.
Это плохо. Стало быть, использовать эту фичу мне не придётся.
...
Рейтинг: 0 / 0
указатель на функцию
    #32831305
gamych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SieЭто плохо. Стало быть, использовать эту фичу мне не придётся.
Дело хозяйское. Лично я юзаю и не жужжу. И убеждён - долгое время проблем испытывать не буду.
...
Рейтинг: 0 / 0
указатель на функцию
    #32831522
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
Ктстаи, command pointer руками прописать возможно?
И если да, то что быстрее? Сделать jmp или mov cp, чегото ?
Ничего ведь мне не мешает в сегменте кода прыгать из функции в функцию пропуская ret дабы не возиться с загрузкой/выгруской стека?
Тогда можно налепить абстрактные куски функций, котороые соединять jmp-ами.
Как вам такая идея?
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]