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
: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
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 :(
Lo ves con un editor hexadecimal sacas la posicion y escribes en esa :P
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
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
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
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
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 :(
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 :xD.
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 :P.
Saludos
Hola gracias pro contestar,algfinal el code queda asin:
.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
invoke ReadFile,ebx,addr lpBuffer,eax,addr dwBytes,0
mov eax,lpBuffer
mov dword ptr ds:[eax+2048h],"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
no me da eeror al ensamblarlo peor cuando lo ejecuto me sale un eeror de windows de esos que dice Windows detecto un problema i debe cerrarse,por lo que no me modifica aun el ejecutable men.exe ppffff esto parece imposible,no pensava k fuera tan dificil,alomeujor no uso bien el editor Hexa para ver el offset donde esta la cadena que quiero modificar,uso el WinHex,con el abro el ejecutable men.exe,busco la cadena que quiero modificar i al lado me sale el offset: 0002048
que puedo hacer???
gracias de antemano
Cita de: Riki_89D en 4 Enero 2010, 13:46 PM
Hola gracias pro contestar,algfinal el code queda asin:
.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
invoke ReadFile,ebx,addr lpBuffer,eax,addr dwBytes,0
mov eax,lpBuffer
mov dword ptr ds:[eax+2048h],"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
no me da eeror al ensamblarlo peor cuando lo ejecuto me sale un eeror de windows de esos que dice Windows detecto un problema i debe cerrarse,por lo que no me modifica aun el ejecutable men.exe ppffff esto parece imposible,no pensava k fuera tan dificil,alomeujor no uso bien el editor Hexa para ver el offset donde esta la cadena que quiero modificar,uso el WinHex,con el abro el ejecutable men.exe,busco la cadena que quiero modificar i al lado me sale el offset: 0002048
que puedo hacer???
gracias de antemano
Tienes varios errores:
1) La variable lpBuffer es muy pequeña
lpBuffer dd ?
si quieres usar la variable buffer de tan solo 4bytes deberias en ella almacenar un puntero a una direccion de memoria reservada para datos creada con GlobalAlloc, pasando como parametro el tamaño que obtienes con GetFileSize. asi no deberia de dar problemas.
2) Tratas de escribir el una direccion de memoria que seguramente no tienes permisos.
mov eax,lpBuffer
mov dword ptr ds:[eax+2048h],"Bye"
Como te dije lpBuffer solo tiene 4 bytes... cuando dices que quieres escribir "Bye" en la direccion que esta a 2048h bytes de distancia no sabes en que direccion estas tratando de escribir. no se si me doy a entender. si la variable lpBuffer tuviera como minimo ese desplazamiento que propones mas 4 bytes seria posible, de lo contrario no.
Hola R.N.A,gracias por tu respuesta
y si que te explikas bn,soy yo k no me enterono entendi mucho lo que dijiste,ya me save mal i todo preguntaros tanto pero es que me urge lograr eso,podrias poner el codigo tal i como seria para que funcionara???
es k yo no entendi mucho lo que debo hacer segun tu :S:S:S:S
me arias un grandisimo favor!!
salu2 amigo!
.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...
Ensamblar me lo ensambla i obtengo el EXE,peor me sale el maldito error: pro.exe ha detectado un problema y debe cerrarse,por que pasa eso?
puede ser eso que decias de los permisos??
como puedo solucionar eso si es el caso??
gracias por el code ;) ere sun crack!
Cita de: Riki_89D en 4 Enero 2010, 18:40 PM
Ensamblar me lo ensambla i obtengo el EXE,peor me sale el maldito error: pro.exe ha detectado un problema y debe cerrarse,por que pasa eso?
puede ser eso que decias de los permisos??
como puedo solucionar eso si es el caso??
gracias por el code ;) ere sun crack!
Verifica el tamaño del archivo... creo que el problema aun reside en que estas excediendo el lugar donde puedes escribir.
Si tienes un Debugger ejecuta el programa instruccion por instruccion y dinos en que lugar falla
El tamaño del programa que modifica el otro exe es de 2,50 kb (2.560 bytes)
i el del ejeutable que sesupone sera modificado es del mimso tamaño :S
i lo del debugger lo probare aver,puede ser eso del tamaño???
Cita de: R.N.A. en 4 Enero 2010, 18:34 PM
.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:
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í:
invoke GlobalAlloc,GPTR,eax
push eax
invoke ReadFile,ebx,eax,edx,addr dwBytes,0
pop eax
mov dword ptr ds:[eax+2048h],"Bye"
Saludos
Hola hacker_Zero acao de probar tu code i ensambla bien pero cuanod ejectuo aun me aparece el Hijo**** del error,el de que se encontro un eeror i debe cerrarse :(
me estoi cacho desanimado :(
es impobile!!!!
:(
poniendo el siguiente code:
.386
.model flat,stdcall
.stack 100h
option casemap:none
include Tot.inc
.data
Fil db 'C:\masm32\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
push eax
invoke ReadFile,ebx,eax,edx,addr dwBytes,0
pop eax
mov dword ptr ds:[eax+800h],"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
aveces me da error aveces no,i una vez me a modificado el otro exe,pero cuando e ejecutado el otro exe se abria unaventana ms-dos i me decia porgrama demasiado extenso para colocarlo en meoria :S
quita la parte que dice .stack 100h y prueba a ver... pasaste el debugger?
Mejor que nada por que no debuggear como dice RNA ?
Te digo por experiencia si no quieres demorarte 3 años en encontrar cada error tienes que debuggear :P
Pues nada quitando el Stack no funciono comop puedo debuggeear,el MASM32 lleva algo para hacerlo??
nunca lo hice,salu2
OllyDbg... existen muchos manuales en la zona de ingenieria inversa.
GlobalAlloc te modifica edx. no estaria de mas que verificaras que el resultado de las funciones son los esperados y no tendrias estos problemas.
yo usaria createfile,createfilemapping,mapviewoffile y con rep mov* copias lo que necesites directamente.
Bueno encontre un codigo en donde decian que al utilizar CreateFIleMapping
MapViewOfFile,
si no boi mal serviria para poner en memoria el ejecutable en question (memoria compartida) i entonces lo podria modificar i escribir con WriteFile,si me equivoco corriganme porfavor,
este es el code que sesupone pone al ejecutable que quiero modificar en memoria:
.386
.model flat,stdcall
.stack 200h
option casemap:none
include Tot.inc
.data
Fil db 'C:\masm32\men.exe',0
.data?
tam db 32 dup(?)
.code
start:
invoke CreateFile,offset Fil,GENERIC_WRITE+GENERIC_READ,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
push eax
invoke GetFileSize,eax,0
push eax
pop eax; Tam
pop ebx; Handle
invoke CreateFileMapping,ebx,0,PAGE_READWRITE,0,eax,0
mov ecx,eax ;ecx = mapp
invoke MapViewOfFile,ecx,FILE_MAP_ALL_ACCESS,0,0,0
mov edx,eax
invoke ExitProcess,0
end start
nose si estara bien
despues de eso como escribo en el????
quitar el archivo de la memoria ya lo se hacer solo necesito escribir en el,si saveis de alguna solucion mas no sera mal muchas gracias expertos
mov [edx+offset],datos o rep o de la forma que mas te guste.
push eax
pop eax
Para que haces eso?
y para evitar ese push eax
...
pop ebx
Vale un mov ebx,eax
Y aun no puedes modificar el archivo con WriteFile o con MapViewOfFile?
POR FINNNNNNNNNNNNNNNNNNNNNNNNNNN!!!
Finalmente me modifica el exe i no me da errores todo perfecto!! :D:D:DD:
les dejo el code pro que os lo mereceis que soys unos cracks de verdad!! sabia k podia confian en bosotros en todos los que me abeis ayudado mucha sgracias de verdad!!
.386
.model flat,stdcall
.stack 200h
option casemap:none
include Tot.inc
.data
Fil db 'C:\masm32\men.exe',0
.data?
tam db 32 dup(?)
.code
start:
invoke CreateFile,offset Fil,GENERIC_WRITE+GENERIC_READ,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
push eax
invoke GetFileSize,eax,0
push eax
pop eax; Tam
add eax,eax
pop ebx; Handle
invoke CreateFileMapping,ebx,0,PAGE_READWRITE,0,eax,0
mov ecx,eax ;ecx = mapp
invoke MapViewOfFile,ecx,FILE_MAP_ALL_ACCESS,0,0,0
mov edx,eax
mov dword ptr ds:[edx+800h],'jej'
invoke ExitProcess,0
end start
Si lo mapeas en memoria, al cambiar los datos en memoria ya se guardan automáticamente en disco.
Con WriteFile, había editado mi post corrgiendo mi code, creo que debería de funcionar :P.
Saludos
Hacker_Zero acabo de probar i si me modifica peor me surgio una cosa,el exe a modificar mostraba Riki (por un messagebox) kuando lo modifico i por ejemplo pongo Sandra me muestra Sandra pero al reves xd por k pasa eso?? osea me muestra ardnaS
i otra cosa en esta linea:
mov dword ptr ds:[edx+800h],'Sandra'
no me dejsa escribi mucho no puedo poner por ejemplo que escriba Hola mundo!! me dice que es muy largo creo :S:S
por que pasa eso??
salu2
Jajajaja, eso es porque windows utiliza little-endian para guardar los archivos en disco, deberás guardarlos al revés, creo que YST hizo un strreverse :xD. La otra opción más profesional es mapear el archivo en memoria como lo estabas haciendo, de esa forma deberia de guardarse correctamente.
Para lo de guardar datos largos, es que un dword son 4 bytes, no puedes hacer un mov de más de 4 bytes, deberás hacer un bucle e ir moviendo de 4 en 4 o usar RtlMoveMemory.
Saludos
OK no kuesta tanto escribir al reves xdxd i lo de rtlMoveMemory como lo utlilizo??? por que en vez de dword no puedo pponer otra cosa??
salu2
RtlMoveMemory la puedes importar de la kernel32.dll (forward) o de la ntdll.dll. Es sencillo su uso (http://msdn.microsoft.com/en-us/library/ms803004.aspx). Tambien creo recordar que en éste subforo había un hilo sobre emulaciones de ésta API, incluso YST la usa en sus códigos frecuentemente :P.
Saludos
rep movsb y copias todo lo que necesites, ya te lo dije antes.
Cita de: ctlon en 6 Enero 2010, 14:56 PM
rep movsb y copias todo lo que necesites, ya te lo dije antes.
:¬¬ Ya el mueve, ahora esta la idiotez del Big-Endian, Little-Endian que no se a quien se le ocurrio hacerla
Texto db "Texto que escribe",0
push edi
push esi
lea esi,Texto
mov edi,eax
mov ecx,12h
rep movsb
pop esi
pop edi
copiado sin problema alguno.
Okey gracias,peor me lleve una sorpresa xd k ya me esperaba en el pc donde hago la modificacion me ve todo muy bien pero kaundo cambio de makina parece k no puedo modificar el exe,creo que cambia de direccion de memoria segun el pc :S
Cita de: Riki_89D en 6 Enero 2010, 18:30 PM
Okey gracias,peor me lleve una sorpresa xd k ya me esperaba en el pc donde hago la modificacion me ve todo muy bien pero kaundo cambio de makina parece k no puedo modificar el exe,creo que cambia de direccion de memoria segun el pc :S
:¬¬ eso no deberia de suceder a menos que estes llamando las apis de manera HArdCodeadas
Tienes razon,acabo de ver el offset del exe que modifico en otra pc distinta a la que me fucnciona i es el mismo no cambia :S:S
no entiendo :S
EI: juntando mensajes, Riki_89D no sos nuevo en el foro, usa el boton de modificar por favor.
a klaro ya sse por k pas ano es pro las API es por donde esta el exe a modificar que no me acorde de pnoer la ruta en mi ordenador xdxd
salu2
Cita de: Riki_89D en 6 Enero 2010, 18:40 PM
a klaro ya sse por k pas ano es pro las API es por donde esta el exe a modificar que no me acorde de pnoer la ruta en mi ordenador xdxd
salu2
Entoncs ya este post se puede catalogar como Solucionado
Si solucionado gracias
Bueno una ultima cosa xd e porbadlo lo de:
push edi
push esi
lea esi,Texto
mov edi,eax
mov ecx,12h
rep movsb
pop esi
pop edi
Quiza lo ponga mal :S:S
done va ese code?
ese code es para escribir, repasate el tema de los registros.
aa bueni si que me escribe pero una vez me a escrito el ejecutable no funciona i se abre una ventana MS-DOS
yo le quito este:
mov dword ptr ds:[edx+800h],'loP '
ya queno em deja copioar mas de 4b,i le pongo el tuyo pero nada :S
el mio es un simple ejemplo. siendo ESI el registro origen, EDI el registro destino y ECX el contador..... no creo que tardes mas de 30 segundos en adaptarlo a tus necesidades.
add edi,offset ; edi apunta a ejecutable base + offset
lea esi,Texto ; lo que necesites escribir
mov ecx,12h ; logitud de los datos que se copian
rep movsb ; copiar los datos.
Fíjate de no copiar una cadena de longitud mayor a la original...
Saludos
El foro es para solucionar dudas basandose en que la persona tiene conocimientos basicos.
Te bloqueo el tema ya que antes de preguntar podrias leer algun libro de ASM , manuales ,codigos,etc.. ;)
Links que te dejo :
http://foro.elhacker.net/asm/entry_point-t256455.0.html
http://foro.elhacker.net/asm/programacion_en_lenguaje_ensamblador-t255444.0.html
http://www.google.cl/
http://msdn.microsoft.com/es-cl/default.aspx
Saludos