Proyecto Metamorph

Iniciado por [Zero], 24 Abril 2009, 23:31 PM

0 Miembros y 1 Visitante están viendo este tema.

[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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Arkangel_0x7C5

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

YST



Yo le enseñe a Kayser a usar objetos en ASM

[Zero]

#23
Cita de: Arcangel_0x7C5 en  8 Mayo 2009, 22:04 PM
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.

Cita de: YST en  8 Mayo 2009, 22:06 PM
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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

YST

Conectate a msn y pasame un ejecutable que este pasado por el source o postealo acá que no tengo compilador acá ;(


Yo le enseñe a Kayser a usar objetos en ASM

[Zero]

#25

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Arkangel_0x7C5

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

[Zero]

Fallo mío, eso me pasa por tener el escritorio hecho un desastre de tanta prueba

[Original]
[Modificado]

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Karcrack

#28
Recuerda modificar también los Data Directories :rolleyes:

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 :huh:
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

[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  :P. Osea el SizeOfImage original es 5000 entonces al aumentar 200 pos lo aumente 200, pero entonces peta (Creo que ya sé por que es  :xD). El virtual addres de la sección que viene después igual  :o. 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  :huh:.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche