|
171
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 17 Octubre 2014, 00:26 am
|
¿Donde se supone que estas cambiando el entry point en ese codigo exactamente? ¿O es un efecto no deseado? Es un defecto no deseado Así como esta no le cambio el EP, se cambia solo.. ¿No sera que Start deberia usar VirtualAddress en realidad?: Start = lpFileMap + ISH->PointerToRawData; Ya probé hasta con la dirección psíquica! Mmm 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!
|
|
|
172
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 16 Octubre 2014, 23:48 pm
|
Bueno.. como no funciona y ya no entiendo que pasa, hice un codigo ejemplo.. Alguien se anima a probar este codigo? 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... Crypt("nc.exe", ".text");
Gracias! Saludos!
|
|
|
173
|
Informática / Hardware / Re: Es posible ver o extraer firmware de un pendrive?
|
en: 14 Octubre 2014, 22:01 pm
|
pff.. llevo medio dia y no doy con la solucion.. igual creo que mi pendrive no es el mejor para esto.. Les cuento los pasos que llevo echos: 1- Identificar el VID & PID del pendrive, programas: ChekUDisk_v5.0 de WuBoJian y ChipGenius de MyDigit.cn 2 - Buscar en la pagina http://flashboot.ru/ la herramienta correcta en base a ese VID & PID 3 - No encontrar una utilidad para flashear mi pendrive, aunque en realidad yo solo quiero ver el firmware (por ahora), y probe con todas.. Rando, vi el video si.. ahora estoy bajando flashtool a ver que panza.. Saludos! PD: El pendrive es Kingston DT Micro VID: 0951 & PID: 168A, por las dudas, quizas en otro pais salen otras busquedas EDIT: Las opciones de flashtools son limitadas a celulares, no reconoce unidades
|
|
|
175
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 10 Octubre 2014, 01:38 am
|
Huu.. si.. cualquiera.. Con Olly que es la única herramienta que tengo ahora a mano me dice esto como EntryPoint ASCII = rC HEX = 09 72 43 Ahora si que me descoloco, pero es una buena pista.. en casa lo tendré que ver con DUMPBIN y WinDbg Que raro.. en un ejecutable simple, con 3 secciones funciona.. Bue, reviso y posteo.. Gracias Genio! Actualizo:Bueno.. creo haber encontrado algo.. pero por que lo hace?? Netcat antes de cifrar (dumpbin /HEADERS):Name: .text VirtualSize: 5234 VirtualAddress: 1000 SizeOfRawData: 5400 FilePointerToRawData: 400 SizeOfCode: 5400 RVA EntryPoint: 1160 Summary: 6000 Netcat después de cifrar (dumpbin /HEADERS):Name: .text VirtualSize: 5240 (Aumento para alinear el code) VirtualAddress: 1000 SizeOfRawData: 5400 FilePointerToRawData: 400 SizeOfCode: 5400 RVA EntryPoint: 1010 (Empiezo donde necesito empezar, pero no funca) Netcat antes de cifrar (WinDbg !dh):.text AddressOfEntryPoint: 1160 BaseOfCode: 1000 Align 16 Netcat después de cifrar (WinDbg !dh):.text AddressOfEntryPoint: 1160 BaseOfCode: 1000 Align (no align specified) --> Bueno.. ahí esta.. Ese align debe estar *!&*"·$ el formato.. Perché ? Gracias!! Saludos!
|
|
|
176
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 10 Octubre 2014, 00:25 am
|
¿Que se supone que haces con esto al final? ¿Escribir un nuevo ejecutable cifrado en disco? Upss.. perdón,, pensé que había dicho al principio.. Es un crypter, no creo un nuevo archivo no Trabajo sobre la imagen del mismo PE, la abro con CreateFile,, uso CreateFileMapping y cierro la imagen... Capaz que la *** ahí?! Saludos!
|
|
|
178
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 9 Octubre 2014, 22:14 pm
|
Bueno.. no di con la solucion.. algo me esta faltando,, pongo el code a ver si alguien ve algo malo.. if(strcmp((char *)ISH->Name, ".text") == 0) { // Se agranda la sección para ocupar hasta un bloque de 16 justo while(ISH->Misc.VirtualSize%16 != 0) ISH->Misc.VirtualSize++; // Funcion "Cifradora", se cifra la sección .text Cifra((DWORD)(lpFileMap + ISH->PointerToRawData), ISH->Misc.VirtualSize); // Una copia de la sección .text cifrada (+ align 16) char *lptextsect = new char[ISH->Misc.VirtualSize]; memset(lptextsect, 0, ISH->Misc.VirtualSize); memcpy(lptextsect, (void *)(DWORD)(lpFileMap + ISH->PointerToRawData), ISH->Misc.VirtualSize); // Se guarda el punto de inicio ** push Entrypoint ** ASize = IOH->ImageBase + IOH->AddressOfEntryPoint; __asm { mov eax, ASize } __asm { mov dword ptr[opcodes + 11h], eax } // VirtualSize a EAX y se ajustan los jmps, calls y cmp // **************************************************** ASize = ISH->Misc.VirtualSize; __asm { mov eax, ASize } __asm { mov dword ptr[opcodes + 44h], eax } // -> call endopcodes __asm { mov dword ptr[endopcodes + 5], eax } // -> RETADDR, ???? (Size To Decrypt) __asm { neg eax } __asm { mov dword ptr[opcodes + 38h], eax } // -> cmp ebx, -???? ASize = sizeof(opcodes)-8; __asm { sub eax, ASize } __asm { mov dword ptr[endopcodes + 0Ch], eax } // -> jmp -???? // **************************************************** // Se Copia todo al PE! DWORD StartOffset = (DWORD)lpFileMap + ISH->PointerToRawData; memcpy((void *)(StartOffset), (void *)opcodes, sizeof(opcodes)); memcpy((void *)(StartOffset + sizeof(opcodes)-1), (void *)(lptextsect), ISH->Misc.VirtualSize); memcpy((void *)(StartOffset + ISH->Misc.VirtualSize + sizeof(opcodes)-1), (void *)endopcodes, sizeof(endopcodes)); // *************************************************************** // Se ajusta la sección ISH->Characteristics = 0xE0000020; // Lectura, Ejecucion y escritura! IOH->AddressOfEntryPoint = (DWORD)IOH->BaseOfCode + 16; // Empezar despues de la clave de 16 digitos }
Bueno, la idea es ir recorriendo las secciones (Funciona), e ir buscando la sección ".text", una vez encontrada, cifrarla y ponerle su respectiva función descifradora (opcodes y endopcodes) Desde la linea 15 a la 35 lo que hago es ajustar esos "opcodes", (que funciona tambien).. El Problema: Si el EntryPoint es 00401000 lo cambio por 00401010 y todo bien! Si el EntryPoint es otro cualquiera, no lo puedo modificar a 00401010! Queda el que tenia antes, y lo raro, el olly me indica con rojo la direccion 00401010 pero igual inicia en donde era el EntryPoint.. Gracias por su tiempo! Saludos!
|
|
|
179
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 7 Octubre 2014, 23:31 pm
|
Bueno, después de darle vueltas al asunto me parece que lo mejor va a ser modificar "la lógica" del mismo... El problema radica en que yo al principio de la sección .text pongo X código, al final pongo otro Z código.. mi intención era ejecutar código X y Z primero, para luego saltar al código del ejecutable.. Bueno, si EntryPoint de ejecutable es 0040100 me "pisa" el código X, y si EntryPoint es distinto pasa otra cosa... Voy a hacer unas pruebas, si todo sale bien pongo el resultado, sino pregunto No se muy bien que estas tratando de hacer, te recomiendo usar el WinDbg (!dh direccion te ayudara) para ir depurando tu codigo. Gracias EI, me sirvió para razonar otras posibles situaciones.. Saludos!
|
|
|
180
|
Programación / Programación C/C++ / Re: Problema al modificar sección .text
|
en: 7 Octubre 2014, 21:06 pm
|
Hi! Gracias por responder EI! AddressOfEntryPoint A pointer to the entry point function, relative to the image base address. For executable files, this is the starting address.
BaseOfCode A pointer to the beginning of the code section, relative to the image base. Con que ahí esta el asunto.. pero cambie el que cambie, no queda en la dirección que quiero.. ¿Estas escribiendo en disco o en memoria? En memoria.. tengo una imagen sacada con CreateFileMapping y MapViewOfFile.. Puntualmente entonces lo que necesitaría es que el entrypoint sea siempre desde baseofcode + 16, siendo (generalmente) 0040100.. pero baseofcode puede cambiar, no puedo poner eso como una constante Y no me funciono.. Gracias! Saludos!
|
|
|
|
|
|
|