//-------------------------------------------------------------------
//
// Gloria e Honra para ao unico DEUS, criador dos ceus e da terra
// em nome de Cristo Jesus. \o/
//
// Tiny Assembly ShellCode, test/prototype:
//
// DESC:
// Escreve/gera uma funcao compila ...
//
// BY: gokernel - gokernel@hotmail.com
//-------------------------------------------------------------------
#include <stdio.h>
#define CALL 0xe8
#define RET 0xc3
int i, x = 123;
char code[200];
char *p; // p = code;
int len;
//-------------------------------------------------------------------
// NAME: o
//
// DESC:
// Adiciona uma assembly instrucao na array (code) e incrementa 1
//
//-------------------------------------------------------------------
void o (char c)
{
*p++ = c;
len++;
}
//-------------------------------------------------------------------
// NAME: get_addr
//
// DESC:
// Incrementa(4) a array de char com o ENDERECO da variavel ...
//
// USAGE:
// get_addr ( &var_name );
//
//-------------------------------------------------------------------
void get_addr (void *func)
{
if (func) {
*(long *)p = func;
p += sizeof (long);
len += sizeof (long);
printf ("OK FUNCAO ENCONTRADA\n");
}
else printf ("function NOT FOUND\n");
}
void hello (void)
{
x = 1000;
printf ("\nFUNCAO FUNCIONA - Hello World - GLORIA A DEUS \\o/ \n\n");
}
//---------------------------------------------------------------
// howto ... ;)
//
// esta funcao foi usada como COBAIA para aprender como fazer ...
//---------------------------------------------------------------
void assembly (void)
{
asm ("movl $_hello, %ebp");
asm ("movl %ebp, %eax");
asm ("call *%eax");
}
void incl (void *var)
{
if (var) {
o(0xff); o(0x05); // <<<<<<< opcode
*(long *)p = var;
p += sizeof (long);
len += sizeof (long);
}
}
//-------------------------------------------------------------------
// NAME: movl
//
// DESC:
// Assembly ( MOVL ) instrucao ...
// Seta uma variavel (int/long) com um valor
//
// USAGE:
// movl ( &var_name, valor );
//
//-------------------------------------------------------------------
//
void movl (int var_name, int value)
{
if (var_name)
{
o(0xc7); o(0x05);
//*(int *)a = &x;
*(long *)p = var_name;
p += sizeof (long);
len += sizeof (long);
*(long *)p = value;
p += sizeof (long);
len += sizeof (long);
}
}
int main (int argc, char *argv[])
{
p = code;
o(0x55); // push %ebp
o(0x89); o(0xe5); // mov %esp,%ebp
//---------------------------------------------------------------
// 40129e: bd 90 12 40 00 mov $0x401290,%ebp
// 4012a3: 89 e8 mov %ebp,%eax
// 4012a5: ff d0 call *%eax
//---------------------------------------------------------------
//
o(0xbd); get_addr (&hello); // mov $0x401290,%ebp
o(0x89); o(0xe8); // mov %ebp,%eax
o(0xff); o(0xd0); // call *%eax
o(0x5d); // pop %ebp
o(RET); // ret
#ifdef __WIN32__
asm ("call _code");
#endif
#ifdef __linux__
asm ("call code");
#endif
// x inicia com: 123
//
// veja o valor agora
//
printf("Valor de x: %d\n", x);
return 0;
}