Direccion sección

Iniciado por soez, 8 Agosto 2010, 15:51 PM

0 Miembros y 2 Visitantes están viendo este tema.

soez

#10
Jeje para decir que no me ves capacitado si debes de creerlo, en unos dias te pongo un codigo, para que lo veas ;)

PD. Lo que si resulta facil es aconsejar en vez de decir, esto tienes que aprender, eso si que es poner interes, uff
01001010 01100001 01110110 01101001 01100101 01110010

bizco

Yo no he dicho que no te veo capacitado, te he dicho que tendrias que estudiar el formato de los ficheros con los que quieres trabajar. como ya te he demostrado en el estaban tus dudas aclaradas.


soez

#12
Yo no me referia a poco o mucho capacitado, si no el interes que pongo

Cita de: ctlon en  9 Agosto 2010, 02:06 AM
Yo no he dicho que no te veo capacitado, te he dicho que tendrias que estudiar el formato de los ficheros con los que quieres trabajar. como ya te he demostrado en el estaban tus dudas aclaradas.

EDITO: Lo tenia hecho desde ayer, lo que pasa que no se por que no me funca, si pregunto es por algo, y aprendo mas programando que estudiandolo

//Variables cabecera
                   PIMAGE_DOS_HEADER PIDH;
                   PIMAGE_NT_HEADERS PINTH;
                   PIMAGE_SECTION_HEADER PISH;
                   LPSTR lpFileMaped;
                   //Direccion DOS
                   PIDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
                   //Cogemos la direccion donde empieza el PE
                   PINTH=(PIMAGE_NT_HEADERS)&lpFileMaped[PIDH->e_lfanew];
                   //Manejador
                   HANDLE hFile;
                   //Escribimos variables
                   DWORD dwTamArchivo, dwNumeroBytesLeidos;
                   //Recorremos todas las secciones
                   //for(DWORD i=0; i<INTH->FileHeader.NumberOfSections; i++)
                   //{
                       //Cogemos la direccion de la sección
                       PISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[PIDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*1];
                       //Abrimos el fichero
                       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 de la sección en bytes
                       LPSTR lpBuffer = (LPSTR)GlobalAlloc(GPTR, dwTamArchivo);
                       //Leemos la sección una vez pasado a bytes, metiendo el contenido en lpBuffer
                       ReadFile(hFile, lpBuffer, dwTamArchivo - (PISH->PointerToRawData + PISH->SizeOfRawData), &dwNumeroBytesLeidos,0);
                       //Nos colocamos en la sección
                       SetFilePointer(hFile, PISH->PointerToRawData, 0, 0);
                       //Ciframos o desciframos con XOR ^ 100
                       for(DWORD j=0; j<0PISH->SizeOfRawData; j++){
                       lpBuffer[j]^=250;}
                       //Nos colocamos en la sección
                       SetFilePointer(hFile, PISH->PointerToRawData, 0, 0);
                       //Sobreescribimos los nuevos carácteres
                       WriteFile(hFile, lpBuffer, dwTamArchivo - (PISH->PointerToRawData + PISH->SizeOfRawData), &dwNumeroBytesLeidos,0);
                   //}//for i
                   //ciframos
                   //Cerramos el fichero
                   CloseHandle(hFile);


Esto en la nueva sección estaria bien?


inicio = INTH.OptionalHeader.ImageBase + ISH.VirtualAddress;  
final = INTH.OptionalHeader.ImageBase + ISH.VirtualAddress + ISH.misc.VirtualSize;

y el nuevo entry point ?

INTH.OptionalHeader.AddressOfEntryPoint = INTH.OptionalHeader.ImageBase + ISH.VirtualAddress + INTH.OptionalHeader.sizeofimage

Contando con que la sección tenga caracteristicas de escritura
01001010 01100001 01110110 01101001 01100101 01110010

[L]ord [R]NA

Cita de: soez en  9 Agosto 2010, 01:33 AM
Valla animos que das majete, debes de creerte el unico capacitado.

Deberias de ponerte en mi posicion cuando no sabia ingles y queria aprender ASM, pregunte en un lugar y me dieron lo que tenia que leer, dije que no entendia y me dijeron que era un p*to que no daria para esto por preguntar tanto, que dejara de intentar programar y me fuera a jugar algun juego de esos que con un manual sale sencillo... Ctlon  y Zero no estan mostrando que esten capacitados o no, si estan ahi es porque deben de estarlo. hay un señor que dijo.

"Dale un Pez y comera por un Dia, enseñalo a pezcar  y comera toda la vida".

bizco

lo primero que no me gusta es que ni verificas el resultado de las funciones y continuas llamando una tras otra sin control alguno, pon el codigo completo si tienes dudas y soluciona lo primero.

soez

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


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


//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


//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);
01001010 01100001 01110110 01101001 01100101 01110010

Jeferi

#16
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

soez

jeje no pasa nada, y llevas razon en lo que dices. Saludos bro ;)
01001010 01100001 01110110 01101001 01100101 01110010

[L]ord [R]NA

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

bizco

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.