[SOLUCIONADO] Problema al convertir codigo de 64bits a 32bits

Iniciado por proxy_lainux, Septiembre 16, 2013, 11:54:12 PM

Tema anterior - Siguiente tema

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

Septiembre 16, 2013, 11:54:12 PM Ultima modificación: Febrero 08, 2014, 05:27:24 PM por Expermicid
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
.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


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:
Código: php
push 0h
push SIZEOF sbuff
push offset sbuff
push Socket
call send
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

hola

gracias, ya funciona

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

gracias nuevamente

salu2