Simples JIT (just in time) em C
Publicado por ??? (última atualização em 08/07/2013)
[ Hits: 3.537 ]
Este é um simples exemplo de um JIT (just in time) escrito em puro C para Windows e GNU/Linux em 32 bits.
Este exemplo gera uma simples função que chama outra função (hello)...
Espero que seja útil para alguém.
//------------------------------------------------------------------- // // THANKS TO: // The only GOD, creator of heaven and earth, in the name of JESUS CHRIST. // // DESCRIPTION: // A simples JIT (32 bits) x86. // // FILE: // asm.c // // COMPILE: // gcc asm.c -o asm -m32 -O2 -Wall // // BY: gokernel - gokernel@hotmail.com // //------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #ifdef __linux__ #include <unistd.h> #include <sys/mman.h> // for: mprotect #endif typedef struct ASM { unsigned char *code; int len; }ASM; ASM *asm_new (int size) { ASM *a = (ASM*) malloc (sizeof(ASM)); a->code = (unsigned char*) malloc (size); a->len = 0; return a; } //------------------------------------------------------------------- // This function use the code of Fabrice Bellard: // // LIB: tcc-0.9.25 // FILE: libtcc.c // FUNC: void set_pages_executable (void *ptr, unsigned long length); // LINE: 400 // // Set executable: a->code // //------------------------------------------------------------------- void asm_set_executable (ASM *a) { #ifdef __linux__ unsigned long start, end, PageSize; PageSize = sysconf (_SC_PAGESIZE); start = (unsigned long)a->code & ~(PageSize - 1); end = (unsigned long)a->code + a->len; end = (end + PageSize - 1) & ~(PageSize - 1); mprotect ((void *)start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC); #endif } // 1 byte void asm_gen (ASM *a, unsigned char c) { *(unsigned char*)(a->code + a->len) = c; a->len++; } // 4 bytes void asm_get_addr (ASM *a, void *ptr) { *(void**)(a->code + a->len) = ptr; a->len += sizeof (void*); } // 7 bytes void asm_op_call (ASM *a, void *func) { // b8 7a 13 40 00 mov $0x40137a,%eax // ff d0 call *%eax // asm_gen (a, 0xb8); asm_get_addr (a, func); asm_gen (a, 0xff); asm_gen(a, 0xd0); } void hello (void) { printf ("\ncall function: Hello World\n\n"); } void execute (void) { ASM *a = asm_new (1000); if (a && a->code) { //----------------------------------------------------------- asm_gen(a, 0x55); // push %ebp asm_gen(a, 0x89); asm_gen(a, 0xe5); // mov %esp,%ebp asm_op_call (a, hello); asm_gen(a, 0xc9); // leave asm_gen(a, 0xc3); // ret //----------------------------------------------------------- asm_set_executable (a); // execute here // ( (void(*)())a->code ) (); free (a->code); free (a); } } int main (void) { execute (); printf ("Exiting with sucess !!!\n"); return 0; }
Escrita de um número em octal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)
codigo em assembley que soma dois numeros
Soma dois números lidos da memória
Escrita de um número em decimal na tela em Assembly Puro para Linux x86 (GNU Assembler)
Árvore binária de busca em Assembly - com comentários
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Preciso resolver um erro de DPKG (1)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (2)
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta