Autor
|
Tema: Funcion WriteFile (ASM) (Leído 19,043 veces)
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
Hola que tal???
estoi investigando sobre las funciones CreateFile y WriteFile,necesito saver 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
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
. 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 . Saludos
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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
|
|
|
En línea
|
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
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: 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
|
|
« Última modificación: 6 Enero 2010, 13:49 pm por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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
|
|
|
En línea
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.082
CALL DWORD PTR DS:[0]
|
Yo uso FASM, por lo que no hablo a ciencia cierta, pero creo que: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':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 .
Edito: Además en el segundo code pusiste: invoke ReadFile,eax,addr lpBuffer,eax,addr dwBytes,0
en vez de: invoke ReadFile,ebx,addr lpBuffer,eax,addr dwBytes,0
Edito2: Corregí algunos errores que tenía mi code . Saludos
|
|
« Última modificación: 4 Enero 2010, 00:11 am por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza. Nietzsche
|
|
|
|
|