uruchomienie z pamięci

0

jak to zrobić, wiem że trzeba użyć funkcji virtualalloc z page_execute_readwrite, chodzi o to że mam jakąś funkcję, dajmy na to

funk1()
{
MessageBox(0,"M","M",0);
}

i teraz potrzebuję ją zapisać tą funkcje w posatci BYTE cod[]={0x??,0x??,0x??.....}
potem ją załadować do pamięci i uruchomić, to jest kompilacja w czasie trwanai programu, najważniejsze to jak zrobić tą funkcje na postać BYTE cod[]={...} ?? żebym potem mógł sobie w programie naprzykład jakiś fragment kodu zaszyfrować, w odpowiednich warunkach odszyfrować załadować do pamięci i uruchomić ? znalazłem w necie naprzykłąd taki przykład :

execute a piece of code in the memory 
To get started, look at VirtualAlloc( NULL, size, MEM_COMMIT,
PAGE_EXECUTE_READWRITE ) to get a pointer to a block of memory to which
you can write code, perhaps something like this - tested as OK:

int executeCode( BYTE *code, size_t codeSize, int arg )
{
    void *codePage = VirtualAlloc( NULL, codeSize, MEM_COMMIT,
                                   PAGE_EXECUTE_READWRITE );

    memcpy( codePage, code, codeSize );

    int (*funcPtr)(int) = (int (*)(int)) codePage;

    int retVal = funcPtr( arg );

    VirtualFree( codePage, 0, MEM_RELEASE );

   return retVal;
}

And tested with:

// Assembler code for int foo( int x ) { return x * x; }
BYTE code[] = { 0x8b, 0x44, 0x24, 0x04, 0x0f, 0xaf, 0xc0, 0xc3 };

TRACE("Calculating f(42) = %d\n", executeCode( code, sizeof( code ), 42 ));
TRACE("Calculating f(-2) = %d\n", executeCode( code, sizeof( code ), -2 ));

i rzeczywiście on działa świetnie, ale jak to zrobić do inncyh funkcji ? skąd mam wziąć te opcody ? ten hex ? DIĘKUJE.

0

A znasz assembler x86 [???]
Wiesz co to jest TASM, NASM, MASM [???]
Znasz się na programowaniu w asm dla Windows [???]

Jeśli na które kolwiek pytanie odpowiedziałeś "NIE", to nie radzę za to się brać...

0

nie oczekuję odpowiedzi tego typu !!

0

Tyle, że problem wynika z twojego braku podstawowej wiedzy na temat asm'a, a nie jakiegoś wysokiego poziomu trudności tego problemu.

0

Eh, zamiast gościa dołować, odpowiedzielibyscie na pytanie - też kiedyś przecież nie znaliście asma.

Wszystko jest TU: http://developer.intel.com/design/pentium/manuals/243191.htm

Dobrym sposobem nauki jest tez pisanie prostych programów w jakimś wysokopoziomowym języku np. C++ lub Delphi, kompilacja ich i uruchomienie pod debuggerem takim jak ma np. BCB/Delphi (View->Debug Windows -> CPU).

0
Krolik napisał(a)

Eh, zamiast gościa dołować, odpowiedzielibyscie na pytanie - też kiedyś przecież nie znaliście asma.

No ta, tylko jak odpowiedzieć na pytanie dotyczące nie dość, że zabawy z assemblerem to jeszcze wprowadzania zmian w kodzie assemblerowym, no bo jak zapisać kod w którym są adresy stringów, tak jak chciał autor (MessageBox())? No nie da się podać gotowych bajtów, które należy wstawić do tablicy... Ale to można zrozumieć tylko znając sposób działania procesora, assemblera, C, wywoływania funkcji z parametrami ,itp.

0
marcinEc napisał(a)

No nie da się podać gotowych bajtów, które należy wstawić do tablicy...

Można wrzucić dane na stos i przy wrzucaniu parametrów odnosić się za pomocą ESP ;]
Tak więc można stworzyć gotowca

0
CyberKid napisał(a)
marcinEc napisał(a)

No nie da się podać gotowych bajtów, które należy wstawić do tablicy...

Można wrzucić dane na stos i przy wrzucaniu parametrów odnosić się za pomocą ESP ;]
Tak więc można stworzyć gotowca

To nie do mnie z wyjaśnieniami.. :-P
To teraz napisz to autorowi wątku... Powodzenia ;-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1