Avatar billede krismort Nybegynder
07. august 2008 - 15:34 Der er 7 kommentarer

kopiering af kode i runtime

Kan man i c ( msvc 71 ) kopierer noget kompileret kode over i et array og bagefter kalde det med en funktions pointer som peger på en addresse der svarer til det sted man kopierede over i arrayet ?

jeg har prøvet noget ala det her men det fejler når jeg kører funktionern.

#define FUNC_ADDR(func) func
static int func_copy( int* param1 ) {
    int i=0;
    int x=24;
    i += *param1;
    x++;
    x+=i;
    x++;
    x+=i;
    return i;
}

int main(void)
{
    BYTE    opCodes[0xFF];
    int (*pt2Function)( int* ) = 0; //opCodes;
    int rv = 0;   
    memcpy(opCodes, FUNC_ADDR(func_copy), 0xFF);
    pt2Function = opCodes;
    rv = (*pt2Function)(0);
    printf( "rv = %i" , rv );
}
Avatar billede arne_v Ekspert
07. august 2008 - 15:39 #1
Principielt kan det godt lade sig goere.

Men men men.

Koerer du tilfaeldigvis XP SP2, saa har de flippet den her on:

http://en.wikipedia.org/wiki/NX_bit

som forhindrer at kode i data bliver udfoert (security - det beskytter mod en
del buffer overrun problemer).
Avatar billede kenneth_gorking Nybegynder
08. august 2008 - 00:55 #2
Hvorfor ikke bare nøjes med at kopiere pointeren til koden?

static int func_copy( int* param1 ) {
    return (*param) + 42;
}

int main(void)
{
    int (*pt2Function)( int* ) = func_copy;
    int rv = 0;   
    rv = (*pt2Function)(&rv);
    printf( "rv = %i" , rv );
    return 0;
}
Avatar billede krismort Nybegynder
11. august 2008 - 10:53 #3
kenneth_gorking: Det er koden jeg prøver at "kopierer", det er typisk noget man laver for at lade et program tilpasse sig efter et problem. I mit tilfælde skal der generes nogle producerale texturer. Jeg ved godt at jeg kan gøre det i et scriptsprog eller noget lign. men jeg har brug for at gøre det i ren c.
Avatar billede kenneth_gorking Nybegynder
12. august 2008 - 01:20 #4
Jeg har aldrig i al den tid jeg har programmeret hørt om sådan noget. Hvordan kan programmet tilpasse sig, når du bare laver en kopi? Det er jo præcist det samme kode, med den undtagelse, at chancen for at det kører uden problemer er reduceret væsentligt. Hvad har det også at gøre med procedural teksturer?
Avatar billede krismort Nybegynder
12. august 2008 - 08:33 #5
det jeg laver er et "genetisk program" programmet skal tilpasse sig efter problemet og programmet skal fylde så lidt på disken som muligt men må gerne fylde mere i hukommelsen. Det er en teknik som man feks har brugt på gameboy spil til at få spillene til at fylde meget lidt på disken,
Avatar billede krismort Nybegynder
12. august 2008 - 08:37 #6
Man kunne osse bruge det at kopierer koden ved begrebet "code injection". Her kopierer man koden over i et anden process. Det kan du for eksempel bruge til at lade en exec fil slette sig selv i windows, et generalt problem.
Avatar billede kenneth_gorking Nybegynder
12. august 2008 - 13:58 #7
Ah, fedt nok! Så giver det mere mening :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester