Autor
|
Tema: Direccion sección (Leído 10,494 veces)
|
soez
Desconectado
Mensajes: 76
|
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
|
|
« Última modificación: 9 Agosto 2010, 02:04 am por soez »
|
En línea
|
01001010 01100001 01110110 01101001 01100101 01110010
|
|
|
bizco
Desconectado
Mensajes: 698
|
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.
|
|
|
En línea
|
|
|
|
soez
Desconectado
Mensajes: 76
|
Yo no me referia a poco o mucho capacitado, si no el interes que pongo 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
|
|
« Última modificación: 9 Agosto 2010, 05:08 am por soez »
|
En línea
|
01001010 01100001 01110110 01101001 01100101 01110010
|
|
|
[L]ord [R]NA
Desconectado
Mensajes: 1.513
El Dictador y Verdugo de H-Sec
|
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".
|
|
|
En línea
|
|
|
|
bizco
Desconectado
Mensajes: 698
|
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.
|
|
|
En línea
|
|
|
|
soez
Desconectado
Mensajes: 76
|
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);
|
|
« Última modificación: 14 Agosto 2010, 12:03 pm por soez »
|
En línea
|
01001010 01100001 01110110 01101001 01100101 01110010
|
|
|
Jeferi
|
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 am por Jeferi »
|
En línea
|
|
|
|
soez
Desconectado
Mensajes: 76
|
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
Mensajes: 1.513
El Dictador y Verdugo de H-Sec
|
No existen caminos cortos, se debe aprender todo porque no sabes cuando lo necesitaras.
|
|
|
En línea
|
|
|
|
bizco
Desconectado
Mensajes: 698
|
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
|
|
|
|
|
|