Προς το περιεχόμενο

Πως θα ανεβασω μια function στη μνημη (C++)


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Πως γινετε να ανεβασω μια function σε ενα pointer???

Πειραματιζομαι με τη μνημη και θελω να κανω dump μια function, μεχρι τωρα εκανα dump ενα struct

 

>// memtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

struct fee
{
int a;
char c;
};


int _tmain(int argc, _TCHAR* argv[])
{
void *ptr=malloc(5);
fee f;
f.a = 1234;
f.c = 65;
ptr= &f;
unsigned char *cptr =(unsigned char*) ptr;
//dump
for(int i=0;i<5;i++)
{
	printf("%p:  %d\n",&cptr[i],(int)cptr[i]);
}


getchar();
return 0;
}

 

Την function πως θα την ανεβασω?? πχ

void func ( int a){}

 

main()

{

...

func * f; //??????? :rolleyes:

}

 

---------- Το μήνυμα προστέθηκε στις 02:55 ----------

 

Τα καταφερα! αλλα... Πως θα βγαλω το μεγεθος της function???

>// memtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

void func(void){}

int _tmain(int argc, _TCHAR* argv[])
{
   
void *fptr = &func;
   unsigned char * y=(unsigned char*)fptr;

for(int i=0;i<10;i++)
{
	printf("%p:  %d\n",&y[i],y[i]);
}
getchar();
return 0;
}

Δημοσ.

Ο pointer δεν περιέχει σαν τιμή τα περιεχόμενα αυτού που δείχνει. Περιέχει απλά την διεύθυνση όπου βρίσκεται αυτό στο οποίο δείχνει. Το να κάνεις τον pointer να δείχνει στην συνάρτηση δεν σημαίνει ότι θα έχει σαν τιμή τον κώδικα της συνάρτησης.

 

Αν και αυτό που θες είναι λίγο "κουφό" θα μπορούσες να κάνεις το εξής :

Ο pointer σου δείχνει στην αρχή της συνάρτησης (όπως το έκανες ήδη).

Κάνεις cast τον pointer σε char * και τον αυξάνεις κάθε φορά κατά ένα μέχρι να βρεις την τιμή του op code RETN (εκεί τελειώνει η συνάρτηση). Κάθε φορά αντιγράφεις το byte στο οποίο δείχνει ο char * σε έναν μεγάλο πίνακα χαρακτήρων.

Δεν είμαι σίγουρος τι μέγεθος έχουν οι op codes

Η μέθοδος αυτή που περιγράφω είναι πάρα πολύ πιθανό να αποτύχει. Για παράδειγμα αν ο RETN είναι ας πούμε το 0x34, αυτό το byte μπορεί να βρεις και πριν τελειώσει η συνάρτηση. Μπορεί να κάνει μέσα η συνάρτηση :

 

int i = 0x34; --- οπότε εδώ το έχασες

 

Επιπλέον ακόμα και να επιτύχει αυτό, αυτό που θα έχεις θα είναι ένα char array με ακαταλαβίστικες τιμές. Να έχεις υπόψη ότι οι τιμές μεταβλητών και παραμέτρων δεν βρίσκονται στην ίδια περιοχή μνήμης με τον κώδικα της συνάρτησης. Οι μεταβλητές βρίσκονται στην στοίβα και εξαρτώνται από την κάθε κλήση της συνάρτησης, ενώ ο κώδικας είναι σε ένα συγκεκριμένο σημείο πάντα.

 

karnage ;)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...