Pruébalo, siempre puedes utilizar una máquina virtual y miras a ver sí hace correctamente lo que envías
Saludos
Saludos
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: ivancea96 en 30 Junio 2014, 23:51 PM
¿El char cadena[4000] y el FILE *fichero los colocaste en el segundo código?
PIMAGE_DOS_HEADER DOS_Header;
char Fichero[] = "Test.exe";
HANDLE hFile = CreateFile((LPCTSTR)Fichero,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
printf("No se puede abrir el fichero: %s Error: %lu\n", Fichero, GetLastError());
return EXIT_FAILURE;
}
HANDLE FMapped = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0);
if(FMapped == INVALID_HANDLE_VALUE)
{
printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
CloseHandle(hFile);
return EXIT_FAILURE;
}
BYTE *FileMapped = (BYTE*)MapViewOfFile(FMapped, FILE_MAP_READ, 0, 0, 0);
if(FileMapped == NULL)
{
printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
CloseHandle(FMapped);
CloseHandle(hFile);
return EXIT_FAILURE;
}
DOS_Header = (PIMAGE_DOS_HEADER)&FileMapped[0];
// ....
Cita de: daryo en 1 Julio 2014, 01:11 AM
no se mucho del formato pe , pero te recomiendo que no uses fopen sino la api de windows createfile y readfile y writefile
Cita de: x64Core en 1 Julio 2014, 08:09 AMCitarSe supone que eso son instrucciones en ASM?
Saludos
Sí
// ....
IMAGE_DOS_HEADER DOS_Header;
IMAGE_NT_HEADERS NT_Header;
IMAGE_SECTION_HEADER *SECTION_Header;
FILE *Archivo = fopen("Test.exe", "rb");
if(Archivo)
{
CopyFile("Test.exe", "Backup.exe", TRUE);
printf("Basic File Information\n\n");
printf("File Name: Test.exe\n");
/* Obtenemos el tamaño del fichero */
fseek(Archivo,0, SEEK_END);
unsigned long Tamanyo = ftell(Archivo);
fseek(Archivo,0, SEEK_SET);
printf("File Size: %lu (%lx)", Tamanyo, Tamanyo);
/* Obtenemos la estructura DOS_HEADER */
fread(&DOS_Header, sizeof(IMAGE_DOS_HEADER), 1, Archivo);
/* Saltamos hasta la posicion donde empieza NT_HEADER, esa posicion se almacena en e_lfanew */
fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
fread(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
NT_Header.FileHeader.NumberOfSections += 1;
//NT_Header.OptionalHeader.SizeOfImage +=;
/* Reservamos memoria para las secciones */
SECTION_Header = (IMAGE_SECTION_HEADER*)malloc(NT_Header.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
/* Guardamos las secciones */
for(unsigned int i=0;i<NT_Header.FileHeader.NumberOfSections-1;i++)
{
fread(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
}
// ....
free(SECTION_Header);
// ....
// ....
IMAGE_DOS_HEADER DOS_Header;
IMAGE_NT_HEADERS NT_Header;
IMAGE_SECTION_HEADER *SECTION_Header;
FILE *Archivo = fopen("Test.exe", "rb+");
if(Archivo)
{
CopyFile("Test.exe", "Backup.exe", TRUE);
/* Obtenemos el tamaño del fichero */
fseek(Archivo,0, SEEK_END);
unsigned long Tamanyo = ftell(Archivo);
fseek(Archivo,0, SEEK_SET);
/* Obtenemos la estructura DOS_HEADER */
fread(&DOS_Header, sizeof(IMAGE_DOS_HEADER), 1, Archivo);
/* Saltamos hasta la posicion donde empieza NT_HEADER, esa posicion se almacena en e_lfanew */
fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
fread(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
NT_Header.FileHeader.NumberOfSections += 1;
/* Reservamos memoria para las secciones (+1 para la nueva sección)*/
SECTION_Header = (IMAGE_SECTION_HEADER*)malloc((NT_Header.FileHeader.NumberOfSections)*sizeof(IMAGE_SECTION_HEADER));
/* Guardamos las secciones */
for(int i=0;i<NT_Header.FileHeader.NumberOfSections-1;i++)
{
fread(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
}
DWORD Tamanyo_RawData = 0x10;
DWORD VirtualAddressEnd = SECTION_Header[NT_Header.FileHeader.NumberOfSections-2].VirtualAddress;
/* Escribimos los datos de la nueva sección */
BYTE NombreSeccion[8] = ".mecra";
memcpy(SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Name, NombreSeccion, 8);
SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].SizeOfRawData = Tamanyo_RawData;
SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].PointerToRawData = Tamanyo;
SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Characteristics = 0xE0000020;
SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].VirtualAddress = VirtualAddressEnd+NT_Header.OptionalHeader.SectionAlignment;
SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Misc.VirtualSize = Tamanyo_RawData;
/* Incrementamos el SizeOfImage */
NT_Header.OptionalHeader.SizeOfImage += Tamanyo_RawData;
/* Escribimos los datos en el archivo */
//Nos situamos al inicio de la NT Header
fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
//Escribimos la cabecera
fwrite(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
//Saltamos al Section Header
fseek(Archivo, DOS_Header.e_lfanew + sizeof(IMAGE_NT_HEADERS), SEEK_SET);
//Escribimos los datos y la cagamos porque nos cargamos lo que sigue al insertar la sección asi ^^
for(int i=0;i<NT_Header.FileHeader.NumberOfSections;i++)
{
fwrite(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
}
// ....
free(SECTION_Header);
// ....
Citar
PIMAGE_DOS_HEADER;
PIMAGE_NT_HEADERS;
PIMAGE_SECTION_HEADER;
Citar
IMAGE_DOS_HEADER;
IMAGE_NT_HEADERS;
IMAGE_SECTION_HEADER;
//Rutina encargada de descifrar la sección cifrada
char uncryptroutine[] = //21 bytes
"\xB8\x00\x10\x40\x00" //B8 00104000 MOV EAX, 401000 Section Start ||Este valor será modificado
"\x80\x30\xBB" //8030 BB XOR BYTE[EAX], BB Key
"\x40" //40 INC EAX
"\x3D\x00\x45\x40\x00" //3D 00454000 CMP EAX, 404500 Section End ||Este valor será modificado
"\x75\xF5" //75 F5 JNZ SHORT -11 (Complemento a dos de 11 = F5)
"\xB8\x00\x20\x40\x00" //B8 00204000 MOV EAX, 402000 Pone en EAX el OEP || Este valor será modificado
"\xFF\xE0"; //FFE0 JMP EAX Salta al OEP
Cita de: Risketo en 25 Junio 2014, 21:54 PM
#include <stdio.h>
int main(void) {
int poderes[100];
int usados[100];
int i,poderElegido,x;
for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
poderes[i] = i;
for(i=0;i<100;i++) //lleno el array de usados de '-1'
usados[i] = -1;
i = 0;
while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
printf("Elige un poder: ");
scanf("%d",&poderElegido);
for(x=0;x<100;x++) {
if(usados[x] == poderElegido) {
printf("Ya has elegido este poder");
i = 5; //salimos del bucle si ya hemos usado ese poder
}
}
usados[i] = poderElegido;
i++;
}
return 0;
}
#include <stdio.h>
int main()
{
int usados[100] = {0};
int i=0, poderElegido=0;
while(i<5)
{
//Pido un poder y lo voy guardando en el array 'usados'
printf("Elige un poder: ");
scanf("%d",&poderElegido);
if(poderElegido>=0 && poderElegido<100)
{
if(usados[poderElegido] != 0)
{
printf("Ya has elegido este poder");
i = 5; //salimos del bucle si ya hemos usado ese poder
}
else
{
usados[poderElegido] = 1;
}
i++;
}
else
{
printf("Poder invalido\n");
}
}
return 0;
}
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Cita de: gibranini en 21 Junio 2014, 05:54 AM
Hola alguien me puede explicar como instalar esta librería SFML en CodeBlocks porvafor amigos