1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char* end = NULL;
static int i=0;
void containsBloc() {
__asm__ __volatile__ (
";\n"
".block_begin: \n"
"\tmovl i, %%eax"
: "=a"(i) :
);
__asm__ __volatile__ (
"addl $4, %%eax"
: "=a"(i) : "a"(i)
);
__asm__ __volatile__ (
"jmp *%0\n"
".block_end: "
: : "m"(end)
);
}
int main(int argc, char** argv) {
unsigned char* beginBlock;
unsigned char* endBlock;
unsigned char *buf;
unsigned char *beginBuf;
size_t size;
__asm__ __volatile__("movl $.end, %%edx" :"=d"(end) );
__asm__ __volatile__("movl $.block_begin, %%ebx" :"=b"(beginBlock) );
__asm__ __volatile__("movl $.block_end, %%ecx" :"=c"(endBlock) );
size = endBlock - beginBlock;
buf = mmap(NULL, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (buf == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
beginBuf = buf;
memcpy(buf, beginBlock, size);
buf += size;
if (msync(beginBuf, size, MS_INVALIDATE) != 0) {
perror("msync");
exit(EXIT_FAILURE);
}
__asm__ __volatile__ (
"jmp *%0\n"
".end:\n"
: : "m" (beginBuf)
);
printf("%d\n",i);
return 0;
} |
Partager