Diese Arbeit geschieht, weil function1 und function2 sind genau die gleichen Größe im Speicher. Wir brauchen die Länge von Funktion2 für unsere Memcopy, was getan werden sollte: int diff = (& Haupt - & Funktion2);
Sie werden bemerken, dass Sie die Funktion 2 nach Ihren Wünschen bearbeiten können und es funktioniert immer gut!
Btw ordentlich Trick. Unglaublich, der g ++ Compiler spuckt ungültige Konvertierung von void * nach int aus ...Aber in der Tat mit gcc kompiliert es perfekt;)
Modified Quellen:
//Hacky solution and simple proof of concept that works for me (and compiles without warning on Mac OS X/GCC 4.2.1):
//fixed the diff address to also work when function2 is variable size
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <sys/mman.h>
int function1(int x){
return x-5;
}
int function2(int x){
//printf("hello world");
int k=32;
int l=40;
return x+5+k+l;
}
int main(){
int diff = (&main - &function2);
printf("pagesize: %d, diff: %d\n",getpagesize(),diff);
int (*fptr)(int);
void *memfun = malloc(4096);
if (mprotect(memfun, 4096, PROT_READ|PROT_EXEC|PROT_WRITE) == -1) {
perror ("mprotect");
}
memcpy(memfun, (const void*)&function2, diff);
fptr = &function1;
printf("native: %d\n",(*fptr)(6));
fptr = memfun;
printf("memory: %d\n",(*fptr)(6));
fptr = &function1;
printf("native: %d\n",(*fptr)(6));
free(memfun);
return 0;
}
Ausgang:
Walter-Schrepperss-MacBook-Pro: cppWork wschrep $ gcc memoryFun.c Walter-Schrepperss-MacBook -Pro: cppWork wschrep $ ./a.out Seitengröße: 4096, diff: 35 nativer: 1 Speicher: 83 nativer: 1
Eine andere nicht e ruft printf wird segfault, weil printf höchstwahrscheinlich nicht gefunden wird, weil die relative Adresse falsch läuft ...
Sie haben diese Frage schon einmal hier gestellt, http://stackoverflow.com/questions/4541419/dynamic-obfuscation-by -self-modifying-code/4541911 # 4541911 - warum fragst du nochmal? –
Durchsuchen Sie das Web nach "embedded copy C function RAM" für weitere Informationen. –
Was ist das Besondere, das sowieso verschleiern muss? –