Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию / 25 сообщений из 36, страница 1 из 2
30.11.2004, 15:25
    #32805999
тот самый
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функцию
Привет народ!

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


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

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

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

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

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

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


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


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

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

Мне скоро это станет актуально.
...
Рейтинг: 0 / 0
07.12.2004, 17:03
    #32817140
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функцию
авторМне скоро это станет актуально
А если не секрет, что эта за задача такая, что требует использования самомодефицирующегося кода? Уж ли не вирус али троян какой :)
...
Рейтинг: 0 / 0
07.12.2004, 17:20
    #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
07.12.2004, 22:21
    #32817557
gamych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функцию
SiebЯ вот что думаю...

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

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

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

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

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

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

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

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

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

хотя, если на большинстве платформ дело обстаит таким образом, и писать прикладуху для конкретного набора платформ, то наверное флаг в руки
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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