Funcion WriteFile (ASM)

Iniciado por Riki_89D, 3 Enero 2010, 18:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Riki_89D

Hola que tal???


estoi investigando sobre las funciones CreateFile y WriteFile,necesito saber como puedo escribir (mejor dicho substituir) la variable de un exe desde otro exe con Write File?? el valor de esa variable,no encontre nad por ai solo enseñan como funciona esa funcion pero no como para modificar la variable de un exe (un exe que seria echo pro mi en MASM tmb)



salu2

[Zero]

 :rolleyes:. 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.

No entiendo del todo que es lo que quieres hacer  :P.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Riki_89D

Perdona por no explicarme,

imaginate yo tengo esta "variable" definida:


Mensaje db 'Hola',0


pues desde otro exe quiero modificar ese mmm Bit xd o llamamosle variable,me podrias enseñar un pequeño ejemplo de como jhacerlo es que me vuelvo loco buscando i no encontre nada :(

YST

Lo ves con un editor hexadecimal sacas la posicion y escribes en esa :P


Yo le enseñe a Kayser a usar objetos en ASM

Riki_89D

Hola YESET


Quieres decir que con un editor Hexa puedo ver la posicion de memoria en donde esta la AVriable?? eso kieres decir?? i despues escribo en esa posicion cno Write File te refeires a eso???


perdonad mi ignoracnia

[Zero]

#5
A ver, lo primero sería abrir el ejecutable con un editor hexadecimal, como dice YST y ver donde empieza la cadena "Hola", una vez tengas la dirección, pongamos que por ejemplo es 0x220 sería algo como:

Código (asm) [Seleccionar]
lpBuffer dd ?
dwBytes dd ?

invoke CreateFileA,"C:\ElFichero.exe",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
invoke GlobalAlloc,GPTR,eax
mov [lpBuffer],eax
pop ecx
pop ebx
push ebx
push ecx
invoke ReadFile,ebx,[lpBuffer],ecx,addr dwBytes,0
mov eax,[lpBuffer]
mov dword ptr ds:[eax+0x220],"Bye" ;Si fueran más de 4 bytes tendrías que usar mCopyMemory, pero siempre sin superar el tamaño de la cadena original
pop ecx ;ecx=Tamaño archivo
pop ebx ;ebx=Handle Archivo
push ebx
;Tal vez necesites llamar a SetFilePointer antes de escribir
invoke WriteFile,ebx,[lpBuffer],ecx,addr dwBytes,0
pop ebx
invoke CloseHandle,ebx


Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

YST

Puedes ver la posicion en disco .

Sabes si quiera para que es la api WriteFile y si lo sabes explicalo a ver si tu concepto es correcto :P


Yo le enseñe a Kayser a usar objetos en ASM

Riki_89D

Hola gracias pro el code tengo estto:

.386
.model flat,stdcall
.stack 100h
option casemap:none
include Tot.inc

.data

Fil db 'C:\A.exe',0

.data?

lpBuffer dd ?
dwBytes dd ?


.code
start:

invoke CreateFileA,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
invoke ReadFile,ebx,addr lpBuffer,eax,addr dwBytes,0
mov eax,lpBuffer
mov dword ptr ds:[eax+0x220],"Bye"
pop ecx ;ecx=Tamaño archivo
pop ebx ;ebx=Handle Archivo
push ebx
invoke WriteFile,ebx,addr lpBuffer,ecx,addr dwBytes,0
pop ebx
invoke CloseHandle,ebx

invoke ExitProcess,0

end start


Eveidentemente con la direccion de memoria correspondiente i no esa,me sale un unico error,en la linea 28 en donde "mov dword ptr ds:[eax+0x220],"Bye" "

me dice esto:  missing operator in expression


Riki_89D

Finalmente resolvi el error pero no se modifica el otor archivoo :S:S



este es el code ahroaa

.386
.model flat,stdcall
.stack 100h
option casemap:none
include Tot.inc

.data

Fil db 'A.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
invoke ReadFile,eax,addr lpBuffer,eax,addr dwBytes,0
mov eax,lpBuffer
mov dword ptr ds:[eax+800h],"Bye"
pop ecx ;ecx=Tamaño archivo
pop ebx ;ebx=Handle Archivo
push ebx
invoke WriteFile,ebx,addr lpBuffer,ecx,addr dwBytes,0
pop ebx
invoke CloseHandle,ebx

invoke ExitProcess,0

end start


solo cambia la parte esta:


mov dword ptr ds:[eax+800h],"Bye"


si lo pongo asin no me da eeror pero el archivo A.exe no es modificado :(


[Zero]

#9
Yo uso FASM, por lo que no hablo a ciencia cierta, pero creo que:
Código (asm) [Seleccionar]

invoke CreateFile,offset Fil,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0


Esa lína está mal, Fil ya es un puntero, no es necesario el 'offset':
Código (asm) [Seleccionar]

invoke CreateFile,Fil,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0


Me equivoqué, está bien tal como o pusiste, parece que FASM y MASM tratan a los punteros de formas opuestas sintácticamente  :xD.



Edito:

Además en el segundo code pusiste:
Código (asm) [Seleccionar]

invoke ReadFile,eax,addr lpBuffer,eax,addr dwBytes,0


en vez de:
Código (asm) [Seleccionar]

invoke ReadFile,ebx,addr lpBuffer,eax,addr dwBytes,0




Edito2: Corregí algunos errores que tenía mi code  :P.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche