Funcion WriteFile (ASM)

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

0 Miembros y 3 Visitantes están viendo este tema.

Riki_89D

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

[L]ord [R]NA

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.

Riki_89D

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!

[L]ord [R]NA

Có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...

Riki_89D

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!

[L]ord [R]NA

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

Riki_89D

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???

[Zero]

Cita de: R.N.A. en  4 Enero 2010, 18:34 PM
Có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


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

Riki_89D

#18
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

[L]ord [R]NA

quita la parte que dice  .stack 100h y prueba a  ver... pasaste el debugger?