Autor
|
Tema: Proyecto Metamorph (Leído 35,077 veces)
|
|
[Zero]
|
La verdad sería buena cualquier ayuda y más en C/C++ ya que soy el único que está programando en eso  . Lo ideal sería agrandar la sección de código y nó la última, es más complicado pero así evitamos problemas (algunos antivirus saltan al ver 2 secciones de código  ). Ahora estoy viendo tambien que por ejemplo con delphi estará difícil, apenas hay huecos  . Yo pensaba hacerlo para la 2.0 pero si hay ayuda las cosas se terminan antes  . Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 289
|
solo abria que mover las demas secciones y colocar en la cabecera la nueva direccion de las secciones. Cuando termine lo que estoy haciendo, que no creo que me lleve mucho lo ago. Saludos
PD: a mi para estas cosas me gusta usar asm porque no hay que estar haciendo casting de tipos.
|
|
|
|
|
En línea
|
|
|
|
YST
Desconectado
Mensajes: 963
I'm you
|
Muy buen proyecto  . Como decia arkangel seria cosa de modificar el PE solamente para poner el espacio que necesites. Saludos.
|
|
|
|
|
En línea
|
 Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
|
[Zero]
|
Bueno, me surgío un problema, en lo de alargar la sección de código, no veo que es lo que falla, los valores del pe se cambian bien, copio lo que hay despues para adelante y relleno de 0's la parte que alargué, no se si falla porque se me pasó cambiar algún valor o por que existe algún valor estático fuera del pe  . Dejo el código que tengo para agrandar la sección de código, a ver si alguien ve donde puede estar el fallo: HANDLE hFile=CreateFile(nFileName,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0); if(hFile == INVALID_HANDLE_VALUE) { return NULL; } DWORD szFile=GetFileSize(hFile,0); if(szFile == INVALID_FILE_SIZE) { return NULL; } szFile=szFile+0x200; HANDLE hCFM=CreateFileMapping(hFile,0,PAGE_READWRITE,0,szFile,0); if(hCFM==NULL) { return NULL; } CloseHandle(hFile); LPSTR hMVOF=(LPSTR)malloc(szFile); hMVOF=(LPSTR)MapViewOfFile(hCFM,FILE_MAP_ALL_ACCESS,0,0,0); if(hMVOF==NULL) { return NULL; } CloseHandle(hCFM); PIMAGE_DOS_HEADER IDH; PIMAGE_NT_HEADERS INTH; PIMAGE_SECTION_HEADER ISH; IDH=(PIMAGE_DOS_HEADER)&hMVOF[0]; INTH=(PIMAGE_NT_HEADERS)&hMVOF[IDH->e_lfanew]; DWORD ExecutableSection=GetExecutableSection(hMVOF); ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection]; LPSTR Temp=(LPSTR)malloc(szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); CopyMemory(&Temp[0],&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+0x200],&Temp[0],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); BYTE zero=0x00; for(DWORD i=0;i<0x200;i++) { CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+i],&zero,1); } ISH->SizeOfRawData=ISH->SizeOfRawData+0x200; ISH->Misc.VirtualSize=ISH->Misc.VirtualSize+0x200; INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage+0x200; for(i=0;i<=INTH->FileHeader.NumberOfSections;i++) { ExecutableSection=GetExecutableSection(hMVOF); ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(ExecutableSection+1+i)]; ISH->PointerToRawData=ISH->PointerToRawData+0x200; ISH->VirtualAddress=ISH->VirtualAddress+0x200; } return hMVOF;
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 289
|
una pregunta, ordenas los datos de las secciones. Esque el orden en el que estan en la cabecera no tiene porque ser el mismo que en el exe.
saludos PD:Yo estabas haciendo ese code ahora en asm. ya casi esta. Lo pongo en un rato
|
|
|
|
|
En línea
|
|
|
|
|
[Zero]
|
Supongo que a ordenar los datos te refieres a que aumente según el AlignOfFile? Bueno como lo estaba intentando con un exe en concreto, pues puse añadir 0x200 que es el AlignOfFile sinó cargaría mal las secciones. Mirando el exe con el LordPe los valores están perfectos, pero el exe no arranca  . Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 289
|
yo me referia a que por ejemplo:
.text base 0x400
.data base 0x200
idata base 0x600
No se lo que podra ser.
Lo mirare con el EditorHex
saludos
|
|
|
|
|
En línea
|
|
|
|
|
|
|
[Zero]
|
yo me referia a que por ejemplo:
.text base 0x400
.data base 0x200
idata base 0x600
No se lo que podra ser.
Lo mirare con el EditorHex
saludos
Si cierto, eso se me pasó, tendré que arreglarlo comprobando el orden de las secciones, pero con el archivo que estaba probando el orden estaba normal, osea que hay otro error. SectionAlignment
El SectionAlignment está a 0x1000 pero las secciones del exe original ocupan 0x200 y yo añado otros 0x200 por lo que quedaría en 0x400. Sería otra cosa a arreglar pero que tampoco es el error en ésta caso. Saludos Edito: El exe modificado con el code queda así: No veo el fallo :S Saludos
|
|
|
|
« Última modificación: 8 Mayo 2009, 22:17 por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
|
|
|
[Zero]
|
|
|
|
|
« Última modificación: 8 Mayo 2009, 22:37 por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 289
|
a mi no me va ninguno, los dos son diferentes. pero no tienen modificada la tabla de secciones. esta modificada la cabecera PE.
Hay que cambiarle SizeOfRawData y PointerToRawData
Saludos
|
|
|
|
|
En línea
|
|
|
|
|
[Zero]
|
Fallo mío, eso me pasa por tener el escritorio hecho un desastre de tanta prueba [Original][Modificado]Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
|
Karcrack
|
Recuerda modificar también los Data Directories  Simplemente era que habías movido la Import Table, pero no habías modificado su Virtual Address... Para solucionarlo solo has de recorrer todos los Data Directories, y si su V.A es distinta de 0 sumale el tamaño que agregas a la sección  Versión Funcional Modificada: http://www.box.net/shared/ve6o4k2yea
Por lo visto no solo hace falta eso, el PE Explorer lo modifica casi todo  09.05.2009 00:26:11 : Saving new image file: Saving started... 09.05.2009 00:26:11 : Recalculating the Section Headers... 09.05.2009 00:26:11 : Section <.idata>: Old "VirtualAddress": 00404200h; New "VirtualAddress": 00404000h 09.05.2009 00:26:11 : Data Directory <Import Table>: Old "VirtualAddress": 00404200h; New "VirtualAddress": 00404000h 09.05.2009 00:26:11 : New Value of "SizeOfCode": 00000600h 09.05.2009 00:26:11 : Old "SizeOfImage": 00004256h; New "SizeOfImage": 00005000h; Change in "SizeOfImage": 00000DAAh 09.05.2009 00:26:22 : Updating "SizeOfImage"... New "SizeOfImage": 00005000h 09.05.2009 00:26:22 : Backup copy of the target file saved as: C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\ESCRITORIO\Copia de modMessageBox.exe.(1).bak 09.05.2009 00:26:22 : New image file saved as: C:\Documents and Settings\Administrador\Escritorio\Copia de modMessageBox.exe
|
|
|
|
« Última modificación: 9 Mayo 2009, 00:29 por Karcrack »
|
En línea
|
|
|
|
|
[Zero]
|
Dejando el source así con ese exe en concreto funciona: HANDLE hFile=CreateFile(nFileName,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0); if(hFile == INVALID_HANDLE_VALUE) { return NULL; } DWORD szFile=GetFileSize(hFile,0); if(szFile == INVALID_FILE_SIZE) { return NULL; } szFile=szFile+0x200; HANDLE hCFM=CreateFileMapping(hFile,0,PAGE_READWRITE,0,szFile,0); if(hCFM==NULL) { return NULL; } CloseHandle(hFile); LPSTR hMVOF=(LPSTR)malloc(szFile); hMVOF=(LPSTR)MapViewOfFile(hCFM,FILE_MAP_ALL_ACCESS,0,0,0); if(hMVOF==NULL) { return NULL; } CloseHandle(hCFM); PIMAGE_DOS_HEADER IDH; PIMAGE_NT_HEADERS INTH; PIMAGE_SECTION_HEADER ISH; IDH=(PIMAGE_DOS_HEADER)&hMVOF[0]; INTH=(PIMAGE_NT_HEADERS)&hMVOF[IDH->e_lfanew]; DWORD ExecutableSection=GetExecutableSection(hMVOF); ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection]; LPSTR Temp=(LPSTR)malloc(szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); CopyMemory(&Temp[0],&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+0x200],&Temp[0],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200)); BYTE zero=0x00; for(DWORD i=0;i<0x200;i++) { CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+i],&zero,1); } ISH->SizeOfRawData=ISH->SizeOfRawData+0x200; ISH->Misc.VirtualSize=ISH->Misc.VirtualSize+0x200; //INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage+0x200; //PIMAGE_DATA_DIRECTORY IDD; //PIMAGE_OPTIONAL_HEADER IOH; //IOH=&INTH->OptionalHeader ; //IDD=IOH->DataDirectory; //IDD++; //IDD->VirtualAddress=IDD->VirtualAddress+0x200; for(i=0;i<=INTH->FileHeader.NumberOfSections;i++) { ExecutableSection=GetExecutableSection(hMVOF); ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(ExecutableSection+1+i)]; ISH->PointerToRawData=ISH->PointerToRawData+0x200; //ISH->VirtualAddress=ISH->VirtualAddress+0x200; } return hMVOF; } Pero no entiendo un carajo, porqué así funciona? se supone que así está mal  . Osea el SizeOfImage original es 5000 entonces al aumentar 200 pos lo aumente 200, pero entonces peta (Creo que ya sé por que es  ). El virtual addres de la sección que viene después igual  . Y el puntero a la tabla de importaciones también, para que funcione hay que dejarlo como estaba, pero si lo moví 200 posiciones, que pasa? Lo único que se me ocurre es que funcione pero esté mal, que esos 0x200 que agregué no se carguen en memoria entonces las direcciones coinciden  . Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
|
|