Cita de: R.N.A. en 4 Enero 2010, 18:34 PMCódigo (asm) [Seleccionar].386
.model flat,stdcall
.stack 100h
option casemap:none
include Tot.inc
.data
Fil db 'men.exe',0
.data?
lpBuffer dd ?
dwBytes dd ?
.code
start:
invoke CreateFile,offset Fil,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
push eax
invoke GetFileSize,eax,0
pop ebx ;ebx=Handle Archivo
push ebx
push eax
mov edx, eax
invoke GlobalAlloc,GPTR,eax
invoke ReadFile,ebx,eax,edx,addr dwBytes,0
mov dword ptr ds:[eax+2048h],"Bye"
pop ecx ;ecx=Tamaño archivo
pop ebx ;ebx=Handle Archivo
push ebx
invoke WriteFile,ebx,eax,ecx,addr dwBytes,0
pop ebx
invoke CloseHandle,ebx
invoke ExitProcess,0
end start
Ese codigo deberia de funcionar...
Tiene un error ese código:
Código (asm) [Seleccionar]
invoke GlobalAlloc,GPTR,eax
invoke ReadFile,ebx,eax,edx,addr dwBytes,0
mov dword ptr ds:[eax+2048h],"Bye"
Al llamar a ReadFile, el valor de eax se sobreescribe con el retorno de esa API. Prueba así:
Código (asm) [Seleccionar]
invoke GlobalAlloc,GPTR,eax
push eax
invoke ReadFile,ebx,eax,edx,addr dwBytes,0
pop eax
mov dword ptr ds:[eax+2048h],"Bye"
Saludos
.
.
. Que tipo de variable? Una cadena de caracteres? Supongo que será una que se guarde en el archivo en disco. Debes estudiarte bien el Formato PE para hacer esas cosas, si es para una cosa puntual puedes simplemente hardcodear la direccion y lo sobreescribes, primero llamas a CreateFile, luego a ReadFile, y cuando tengas el archivo en memoria te desplazas a donde está la variable que quieres cambiar, la cambias y luego guardas los cambios con WriteFile.