|
1003
|
Seguridad Informática / Análisis y Diseño de Malware / Intento de agregar sección a ejecutable
|
en: 16 Septiembre 2011, 23:22 pm
|
Ya estoi aqui de nuevo, esta vez e intentado agregar una nueva sección a un ejecutable, sin exito este es el código que tengo: #include <windows.h> #include <stdio.h> #include <stdlib.h> int main() { IMAGE_DOS_HEADER dh; IMAGE_NT_HEADERS nth; IMAGE_SECTION_HEADER * sección; IMAGE_SECTION_HEADER nSeccion; // char * stub_dos -> Datos del STUB_DOS // char * dSecciones -> Datos de las secciones FILE * archivo = fopen("c:\\windows\\system32\\calc.exe","r+b"); if (archivo == NULL) { printf("Error al leer el archivo\n"); return 1; } fread(&dh ,sizeof(dh ),1,archivo ); // Rellenamos IMAGE_DOS_HEADER char * stub_dos = (char*)malloc(dh. e_lfanew-0x40); fread(stub_dos ,1,dh. e_lfanew-0x40,archivo ); // Leemos el Stub DOS fread(&nth ,sizeof(nth ),1,archivo ); // leemos nt headers sección = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER )*nth. FileHeader. NumberOfSections); fread(sección ,sizeof(IMAGE_SECTION_HEADER ),nth. FileHeader. NumberOfSections,archivo ); char * dSecciones = (char*)malloc(nth. OptionalHeader. SizeOfImage); fread(dSecciones ,nth. OptionalHeader. SizeOfImage,1,archivo ); //leo todos los datos de las secciones. fclose(archivo ); // terminamos de leer ZeroMemory(&nSeccion,sizeof(IMAGE_SECTION_HEADER)); int A = sección[nth.FileHeader.NumberOfSections-1].VirtualAddress; int B = sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize; int C = nth.OptionalHeader.SectionAlignment; strcpy((char*)nSeccion. Name,".fary"); // nombre de la nueva sección: .fary nSeccion.VirtualAddress = ((A+B)/C)*C+C;// direccion Virtual nSeccion.SizeOfRawData = 0x64; // tamaño de la sección: 100 nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + 0x64; // direccion fisica nSeccion.Characteristics = 0x10000020; nSeccion.Misc.VirtualSize = 0x64; //nSeccion.VirtulSize nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección nth.OptionalHeader.SizeOfImage += 0x64; FILE * nuevo = fopen("NuevaCalc.exe","wb+"); fwrite(&dh ,sizeof(dh ),1,nuevo ); fwrite(stub_dos ,dh. e_lfanew-0x40,1,nuevo ); fwrite(&nth ,sizeof(nth ),1,nuevo ); fwrite(sección ,sizeof(IMAGE_SECTION_HEADER )*nth. FileHeader. NumberOfSections,1,nuevo ); fwrite(&nSeccion ,sizeof(IMAGE_SECTION_HEADER ),1,nuevo ); fwrite(dSecciones ,nth. OptionalHeader. SizeOfImage,1,nuevo ); char * DatosSeccion = (char*)malloc(0x64); ZeroMemory(DatosSeccion,0x64); fwrite(DatosSeccion ,0x64,1,nuevo ); return 0; }
Genera bien el nuevo archivo pero no pone bien los datos de la sección y ni que decir de ejecutarse (peta) XD. Así es como salen los datos de mi sección desde el lordPE: haber si aguien sabe que ago mal... saludos.
|
|
|
1005
|
Seguridad Informática / Análisis y Diseño de Malware / Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
|
en: 5 Septiembre 2011, 13:21 pm
|
Ya lo e conseguido, muchas gracias a todos... El código arreglado es el siguiente: #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { IMAGE_DOS_HEADER idh; IMAGE_FILE_HEADER ifh; IMAGE_OPTIONAL_HEADER ioh; IMAGE_SECTION_HEADER ish; char ruta[] = "C:\\MS-DOC.exe"; FILE * archivo = fopen(ruta ,"r+b"); if (archivo == NULL) { // si no podemos abrri el archivo. printf("Error al abrir el archivo\n"); return 1; } fread(&idh ,0x40,1,archivo ); // rellenamos IMAGE_DOS_HEADER if (idh.e_magic != IMAGE_DOS_SIGNATURE) { // comprovamos el e_magic para saber si es un EXE printf("No es un archivo EXE\n"); return 1; } fseek(archivo ,idh. e_lfanew + 4,SEEK_SET ); fread(&ifh ,0x14,1,archivo ); // rellenamos IMAGE_FILE_HEADER fseek(archivo , idh. e_lfanew + 4 + sizeof(ifh ), SEEK_SET ); fread(&ioh ,ifh. SizeOfOptionalHeader,1,archivo ); // Leemos IMAGE_OPTIONAL_HEADER for (int i=0;i<ifh.NumberOfSections;i++) { fread(&ish , sizeof(ish ),1,archivo ); printf("%x\n",ish. Misc. PhysicalAddress); } return 0; }
saludos.
|
|
|
1007
|
Seguridad Informática / Análisis y Diseño de Malware / [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
|
en: 2 Septiembre 2011, 13:38 pm
|
Buenas, bueno al fin he decidido meterme de lleno a aprender el formato PE y tenia pensado agrandar la sección de código par aintroducir un pequeño opcode con un msgbox y tal una chorradilla pero para ensayar no me parece mal . El problema viene cuando no puedo detectar el ISH bien de todas las secciones, solo lo detecta bien de la primera, el código que he creado es este: #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { IMAGE_DOS_HEADER idh; IMAGE_FILE_HEADER ifh; IMAGE_OPTIONAL_HEADER ioh; IMAGE_SECTION_HEADER ish; char ruta[] = "C:\\MS-DOC.exe"; FILE * archivo = fopen(ruta ,"r+b"); if (archivo == NULL) { // si no podemos abrri el archivo. printf("Error al abrir el archivo\n"); return 1; } fread(&idh ,0x40,1,archivo ); // rellenamos IMAGE_DOS_HEADER if (idh.e_magic != IMAGE_DOS_SIGNATURE) { // comprovamos el e_magic para saber si es un EXE printf("No es un archivo EXE\n"); return 1; } fseek(archivo ,idh. e_lfanew + 4,SEEK_SET ); fread(&ifh ,0x14,1,archivo ); // rellenamos IMAGE_FILE_HEADER fseek(archivo , idh. e_lfanew + 4 + sizeof(ifh ), SEEK_SET ); fread(&ioh ,ifh. SizeOfOptionalHeader,1,archivo ); // Leemos IMAGE_OPTIONAL_HEADER int suma = 0; for (int i=0;i<ifh.NumberOfSections;i++) { fseek(archivo , idh. e_lfanew + 4 + sizeof(ifh ) + ifh. SizeOfOptionalHeader + (sizeof(ish )*(ifh. NumberOfSections-1)) + suma ,SEEK_SET ); fread(&ish , sizeof(ish ),1,archivo ); // rellenamos IMAGE_SECTION_HEADER printf("%x\n",(&ish )[i ]. Misc. PhysicalAddress); suma += 0x28; // sumo 0x28 que es lo que ocupa ish para pasar a los datos de la siguiente sección. } return 0; }
Nose que andará mal por ahi si me peuden hechar una mano sería de gran ayuda un saludo.
|
|
|
1009
|
Programación / ASM / Re: duda con parametros sin definir y saber su direccion
|
en: 1 Septiembre 2011, 03:37 am
|
Hasta donde se, en ASM los params se PUSHean al reves de como los declaras. int AgregarRegistro(int param1, int param2) { void* ptrreg; void* ptrreg2; __asm eax, dword ptr [esp+4] //recupera param2 __asm mov ptrreg, eax __asm eax, dword ptr [esp+8] //recupera param1 __asm mov ptrreg2, eax }
Si no es asi, debe ser al reves... Saludos! no sería asi exactamente, fijate: include 'win32ax.inc' .data cadena1 db 'primero',0 cadena2 db 'segundo',0 .code start: push cadena2 push cadena1 call Msgbox invoke MessageBoxA,0,"Sali del proceso",0,0 ret Msgbox: pop eax ; dirección de retorno pop ecx ;primer parametro pop edx ;segundo parametro push eax invoke MessageBoxA,0,edx,ecx,0 pop eax jmp eax ; retornamos .end start
Aunque con las macros de las funciones y tal creo qeu variaria un poco. saludos.
|
|
|
1010
|
Programación / ASM / Re: Salto de línea (fasm16) y algo mas je
|
en: 23 Agosto 2011, 13:40 pm
|
org 100h MOV AH,9 MOV DX,Texto INT 21h ;Muestro "Hola mundo!" MOV AH,1 ;Espero el ingreso de una tecla INT 21H INT 20h Texto db 'Hola mundo!',10,13,'Presione una tecla para continuar.',24h
|
|
|
|
|
|
|