elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 ... 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
171  Programación / Programación C/C++ / [Source] Crypter Simple Vr 2(?) FIX 1 en: 18 Julio 2009, 04:09 am
Bueno, los que me hayan leído mis últimos post verán que arme una clase para desarmar la clásica estructura PE... el tema es que hacía un tiempo había visto el código de un crypter simple en este foro (para ser más exacto http://foro.elhacker.net/programacion_cc/source_crypter_simple-t204227.0.html;msg969905#msg969905) el cual no funcionaba muy bien (con algunos ejecutables el resultado era desastroso) porque no tenía en cuenta un par de cosas que he agregado a este nuevo crypter...

Antes que nada paso a explicar un par de cosas para que a los que le interese el código puedan seguirlo...

1º y fundamental... los tipos de direccionamiento (la parte más complicada...  :P), bueno... en esta clase que cree hay 3 tipos básicos de direccionamiento:
A:Por Offset: la clase lo que hace es subir a memoria el archivo, entonces este tipo de direccionamiento nos lleva directamente a una posición de memoria del archivo, osea suponiendo que nuestra variable que contiene el contenido del archivo se llame buffer:

Citar
Offset(10) => &buffer[10]
*Offset(0) = 'M';*Offset(1) ='Z';

B: Por RVA: la clase es capaz de resolver direcciones virtuales, en este caso al setear un valor, se calculará el offset de acuerdo a este valor y obtendremos la posición de memoria del archivo... por ejemplo:

si una sección empieza físicamente en 400, pero tiene una dirección virtual de 1000, al hacer:

Citar
RVA(1024) = &buffer[424]

sin importar en cual sección se encuentre... (el algoritmo se encarga de eso)
C: por dirección referenciada: esta última opción (que agregué en esta versión) permite obtener el offset real de una dirección (la inversa de Offset), por ejemplo si tenemos una dirección 0x431212 y queremos saber en que punto del archivo se encuentra:

Código:
Address(0x431212) = 325
Offset(325) = 0x431212

bueno, ahora si el código:

Código
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        PE simple crypter (FIX 1)
  3. // Purpose:     Encriptador simple de Ficheros PE
  4. // Author:      Karman
  5. // Created:     2009-10-7
  6. // Copyright:   (c) Exinferis Inc
  7. // Web:         http://www.inexinferis.com.ar
  8. // Vr. : 0.1.1
  9. /////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include <stdio.h>
  12. #include "ExecAnalizer.h"
  13.  
  14. CCHAR DataDirectories[][24]={
  15.  "Export Table",
  16.  "Import Table",
  17.  "Resource Table",
  18.  "Exception Table",
  19.  "Certificate Table",
  20.  "Relocation Table",
  21.  "Debug Table",
  22.  "Architecture Table",
  23.  "Machine Table",
  24.  "Thread Local Storage",
  25.  "Load Config Table",
  26.  "Bound Import Table",
  27.  "Import Address Table",
  28.  "Delay Import Table",
  29.  "COM+ Runtime Header"
  30. };
  31.  
  32. BYTE ourcode[]={
  33.  //push old entrypoint...
  34.  0x68,0x00,0x00,0x00,0x00,
  35.  //push size of code
  36.  0x68,0x00,0x00,0x00,0x00,
  37.  //push address of code
  38.  0x68,0x00,0x00,0x00,0x00,
  39.  //call decrypt
  40.  0xE8,0x00,0x00,0x00,0x00,
  41.  //Ret
  42.  0xc3
  43. };
  44.  
  45. DWORD WINAPI GetFunctionSize(PBYTE dwStart);
  46. VOID  WINAPI descifrar(PBYTE address,INT size, DWORD oep);
  47. VOID  WINAPI cifrar(PBYTE address,INT size);
  48.  
  49. int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPInst,LPSTR lpCmd,int nShow){
  50.  DWORD nImageBase,nEntryPoint;
  51.  PIMAGE_NT_HEADERS pINH;
  52.  PIMAGE_SECTION_HEADER pISHCode;
  53.  PCHAR forig="C:\\WINDOWS\\regedit.exe";
  54.  PCHAR fcrytp="C:\\WINDOWS\\cifrado.exe";
  55.  printf("Abriendo -> %s\n",forig);
  56.  ExecAnalizer crypt(forig);
  57.  //nos aseguramos que sea PE...
  58.  if(crypt.GetDOSHeader()&&crypt.HasNewHeader()&&crypt.IsPE()){
  59.    printf("\tFile Is -> PE\n");
  60.    pINH = crypt.GetNTHeader();
  61.    //datos básicos del ejecutable
  62.    nEntryPoint=pINH->OptionalHeader.AddressOfEntryPoint;
  63.    nImageBase=pINH->OptionalHeader.ImageBase;
  64.    printf("\tEntryPoint -> %X\n",nEntryPoint);
  65.    printf("\tImageBase -> %X\n",nImageBase);
  66.    puts("Buscando Code Section:");
  67.    //sección del código
  68.    pISHCode=crypt.RVA2Section(nEntryPoint);
  69.    if(pISHCode){
  70.      printf("\tCode Section Found At -> %X\n",crypt.Address2Offset((PBYTE)pISHCode));
  71.      DWORD codeStart=pISHCode->VirtualAddress;
  72.      DWORD codeEnd=pISHCode->VirtualAddress+pISHCode->SizeOfRawData;
  73.      printf("\tCode Section Start At -> %X\n",codeStart);
  74.      printf("\tCode Section End At -> %X\n",codeEnd);
  75.      //buscamos si alguna otra cosa se encuentra tb en el area de código
  76.      puts("Buscando Tablas en Code Section (Calculando tamaño real del código)");
  77.      for(int i=0;i<15;i++){
  78.        if(pISHCode==crypt.RVA2Section(pINH->OptionalHeader.DataDirectory[i].VirtualAddress)){
  79.          printf("\t%s is in Code Section At %X - %X\n",DataDirectories[i],
  80.            pINH->OptionalHeader.DataDirectory[i].VirtualAddress,
  81.            pINH->OptionalHeader.DataDirectory[i].Size
  82.          );
  83.          DWORD tAdress=pINH->OptionalHeader.DataDirectory[i].VirtualAddress;
  84.          DWORD tSize=(pINH->OptionalHeader.DataDirectory[i].VirtualAddress+pINH->OptionalHeader.DataDirectory[i].Size);
  85.          if(nEntryPoint<tAdress){
  86.            if(codeEnd>tAdress)
  87.              codeEnd=tAdress;
  88.          }else{
  89.            if(codeStart<tSize)
  90.              codeStart=tSize;
  91.          }
  92.        }
  93.      }
  94.      puts("Tamaño real del código:");
  95.      printf("\tCode Section Start At -> %X\n",codeStart);
  96.      printf("\tCode Section End At -> %X\n",codeEnd);
  97.      // Valores reales (en el archivo)
  98.      DWORD rCodeStart=(DWORD)crypt.RVA2Offset(codeStart);
  99.      DWORD rCodeEnd=(DWORD)crypt.RVA2Offset(codeEnd);
  100.      //buscamos espacio libre dentro de la sección code para copiarnos...
  101.      puts("Buscando Espacio para nuestro Código:");
  102.      //tamaño de nuestro código...
  103.      DWORD decrypcodefuncsize=GetFunctionSize((PBYTE)descifrar);
  104.      DWORD decrypcodesize=decrypcodefuncsize+0x20;
  105.      //Espacios libres???
  106.      DWORD dwBlanks=0,dwAddress=(pISHCode->PointerToRawData+pISHCode->SizeOfRawData);
  107.      for(;((dwAddress>rCodeEnd)&&(dwBlanks<decrypcodesize));dwAddress--)
  108.        if(!*crypt.OffsetValue(dwAddress))dwBlanks++;else dwBlanks=0;
  109.      //tiene espacio???
  110.      printf("\tEspacio Necesario: %X - Espacio encontrado: %X\n",decrypcodesize,dwBlanks);
  111.      if(decrypcodesize>=dwBlanks){
  112.        printf("\tFree Space At -> %X\n",dwAddress);
  113.        //ciframos...
  114.        cifrar((PBYTE)crypt.RVAValue(codeStart),codeEnd-codeStart);
  115.        //copiamos la función que descifra
  116.        memcpy((PVOID)crypt.OffsetValue(dwAddress),(PVOID)descifrar,decrypcodefuncsize);
  117.        //armamos cabecera...
  118.        *(DWORD *)&ourcode[0x01]=nEntryPoint+nImageBase;
  119.        *(DWORD *)&ourcode[0x06]=codeEnd-codeStart;
  120.        *(DWORD *)&ourcode[0x0B]=codeStart+nImageBase;
  121.        *(DWORD *)&ourcode[0x10]=-(decrypcodefuncsize+20);
  122.        dwAddress+=decrypcodefuncsize;
  123.        memcpy((PVOID)crypt.OffsetValue(dwAddress),(PVOID)ourcode,24);
  124.        //calculamos nuevo entrypoint
  125.        pINH->OptionalHeader.AddressOfEntryPoint=crypt.Offset2RVA(dwAddress);
  126.        // Damos permiso de escritura a la sección. Si no hacemos esto nos dara error.
  127.        pISHCode->Characteristics |= IMAGE_SCN_MEM_WRITE;
  128.        // Corregimos tamaño de la sección virtual si insuficiente
  129.        if(pISHCode->Misc.VirtualSize<(crypt.Offset2RVA(dwAddress)-pISHCode->VirtualAddress+24))
  130.          pISHCode->Misc.VirtualSize=(crypt.Offset2RVA(dwAddress)-pISHCode->VirtualAddress+24);
  131.        crypt.Save(fcrytp);
  132.      }else
  133.        puts("\tSin espacio Suficiente... :(");
  134.    }
  135.  
  136.    system("pause");
  137.  }
  138. }
  139.  
  140. DWORD WINAPI GetFunctionSize(PBYTE dwStart){
  141.  PBYTE dwEnd=dwStart;
  142. while(*dwEnd!=0xC3&&*dwEnd!=0xC2)dwEnd++;
  143. if(*dwEnd==0xC2)return (dwEnd-dwStart+3);
  144. return (dwEnd-dwStart+1);
  145. }
  146.  
  147. VOID  WINAPI descifrar(PBYTE address,INT size, DWORD oep){
  148.  while(size>0){
  149.    *(address++)^=0x65;
  150.    size--;
  151.  }
  152.  //set ret to old entry point
  153.  asm("mov %0 , 0x04(%%esp)"::"r"(oep));
  154. }
  155.  
  156. VOID  WINAPI cifrar(PBYTE address,INT size){
  157.  while(size>0){
  158.    *(address++)^=0x65;
  159.    size--;
  160.  }
  161. }

Detalles a destacar a diferencia de la primera versión del cripter:
1º Checkeo "de qué se cifra": el código no cifra toda la sección CODE, ya que muchos compiladores tienen la opción de combinar dentro de la sección CODE otras estructuras (IMPORT por ejemplo), y al cifrar esta estructura el programa ya no es válido (el cifrado de la IAT va más allá de este simple código, además de que desconozco como realmente se hace)...

2º Corrección de secciones: nuevamente el código anterior agregaba su código dentro de la sección CODE, pero no verificaba que esta modificación esté dentro de los valores definidos en la sección...

3º El código para descifrar mantiene cierta "lógica" secuencial, (aunque no logré hacer funcionar el código original) cuando lo intentaba debuggear los debuggers no lo entendían...

bue... eso es todo...  :P ...

S2

PD: me olvidaba de poner la dir del code:

Crypter Simple

PD2: Desconozco si el código tenga algún problema... con los ejecutables que probé funcionó...  :P
172  Programación / PHP / Re: MINIFRAMEWORK - que les parece la lógica? en: 25 Mayo 2009, 20:18 pm
Si quieres que tu framework funcione con distintas bases de datos deberías implementarlo como modo factoría, de esta forma podrás usar el concepto de driver para interconectar con bases de datos distintas.

si, en realidad utilizo php adodb, por lo que no tengo tanto que preocuparme por las bases de datos... solo por algunas sentencias no compatibles..

Para ser un framework OO no veo claro el gráfico que pones... no parece que tenga relación con ningún modelo OO que viera. Si quieres hacerlo mejor instálate Dia o cualquier otro programa gratuito que te permita hacer modelos UML.

voy a probar...

Intenta abstraerte más de lo que es el producto final. Un modelo de desarrollo tiene que tener suficiente capacidad de abstracción como para que se pueda utilizar en varios casos diferentes. Con esto quiero decir que los usuarios son sólo entidades existentes en el sistema que podrían tener permisos de una lista de control (ACL) y/o roles.

esa es la idea, por eso lo estoy tratando de hacer lo más genérico y simple posible el sistema de comunicación cosa que permita lograr grandes cambios en el sistema con pocas modificaciones...

Si planteas tu sistema como un sistema modular, los módulo deberían ser una extensión de lo que ya existe y deberian abstraerse de los tipos de datos. Yo haría una interface para implementar a posterior los modulos que necesitase.

si, la cosa es así, existe un objeto módulo que es creado por el sistema enviándole los parámetros del entorno, este objeto "se crea" de acuerdo a estos parámetros y va llamando a funciones "propias del módulo en si", algo así como:

Citar
objeto: noticia                         modulo:noticia.php
this->crear(...)                        funcion noticia_crear($zthis,$args)...

con la salvedad que "crear" es un argumento enviado del entorno... de esta forma en mi función noticia_crear tengo...

Citar
$zthis (objeto base)
$zthis->BD (base de datos con chequeo interno de privilegios)
$zthis->user (información pertinente al usuario actual)
$zthis->sesion (información de sesiones)
$zthis->files [opcional] (objeto que me permite trabajar con archivos, algo así como un gestor)
$zthis->sections [opcional] (objeto que permite categorización de contenido)

el sistema también contempla la opción de instalar nuevos módulos "on runtime", de esta forma lo único que debe ser instalado "manualmente" es el corazón...

Si planteas tu sistema con dos tipos de datos definidos vas a cometer un error de base que luego te puede contar solucionar.  Toma cualquier contenido que exista como una entidad, una entidad puede tener atributos y propiedades que son los que le dan las características a cada contenido. Si defines los contenidos (cualquier contenido) como si fuera una entidad para tu framework, podrás ampliarlos, modificarlos y crear tantos tipos de contenidos como necesites.

si, por eso es que por ejemplo con el tema de los archivos de los módulos (algo que utilizo mucho) el objeto "Files" es el que se encarga de (sin importar el tipo de archivo) almacenarlo donde corresponda (física y lógicamente en la DB) y devolver un identificador único de archivo, luego este identificador es doblemente almacenado con los atributos propios del tipo de archivo (archivo físico o referencia a archivo externo, imagen, sonido, etc..., etc...)

S2
173  Programación / PHP / Re: MINIFRAMEWORK - que les parece la lógica? en: 22 Mayo 2009, 13:53 pm
Es lo que utilizo... (aunque no recordaba el nombre...) por eso aclaré que trabajo con Smarty... en este caso mi controlador es index.php...

S2
174  Programación / PHP / MINIFRAMEWORK - que les parece la lógica? en: 22 Mayo 2009, 05:41 am
Buenas, estoy desarrollando un miniframework con el cual estoy armando páginas para varios clientes con distintas bases de datos y configuraciones de servidor... (dos puntos que me han quebrantado hasta hoy), la idea de este post es exponer como lo estoy desarrolando para ver si se puede mejorar y obviamente facilitar mi vida..  :P

La idea actual es la siguiente, está totalmente programado en objetos y tiene un solo archivo direccionador (index.php)

Hay una clase base X(base), que es la index.php crea, esta clase se encarga de inicializar la base de datos (objeto), obtener información de la versión del software y otras configuraciones generales (en DB), inicializar sesiones(objeto), obtener datos de usuarios(objeto), (si sesiones le dice que hay alguno) y obtener parámetros enviados...

Si todo ok... index.php llama a "X->visualizar", función que se encarga de crear un objeto Módulo que se crea en base a los parámetros enviados... cada módulo está en DB y tiene su grupo de variables de módulo y dos especiales que son Archivos y Secciones...

El método principal del Objeto módulo tiene únicamente dos respuestas... Falso si no existe el módulo o el usuario no tiene permisos, o el resultado del modulo en si (aclaro que trabajo con Smarty ), el módulo (dependiendo de las variables del mismo) crea dos subclases (secciones y archivos), dichas clases son dependientes del módulo, otorgando o restringiendo permisos dependiendo del módulo y usuario (un módulo no puede borrar un archivo de otro módulo o un usuario con pocos permisos no puede eliminar una sección de un usuario con más permisos, etc...), osea quedaría esta estructura (mas o menos)

Citar
       index.php
              |
         sistema
       /      |      \
   DB  sesiones  usuarios
       \      |       /
          modulo
         /     |     \
  archivos |  secciones (o categorías)
         \     |     /
       modulo en si (noticias, descargas, etc...)

ustedes que piensan? como se podría mejorar?

S2
175  Programación / PHP / Re: Login con PHP y mysql en: 22 Mayo 2009, 03:44 am
el codigo va a ser igual de seguro, pero el tuyo solo funciona habilitando una directiva de php insegura

1º no es mi código... y 2º register_globals viene por defecto desactivada, por lo que se asume que primero hace esto:

Código:
$clave=$_POST['clave'];

etc...

S2
176  Programación / PHP / Re: Login con PHP y mysql en: 21 Mayo 2009, 05:17 am
mejor hace esto, que es mas seguro (y pone register_globals=off en el php.ini):
'select * from users where pass="'.md5($_REQUEST["clave"])."' and name='".$_REQUEST["nombre"]."';"

"eso" es más seguro? ... para mi es igual

S2
177  Programación / PHP / Re: Login con PHP y mysql en: 21 Mayo 2009, 03:44 am
además necesitas aprenderte sesiones... busca información sobre sesiones en PHP, aunque sobran en ejemplos en este foro...

S2
178  Programación / Bases de Datos / Re: (SQL) Diferencias entre tablas de una misma tabla? en: 21 Mayo 2009, 03:43 am
pa los que saben...no hay forma de hacer que el código de arriba funcione con ambas bases de datos??? :huh: no le encuentro la vuelta...  :-(

S2
179  Programación / Bases de Datos / Re: (SQL) Diferencias entre tablas de una misma tabla? en: 20 Mayo 2009, 04:33 am
Si aún quieres retener todos los campos, podrías usar GROUP BY para agruparlos por DATA y así se te haga más fácil luego el procesamiento (ya que al estar ordenados sería cuestión de agarrar un registro e ignorar mientras sean iguales).

si... es lo que termine haciendo, pero en MSSQL me patea por que hay multiples eid y no sabe como agruparlos... en MySQL me devuelve el primero (lo que quería), ahora el tema es hacer que funcine en ambas bases de datos (uso las dos) o hacerlo a mano...

S2
180  Programación / Bases de Datos / Re: (SQL) Diferencias entre tablas de una misma tabla? en: 20 Mayo 2009, 04:19 am
lo conseguí!!!!  :xD esta es la sentencia:

Código
  1. SELECT * FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA

S2
Páginas: 1 ... 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
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines