Problema al modificar sección .text

Iniciado por Vaagish, 7 Octubre 2014, 19:39 PM

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

Vaagish

#10
Bueno.. como no funciona y ya no entiendo que pasa, hice un codigo ejemplo..

Alguien se anima a probar este codigo?

Código (cpp) [Seleccionar]
int Crypt(char *filename, char *section)
{
LPBYTE Start;

HANDLE hFile = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
return -1;
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (hFileMapping == 0){
CloseHandle(hFile);
return -1;
}
LPBYTE lpFileMap = (LPBYTE)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (lpFileMap == 0){
CloseHandle(hFileMapping);
CloseHandle(hFile);
return -1;
}

PIMAGE_DOS_HEADER IDH = (PIMAGE_DOS_HEADER) lpFileMap;
PIMAGE_NT_HEADERS INH = (PIMAGE_NT_HEADERS)((BYTE *)IDH + IDH->e_lfanew);
PIMAGE_OPTIONAL_HEADER IOH = (PIMAGE_OPTIONAL_HEADER)&INH->OptionalHeader;
PIMAGE_SECTION_HEADER ISH;

for (byte i = 0; i < INH->FileHeader.NumberOfSections; i++)
{

ISH = (PIMAGE_SECTION_HEADER)(lpFileMap + IDH->e_lfanew + sizeof(IMAGE_NT_HEADERS)+ sizeof(IMAGE_SECTION_HEADER)*i);

Start = lpFileMap + ISH->PointerToRawData;
if (strcmp((char *)ISH->Name, section) == 0)
{
for(DWORD i=0; i<ISH->Misc.VirtualSize; i++)
Start[i] ^= 'a';
}
}

UnmapViewOfFile((LPCVOID)lpFileMap);
CloseHandle(hFileMapping);
CloseHandle(hFile);

return 0;
}


El problema que tengo yo con esto es que al cifrar el programa Netcat, le cambia el EntryPoint a 4057F2 cuando debería ser otro..

Esta claro, pero por las dudas...
Código (cpp) [Seleccionar]
Crypt("nc.exe", ".text");

Gracias! Saludos!

Eternal Idol

#11
Mmm al parecer te estas pasando de rango ... ¿Donde se supone que estas cambiando el entry point en ese codigo exactamente? ¿O es un efecto no deseado?

Tendrias que usar SizeOfRawData.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Citar¿Donde se supone que estas cambiando el entry point en ese codigo exactamente? ¿O es un efecto no deseado?

Es un defecto no deseado  :xD
Así como esta no le cambio el EP, se cambia solo..  :rolleyes:

Citar¿No sera que Start deberia usar VirtualAddress en realidad?:
Start = lpFileMap + ISH->PointerToRawData;

Ya probé hasta con la dirección psíquica!

CitarMmm al parecer te estas pasando de rango

Ya no tengo ni idea que puede ser.. hace rato que estoy con esto, y me estoy por decantar a que es "problema" del netcat..   :¬¬

Saludos! Gracias!

Eternal Idol

#13
No, Start estaba bien (no lo estas mappeando con SEC_IMAGE), pero entonces deberias usar SizeOfRawData. No tengo ese ejecutable a mano, pero con unos simples printfs podrias ver a que equivale lpFileMap, Start e IOH que es lo que estas tocando sin querer.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Citarentonces deberias usar SizeOfRawData

Oky, cambiado..

CitarNo tengo ese ejecutable a mano, pero con unos simples printfs podrias ver a que equivale lpFileMap, Start e IOH que es lo que estas tocando sin querer.

Ya imprimí, use dumpbin, windgb, olly, la mar en coche, etc, etc  :xD

Ya creo que es con nc, voy a probar con otros ejecutables grandes.. a ver que pasa..

Salu2!

Eternal Idol

Cita de: Vaagish en 17 Octubre 2014, 00:43 AMYa imprimí, use dumpbin, windgb, olly, la mar en coche, etc, etc  :xD

¿Y que te dio? Start deberia ser muy cercano a IOH para que se produzca el problema ... o es otra parte del programa de la cual no tenemos el codigo. ¿Probaste a aislar esto solo y ya genera el problema?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Mira:

Valores de Start

Citar900098 -> IOH

900400 -> .text
905800 -> .data
905A00 -> .rdata
900000 -> .bss
906C00 -> .idata
907800 -> .CRT
907A00 -> .tls

Si comento esto:
Código (cpp) [Seleccionar]
for(DWORD i=0; i<ISH->SizeOfRawData; i++)
Start[i] ^= 'a';


El EP no cambia,, pero claro.. tampoco se cifra   :silbar:

Ahora que veo bien... porque va a estar IOH en ese lugar ???? No esta mal eso?

Salu2

Eternal Idol

Si tu Start arranca en 0x900400 no veo como puede escribir en 0x9000A8 ... ¿El nc.exe es el mismo que esta aca? http://eternallybored.org/misc/netcat/ Con ese no me pasa lo que decis ... ¿Tu programa es de 32 o 64 bits? ¿Estas viendo el EP con DUMPBIN, no?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Yo tampoco.. voy a bajar ese nc a ver si es por eso.. tengo una version de nc con su codigo, pero jamas pense que fuera eso.. va.. ya dudaba de todo en realidad..

Es de 32 bits (nc y crypter)

Mañana actualizo..

Saludos!

MCKSys Argentina

Bueno, no programo en C++ (sólo lo sé leer) pero si sé algo sobre este tema.

Agrandar una sección (y más aún, la sección de código) es un dolor de cabeza bastante grande. Quizás, si el código del cripter es pequeño, podrías encontrar algún code-cave en la sección e insertarlo ahí. Pero esto no siempre es posible.

Lo que normalmente se hace es agregar una nueva sección ejecutable al EXE y desde ahi puedes reconstruir el ejecutable tal cual estaba.

Si quieres un ejemplo, puedes revisar lo que hace el packer UPX.

De ahí seguro sacarás ideas interesantes...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."