Lo que tienes que hacer es cuando se pulse la tecla "´" ver si despues se pulsa una vocal, si se pulsa una vocal habrá querido escribir una tilde.
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: do-while en 26 Octubre 2011, 20:32 PM
¡Buenas!
Si os interesa el tema, he aqui un documental que me parecio bastante interesante:La paradoja de Hawking
No se de que año es, ahora lo miro, pero no creo que sea demasiado antiguo.
¡Saludos!
Por lo que acabo de leer, en 2004 fue cuando dijo que podria estar equibocado con la paradoja de la informacion, por lo que creo que el documental pudo haber sido hecho hacia el 2005.
¡Saludos de nuevo!
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DWORD align(DWORD number, DWORD alignment)
{
if(number % alignment == 0)
return number;
else
return (number / alignment) * alignment + alignment;
}
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
long TamanoSecciones = 0;
int i;
FILE * archivo = fopen("c:\\Mad.exe","r+b");
if (archivo == NULL)
{
printf("Error al leer el archivo\n");
system("PAUSE");
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);
for (i=0;i<=nth.FileHeader.NumberOfSections-1;i++)
{
printf("%i\n",sección[i].SizeOfRawData);
TamanoSecciones += sección[i].SizeOfRawData;
}
printf("%i\n",TamanoSecciones);
char * dSecciones = (char*)malloc(TamanoSecciones);
fread(dSecciones,TamanoSecciones,1,archivo); //leo todos los datos de las secciones.
fclose(archivo); // terminamos de leer
strcpy((char*)nSeccion.Name,".fary"); // nombre de la nueva sección: .fary
nSeccion.VirtualAddress = align(sección[nth.FileHeader.NumberOfSections-1].VirtualAddress + sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize, nth.OptionalHeader.SectionAlignment);
nSeccion.SizeOfRawData = align(0x50, nth.OptionalHeader.FileAlignment);
nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + sección[nth.FileHeader.NumberOfSections-1].SizeOfRawData;//align(0x50,nth.OptionalHeader.FileAlignment);
nSeccion.Characteristics = 0x60000020;
nSeccion.Misc.VirtualSize = 0x50;
nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección
nth.OptionalHeader.SizeOfImage = align(0x50+nSeccion.VirtualAddress,nth.OptionalHeader.SectionAlignment);
nth.OptionalHeader.SizeOfHeaders += 0x28;
FILE * nuevo = fopen("Nuevo.exe","wb+");
fwrite(&dh,sizeof(dh),1,nuevo);
fwrite(stub_dos,dh.e_lfanew-0x40,1,nuevo);
fwrite(&nth,sizeof(nth),1,nuevo);
nth.FileHeader.NumberOfSections -= 1;
fwrite(sección,sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections,1,nuevo);
fwrite(&nSeccion,sizeof(IMAGE_SECTION_HEADER),1,nuevo);
fwrite(dSecciones,TamanoSecciones,1,nuevo);
if (fseek(nuevo,0,SEEK_END) != 0)
{
printf("error\n");
}
char DatosSeccion[] = "Hola yo soy la sección de prueba, y ocupo exactamente la cantidad de 0x50 bytes.";
fwrite(DatosSeccion,0x50,1,nuevo);
fclose(nuevo);
system("PAUSE");
return 0;
}
;///////////////////////////////////////////////////////////////////////////////
;//// Ret Exe Corruption: corrompe los exe poniendo un 0xC3 (ret) en el ////
;//// entry point. Este código no funciona con algunos ejecutables para ////
;//// ello habría que hacer algunos modificaciones. ////
;//// Programado por Drinky94 a 13 - Septiembre - 2011 ////
;///////////////////////////////////////////////////////////////////////////////
include 'win32ax.inc'
.data
manija dd ?
larchivo dd ?
espacio dd ?
bleidos dd ?
PE dd ? ; puntero a NT
EP dd ? ; EntryPoint
wb dd ?
.code
start:
invoke CreateFileA,'g:\bowser.exe', GENERIC_READ, FILE_SHARE_READ, 0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
mov [manija],eax
invoke GetFileSize,[manija],0
mov [larchivo],eax
invoke GlobalAlloc,GPTR,[larchivo]
mov [espacio],eax
invoke ReadFile,[manija],[espacio],[larchivo],addr bleidos,0
invoke CloseHandle,[manija]
leave
mov eax,[espacio]
cmp word[eax],'MZ'
jne salir
mov ecx,eax
add eax,dword[eax+0x3C] ; EAX = PE
mov [PE],eax
cmp word[eax],'PE'
jne salir
add eax,0x28
mov ebx,dword[eax]
mov [EP],ebx ;EP = EntryPoint
mov ebx,ecx ; EAX = puntero inicio
add ecx,[EP]
mov word[ecx],0xC3
;// Aquí tendríamos que eliminar el viejo archivo y generar nuestro Exe modificado con el mismo nombre.
invoke CreateFile,"g:\NuevoRET.exe",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0
push eax
invoke WriteFile,eax,ebx,[larchivo],wb,NULL
pop eax
invoke CloseHandle,eax
invoke MessageBoxA,0,"FIN",0,0
salir:
leave
ret
.end start