Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: proxy_lainux en Septiembre 16, 2013, 11:54:12 PM

Título: [SOLUCIONADO] Problema al convertir codigo de 64bits a 32bits
Publicado por: proxy_lainux en Septiembre 16, 2013, 11:54:12 PM
hola

Este codigo lo hice anteriormente para 64 bits y funciona bien, pero ahora quise hacer unos cambios para volverlo a 32bits como los registros, rax, rbx, etc... a eax, ebx,.. etc, las funciones externas tuve que hacer algunos cambios que me pedia el compilador

Pero no funciona, lo analice con ollydbg y el error sale desde el inicio, WSAStartup, lo que no entiendo es porque ya no funciono?, no se si es por el compilador, o porque lo modifique mal... podria alguien hacerme el favor de verificarlo porfavor

lo estoy haciendo en masm32, lm y link

asi lo compilo

ml /coff /c serv.asm
link /entry:Start /subsystem:console /libpath:c:/masm32/lib kernel32.lib ws2_32.lib serv.obj

Este es el codigo

Código (asm) [Seleccionar]
.686
.model flat, stdcall
option casemap:none

extrn ExitProcess@4:PROC
extrn WSAStartup@8:PROC
extrn socket@12:PROC
extrn connect@12:PROC
extrn send@16:PROC

WSADATA STRUCT 8
wVersion          WORD  ?
wHighVersion      WORD  ?
iMaxSocket        WORD  ?
iMaxUdpDg         WORD  ?
lpVendorInfo      DWORD ?
szDescription     SBYTE 257 dup (?)
szSystemStatus    SBYTE 129 dup (?)
WSADATA ENDS

sockaddr STRUCT
sa_family   WORD ?
sa_port     WORD  ?
sa_addr     DWORD ?
            BYTE 8 dup (?)
sockaddr ENDS

.const
address sockaddr<2, 0B922h, 0100007Fh>
sbuff BYTE "hola mundo",0

.data?
wsadata WSADATA <>
Socket DWORD ?

.code

Start proc
push ebp
mov ebp, esp

lea edx, wsadata
mov ecx, 2h
call WSAStartup@8

mov edx, 0h
mov ecx, 1h
mov ebx, 2h
call socket@12
mov Socket, eax

mov edx, 16h
lea ecx, address
mov ebx, Socket
call connect@12

mov edx, 0h
mov ecx, SIZEOF sbuff
mov ebx, offset sbuff
mov eax, Socket
call send@16

mov eax, 0
call ExitProcess@4

mov esp, ebp
pop ebp

Start endp
END

Título: Re:problema al convertir codigo de 64bits a 32bits
Publicado por: Karcrack en Septiembre 17, 2013, 11:02:56 AM
En 32bits la convención de llamada de las APIs de Windows es stdcall... Debes hacer push de los parámetros en lugar de meterlos en eax, ebx, ecx, edx...

Ejemplo de fix:
push 0h
push SIZEOF sbuff
push offset sbuff
push Socket
call send
Título: Re:problema al convertir codigo de 64bits a 32bits
Publicado por: proxy_lainux en Septiembre 17, 2013, 02:03:10 PM
hola

gracias, ya funciona

eso explica porque tuve que usar registros que no usaba en 64bits..

gracias nuevamente

salu2