Как перевести код с С на С++ ?
От: Beatseed Россия  
Дата: 18.09.03 05:25
Оценка:
на с возможен такой код:

char funccode[]="символьный код программы";
void(*func)()=(void*)funccode;
func();

на с++ при компиляции это выдает следующее:
error C2440: 'initializing' : cannot convert from 'void *' to 'void (__cdecl *)(void)'

может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++
Re: Как перевести код с С на С++ ?
От: peterbes Россия  
Дата: 18.09.03 05:38
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();

B>на с++ при компиляции это выдает следующее:

B>error C2440: 'initializing' : cannot convert from 'void *' to 'void (__cdecl *)(void)'

B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++


Что-нибудь вроде


extern "C"
{
      void(*func)()=(void*)funccode;
}

char funccode[]="символьный код программы";
func();
Re: Как перевести код с С на С++ ?
От: alexkro  
Дата: 18.09.03 05:45
Оценка: +2 :)
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();

B>на с++ при компиляции это выдает следующее:

B>error C2440: 'initializing' : cannot convert from 'void *' to 'void (__cdecl *)(void)'

B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++


Незачем хакерам на C++ переходить. Это шаг назад. Шагом вперед будет C->ASM.
Re: Как перевести код с С на С++ ?
От: Kluev  
Дата: 18.09.03 05:55
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();

B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++



typdef void (*funct_t)();
func_t func = (func_t)funccode;
(*func)();
Re: Как перевести код с С на С++ ?
От: jazzer Россия Skype: enerjazzer
Дата: 18.09.03 06:22
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();

B>на с++ при компиляции это выдает следующее:

B>error C2440: 'initializing' : cannot convert from 'void *' to 'void (__cdecl *)(void)'

B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++


написать явное приведение, ибо иначе несовсемтимые типы друг к другу не приводятся:

void(*func)() = reinterpret_cast<void(*)()>(funccode);
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как перевести код с С на С++ ?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 18.09.03 06:32
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();

Мрак какой-то, оно ведь не переносимо, т.к. платформенно-зависимо. Последний раз такой изврат видел десять лет назад в программе на Basic-е под ZX-Spectrum.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[2]: Как перевести код с С на С++ ?
От: jazzer Россия Skype: enerjazzer
Дата: 18.09.03 06:50
Оценка:
Здравствуйте, _Obelisk_, Вы писали:

_O_>Здравствуйте, Beatseed, Вы писали:


B>>на с возможен такой код:


B>>char funccode[]="символьный код программы";

B>>void(*func)()=(void*)funccode;
B>>func();

_O_>Мрак какой-то, оно ведь не переносимо, т.к. платформенно-зависимо. Последний раз такой изврат видел десять лет назад в программе на Basic-е под ZX-Spectrum.


И что с того?
Заметь, на спектруме шикарные программы были, хоть переносимость никого и не интересовала в то дикое время :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Как перевести код с С на С++ ?
От: Vamp Россия  
Дата: 18.09.03 07:12
Оценка:
А у меня вот какой вопрос. Почему не возникает проблем, связанных с тем, что массив чаров — есть данные, которые размещаются в соответствующей области. А мы их попытаемся выполнить, словно это код из области кода?
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Как перевести код с С на С++ ?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 18.09.03 07:13
Оценка:
Здравствуйте, jazzer, Вы писали:

J>И что с того?

J>Заметь, на спектруме шикарные программы были, хоть переносимость никого и не интересовала в то дикое время


Шикарные поневоле, иначе как в 48 Кб памяти уложиться. Вот и плодились извраты навроде, когда программа сама себя модифицирует.

Но в промышленном программирование сей подход не поощряется.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[4]: Как перевести код с С на С++ ?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 18.09.03 07:17
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А у меня вот какой вопрос. Почему не возникает проблем, связанных с тем, что массив чаров — есть данные, которые размещаются в соответствующей области. А мы их попытаемся выполнить, словно это код из области кода?


А это из-за Фон-Неймановской архитектуры, код и данные находятся в одной и той же памяти и нет специальной области кода и области данных.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[5]: Как перевести код с С на С++ ?
От: ArtDenis Россия  
Дата: 18.09.03 07:22
Оценка:
Здравствуйте, _Obelisk_, Вы писали:
V>> А у меня вот какой вопрос. Почему не возникает проблем, связанных с
V>> тем, что массив чаров — есть данные, которые размещаются в
V>> соответствующей области. А мы их попытаемся выполнить, словно это код
V>> из области кода?
O>
O> А это из-за Фон-Неймановской архитектуры, код и данные находятся в одной
O> и той же памяти и нет специальной области кода и области данных.

А с каких это пор все процессоры перешли на Фон-Неймановскую архитектуру?

---------------------------------------------------------
СНП, Artyomov Denis. E-mail: artyomov <at> inbox.ru
Posted via RSDN NNTP Server 1.7 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Как перевести код с С на С++ ?
От: MaximE Великобритания  
Дата: 18.09.03 07:54
Оценка: :)
Здравствуйте, _Obelisk_, Вы писали:

_O_>Здравствуйте, Beatseed, Вы писали:


B>>на с возможен такой код:


B>>char funccode[]="символьный код программы";

B>>void(*func)()=(void*)funccode;
B>>func();

_O_>Мрак какой-то, оно ведь не переносимо, т.к. платформенно-зависимо. Последний раз такой изврат видел десять лет назад в программе на Basic-е под ZX-Spectrum.


Ага

// простые перцы очищали экран так

    LD HL,#4000
    LD DE,#4001
    LD BC,#1B00 - 1
    LD (HL),L
    LDIR

// крутые так

    LD (resore_sp + 1),SP
    LD SP,#4000 + #1B00
    LD HL,0
    LD BC,#1B00 / 2 / 8
clear_loop:
    PUSH HL
    PUSH HL
    PUSH HL
    PUSH HL
    PUSH HL
    PUSH HL
    PUSH HL
    PUSH HL
    DEC BC
    JP NZ, clear_loop

restore_sp:
    LD SP,0
Re: Как перевести код с С на С++ ?
От: Аноним  
Дата: 18.09.03 07:58
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++


Это невозможно. В Си++ указатели на функции неприводимы к указателям на данные, что и понятно: ведь у них может быть разный размер.
Re: Как перевести код с С на С++ ?
От: LaptevVV Россия  
Дата: 18.09.03 08:23
Оценка:
Здравствуйте, Beatseed, Вы писали:

B>на с возможен такой код:


B>char funccode[]="символьный код программы";

B>void(*func)()=(void*)funccode;
B>func();
Возможен-то он возможен.
Но чтобы не возникало дальнейших вопросов у новичков, сразу отметим, что "символьный код программы" — это строка символов, которая транслятором НЕ ТРАНСЛИРУЕТСЯ. Поэтому в качестве этого самого "символього кода программы" нужно писать программу кодах в явном виде.
B>на с++ при компиляции это выдает следующее:
B>error C2440: 'initializing' : cannot convert from 'void *' to 'void (__cdecl *)(void)'
B>может кто подскажет что нужно добавить/исправить чтобы этот код заработал на с++
Вот он прямо тебе и подсказал же, какой вид указателя должен быть
void (*)(void)
Только на С++ это непереносимо и реализуется
reintrpret <void (*)(void)>(funccode)
На интеле должно прокатить, так как указатели на данные и указатели на функции занимают по 4 байта (только в защищенном режиме, в реальном все от модели памяти зависит).
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Как перевести код с С на С++ ?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 18.09.03 08:41
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, _Obelisk_, Вы писали:


AD>А с каких это пор все процессоры перешли на Фон-Неймановскую архитектуру?


Я на 99% уверен, что автор топика не работает на системе с иной архитектурой.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[4]: Как перевести код с С на С++ ?
От: Кодт Россия  
Дата: 18.09.03 09:15
Оценка: 12 (2) +1
Здравствуйте, Vamp, Вы писали:

V>А у меня вот какой вопрос. Почему не возникает проблем, связанных с тем, что массив чаров — есть данные, которые размещаются в соответствующей области. А мы их попытаемся выполнить, словно это код из области кода?


Что значит почему? На платформе Win32 — возникнут обязательно. Сработает защита памяти.
На платформе 8086 — будет море секса.

Такой код более-менее валиден для моделей памяти tiny (код и данные в одном сегменте) и huge (указатель содержит селектор сегмента). Причем, если указатели имеют тип near или huge (а не far), можем получить дефективный селектор.
В модели small природа указателей разная: данные это данные, код это код.
А для моделей large и compact — указатели вообще имеют разный размер!

Примечание: процессы в Win32 работают в tiny модели.
8-битные платформы с принстонской архитектурой — тоже.
На гарвардской архитектуре можно считать, что там модель small.

Итого: если хотите сэкса и не боитесь ЗППП — то ради бога.
Перекуём баги на фичи!
Re[5]: Как перевести код с С на С++ ?
От: Аноним  
Дата: 18.09.03 09:17
Оценка: :))
Здравствуйте, Кодт, Вы писали:

К>Итого: если хотите сэкса и не боитесь ЗППП — то ради бога.


ЗППП — это зависание пакета прикладных программ?
Re[3]: Как перевести код с С на С++ ?
От: Kluev  
Дата: 18.09.03 10:21
Оценка: :)
_O_>>Мрак какой-то, оно ведь не переносимо, т.к. платформенно-зависимо. Последний раз такой изврат видел десять лет назад в программе на Basic-е под ZX-Spectrum.

J>И что с того?

J>Заметь, на спектруме шикарные программы были, хоть переносимость никого и не интересовала в то дикое время

Она (переносимость) и сейчас не всех интересует. Большинство программ одноразовые.
Re[5]: Как перевести код с С на С++ ?
От: WFrag США  
Дата: 18.09.03 10:28
Оценка: 5 (1)
Здравствуйте, Кодт, Вы писали:

К>Что значит почему? На платформе Win32 — возникнут обязательно. Сработает защита памяти.


Да вроде не должна. Там ведь модель памяти FLAT, насколько я знаю. По крайней мере код, сгенеренный VC7.1, работает:
#include <iostream>
typedef int (*Func)(void);
int main()
{
    unsigned char code[] = { 0xb8, 0x78, 0x56, 0x34, 0x12, 0xc3 }; // return 0x12345678;
    Func func = (Func)(void*)code;
    std::cout << std::hex << func() << std::endl;
}


Но делать так не стоит .

P.S. Скорее всего, эта конструкция будет работать практически на любой операционке на x86 в защищенном режиме — насколько я знаю, почти ни одна операционка не использует сегменты x86 в полном объеме. Вот проверил — на Линуксе тоже работает.
Re[2]: Как перевести код с С на С++ ?
От: Beatseed Россия  
Дата: 19.09.03 07:19
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Beatseed, Вы писали:

LVV>Вот он прямо тебе и подсказал же, какой вид указателя должен быть
LVV>void (*)(void)
LVV>Только на С++ это непереносимо и реализуется
LVV>reintrpret <void (*)(void)>(funccode)
LVV>На интеле должно прокатить, так как указатели на данные и указатели на функции занимают по 4 байта (только в защищенном режиме, в реальном все от модели памяти зависит).
Модель памяти плоская.
Такой вариант тоже не проходит
Вот что выдает

void(*func)()=reinterpret_cast<void(*) ()>(funccode);

error C2440: 'reinterpret_cast' : cannot convert from 'char [46]' to 'void (__cdecl *)(void)'
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.