2013-06-17 15 views
5

ja triying stworzyć emmiter kodu w C++, aby dowiedzieć się jak zrobić emulator, ale im twardy czas podejmowania dynamiczną pracę asemblera:Jak utworzyć kod emmiter w C++

unsigned char program[] = {0x90, 0x90, 0xC3 }; //nop; nop; ret 
void (*p)(void) = (void(*)())  &program; 
p(); 

zawsze wracają naruszenie zasad dostępu .....

im pracy z visual studio 2012 C++ win32 aplikacji konsoli

dzięki.

+0

Czy próbujesz rzucić znak [] na wskaźnik funkcji? czemu? Myślę, że nie rozumiem, co próbujesz zrobić ... – DGomez

+2

Czy pamięć zawierająca "program" pozwala na wykonanie? – Kaz

+0

woah Chcę również poznać odpowiedź. –

Odpowiedz

7

Po kilku badaniach stwierdziłem, że: musisz przydzielić pamięć i zmienić uprawnienia do odczytu/zapisu/wykonywania na: Zezwalaj na Odczyt, Odmawianie zapisu, Zezwalaj na wykonanie.

Zobacz pytanie o "jak to zrobić", patrz: this.

W systemie Windows funkcja to VirtualProtect, należy przejść w PAGE_EXECUTE_READWRITE, aby uzyskać uprawnienia do wykonywania.

Domyślnie system Windows nie zezwala na wykonanie pamięci. Nazywa się Data Execute Prevention (DEP).

I for linux:

See MPROTECT(). Po wypełnieniu obszaru pamięci (n-) wielkości strony (przydzielonego przez mmap()) za pomocą kodu, zmień jego uprawnienia, aby uniemożliwić zapisywanie i umożliwić wykonanie.

kolejna poprawka dla Twojego problemu na windows jest tylko add your program to DEP whitelist ... (Ty probbly nie zauważył, ale twój krach jest prawdopodobnie typu BEX, BEX awarii są w 99% przypadków związanych z DEP)

PS Kiedy tworzysz działającego nadawcę kodu ... nie dając mi kopii? xD

+3

tutaj: http://llvm.org/ –

+0

@David O_O tak wiele rzeczy do pobrania, nie wiem od czego zacząć xD –

+0

w końcu mam działa! , dzięki! – elios264