hola
pues despues de buscar y reintentar, logre crear el codigo y que se compile sin errores, se cargan las siguientes librerias en la pantalla de depuracion de visual studio, el cual lo tengo configurado como x64
'Project1.exe' (Win32): 'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\ws2_32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\msvcrt.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\rpcrt4.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\nsi.dll' cargado. Símbolos cargados.
pero no se conecta, alguien podria checar el codigo y decirme que podria estar mal, por favor
extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC
.data
wsdll db "ws2_32.dll",0
wsaddr dq ?
WStp db "WSAStartup",0
wtaddr dq ?
wsadata db 400 dup (0)
sock db "socket",0
sockaddr dq ?
conn db "connect",0
conaddr dq ?
sen db "send",0
senaddr dq ?
buf db "hola mundo",0
.code
Start proc
push rbp
mov rbp, rsp
sub rsp, 20h
mov rcx, offset [wsdll]
call LoadLibraryA
mov[wsaddr], rax
mov rdx, offset[WStp]
mov rcx, [wsaddr]
call GetProcAddress
mov[wtaddr], rax
lea rdx, wsadata
push rdx
push 2h
call [wtaddr]
mov rdx, offset[sock]
mov rcx, [wsaddr]
call GetProcAddress
mov[sockaddr], rax
push 0
push 1
push 2
call [sockaddr]
mov[sockaddr], rax
mov rdx, offset[conn]
mov rcx, [wsaddr]
call GetProcAddress
mov[conaddr], rax
push 16
mov rax, 0100007FB9220002h
push rax
push[sockaddr]
call[conaddr]
mov rdx, offset[sen]
mov rcx, [wsaddr]
call GetProcAddress
mov[senaddr], rax
mov r9, 0
mov r8, 50
mov rdx, offset[buf]
mov rcx,[sockaddr]
call[senaddr]
mov rsp, rbp
pop rbp
xor ecx, ecx
call ExitProcess
Start endp
End
Tenes que depurar TU codigo.
¿Convencion de llamada de x86?
lea rdx, wsadata
push rdx
push 2h
call [wtaddr]
push 0
push 1
push 2
call [sockaddr]
que depurador me recomiendas?, es que uso ollydbg pero todavia no se actualiza para analizar aplicaciones de 64 bits, ya corregi el codigo y creo va funcionando cada vez mejor
ahora ya se cargan mas librerias
'Project1.exe' (Win32): 'C:\Users\grimoire\Documents\Visual Studio 2012\Projects\Solution1\x64\Release\Project1.exe' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\ws2_32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\msvcrt.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\rpcrt4.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\nsi.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\mswsock.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\user32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\gdi32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\lpk.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\usp10.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\imm32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\msctf.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\WSHTCPIP.DLL' cargado. Símbolos cargados.
El programa '[656] Project1.exe' terminó con código 0 (0x0).
pero sigue sin funcionar, visual studio trae un debuggin por defecto, pero por mas breaks que pongo no me marca el error, ni violacion de acceso, ni nada, continua la ejecucion normalmente
extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC
.data
wsdll db "ws2_32.dll",0
wsaddr dq ?
WStp db "WSAStartup",0
wtaddr dq ?
wsadata db 400 dup (0)
sock db "socket",0
sockaddr dq ?
conn db "connect",0
conaddr dq ?
sen db "send",0
senaddr dq ?
buf db "hola mundo",0
.code
Start proc
push rbp
mov rbp, rsp
sub rsp, 20h
mov rcx, offset [wsdll]
call LoadLibraryA
mov[wsaddr], rax
mov rdx, offset[WStp]
mov rcx, [wsaddr]
call GetProcAddress
mov[wtaddr], rax
lea rdx, wsadata
mov rcx, 2h
call [wtaddr]
mov rdx, offset[sock]
mov rcx, [wsaddr]
call GetProcAddress
mov[sockaddr], rax
mov r8, 0h
mov rdx, 1h
mov rcx, 2h
call [sockaddr]
mov[sockaddr], rax
mov rdx, offset[conn]
mov rcx, [wsaddr]
call GetProcAddress
mov[conaddr], rax
mov rsi, 16h
mov rdi, 0100007FB9220002h
mov rdx,[sockaddr]
call[conaddr]
mov rdx, offset[sen]
mov rcx, [wsaddr]
call GetProcAddress
mov[senaddr], rax
mov r9, 0h
mov r8, 50h
mov rdx, offset[buf]
mov rcx,[sockaddr]
call[senaddr]
mov rsp, rbp
pop rbp
xor ecx, ecx
call ExitProcess
Start endp
End
WinDbg. Tenes que ver que retornan las funciones, para algo estan (mira rax despues de cada call y si no funciono !gle). connect no funciona ni funcionara nunca, rcx tiene que tener el socket y no lo tiene, segui mirando y presta mas atencion, son muy pocas lineas ...
int connect(
_In_ SOCKET s,
_In_ const struct sockaddr *name,
_In_ int namelen
);
Recuerda que en Windows y 64 bits se sige el siguiente orden, rcx, rdx, r8 y r9. Ademas no estas pasando la estructura sockaddr_in como puntero.
Un saludo.
Y para colmo todo esto ya esta aca:
http://foro.elhacker.net/asm/problema_con_masm_para_64bits-t396294.0.html
Belial & Grimoire no abras mas hilos sobre el mismo tema, deben haber mas de 5 ya ...
hola
disculpa, si quieren eliminen este o el tema anterior, solo hay 2 mas, los otros eran sobre nasm, el pirmero era porque no lograba entender porque no funciona getprocaddress, el segundo es el de masm, pero como crei que ya lo habia logrado ya que no me aparecian errores, decidi abrir uno nuevo pensando que era algun fallo de otro tipo, lo siento
ya verifique el codigo y tienen razon olvide cambiar lo de rcx.. r9..., olvide que habia modificado eso y lo deje de esa manera, bueno al principio lo tenia asi
mov r8, 16h
mov rdx, 0100007FB9220002h
mov rcx,[sockaddr]
call[conaddr]
en nasm con 32 bits, me habia funcionado de esta manera
push 0x0100007F
push 0xB9220002
mov esi, esp
push byte 16
push esi
push dword [soadd]
call [conaddr]
tambien de esta otra forma
sub esp, 416
mov word [ebp-416], 0x0002
mov word [ebp-414], 0xB922
mov dword [ebp-412], 0x0100007F
push byte 16
lea eax, [ebp-416]
push eax
push dword [soadd]
call [conaddr]
pero por la syntaxis de masm, no me lo permite, con push me aparece error,con rcx en socket me aparece este mensaje de error
Primera excepción en 0x000007FEFCCE5D18 (mswsock.dll) en Project1.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xFFFFFFFFFFFFFFFF. (0x0).
por eso, habia cambiado el codigo, porque de la otra forma me compilo bien
una disculpa nuevamente por abrir otro hilo, y espero poder terminar, si el error esta en connect, almenos ya se que me falta poco
salu2
Pero tienes que pasar la estructura como puntero.
mov rbx, 0100007FB9220002h
push rbx
mov rdx, rsp
Un saludo.
ok gracias
pues investigue mas e hice lo que mencionaron, modificando otras cosas, y el codigo carga las librerias y no aparece ningun error, pero sigue sin funcionar :¬¬
cualquier sugerencia se los agradezco
extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC
.data
wsdll db "ws2_32.dll",0
wsaddr dq ?
WStp db "WSAStartup",0
wtaddr dq ?
wsadata db 400 dup (0)
sock db "socket",0
sockaddr dq ?
conn db "connect",0
conaddr dq ?
sen db "send",0
senaddr dq ?
buf db "hola mundo",0
.code
Start proc
and rsp,-16
sub rsp,4*8
mov rcx, offset wsdll
call LoadLibraryA
mov wsaddr, rax
mov rdx, offset WStp
mov rcx, wsaddr
call GetProcAddress
mov wtaddr, rax
lea rdx, wsadata
mov rcx, 2h
call wtaddr
mov rdx, offset sock
mov rcx, wsaddr
call GetProcAddress
mov sockaddr, rax
mov r8, 0h
mov rdx, 1h
mov rcx, 2h
call sockaddr
mov sockaddr, rax
mov rdx, offset conn
mov rcx, wsaddr
call GetProcAddress
mov conaddr, rax
mov r8, 16h
mov rbx, 0100007FB9220002h
push rbx
mov rdx, rsp
mov rcx, sockaddr
call conaddr
mov rdx, offset sen
mov rcx, wsaddr
call GetProcAddress
mov senaddr, rax
mov r9, 0h
mov r8, 50h
mov rdx,offset buf
mov rcx,sockaddr
call senaddr
xor ecx, ecx
call ExitProcess
Start endp
End
Si, son todos de lo mismo, el objetivo del codigo es el mismo ... ("logre un socket en nasm jeje" , "no entiendo un error debido a la sección data " y mas).
¿No seria muchisimo mejor usar la estructura sockaddr_in?
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
Para sin_port podes usar la funcion htons y para sin_addr inet_addr.
0:000> dw @rdx @rdx + 2
00000000`0012ff28 0002 b922
sin_family = 2
sin_port = b922 = 22B9 little endian = 8889 decimal
0:000> dd @rdx + 4 @rdx + c
00000000`0012ff2c 0100007f 00000000 00000000
sin_addr = 7f000001 = 127.0.0.01
sin_zero = 8 ceros como debe ser
¿Que tamaño tiene la estructura sockaddr_in? 16 si, 16 bytes en decimal, 10h en hexadecimal.
No funciona el codigo que te dejo cpu2.
ws2_32!connect llama a mswsock!WSPConnect y esta a mswsock!SockDoConnect que retorna lo que despues se pondra en Last Error (10047).
Termina pasando esto:
mswsock!SockDoConnect+0x124:
movzx eax,word ptr [r13] ds:00000000`0012ff28=0000
mswsock!SockDoConnect+0x129:
cmp dword ptr [rbx+14h],eax ds:00000000`02081484=00000002
mswsock!SockDoConnect+0x12c:
jne mswsock!SockDoConnect+0x158 (000007fe`fc50a466) [br=1]
mswsock!SockDoConnect+0x158:
mov edi,273Fh
¿Que quiere decir? Compara AF_INET (2) con tu parametro y le da diferente (AF_UNSPEC = 0). Por eso si hicieras:
0:000> !gle
LastErrorValue: (WinSock) 0x273f (10047) - Se ha utilizado una dirección incompatible con el protocolo solicitado.
¿La razon? Facil, connect te sobreescribe todos los valores de tu estructura ... cuando llama a:
int WSPConnect(
_In_ SOCKET s,
_In_ const struct sockaddr *name,
_In_ int namelen,
_In_ LPWSABUF lpCallerData,
_Out_ LPWSABUF lpCalleeData,
_In_ LPQOS lpSQOS,
_In_ LPQOS lpGQOS,
_Out_ LPINT lpErrno
);
La pila es libre de ser modificada, si queres seguir trabajando con la pila reservate espacio al principio y pone la estructura ahi.
Sino bien sencillo en data:
in_addr dq 0100007FB9220002h
y en code:
mov r8, 10h
mov rdx, offset in_addr
mov rcx, sockaddr
call conaddr
PD. and rsp,-16 sub rsp,4*8 ¿De verdad? ¿En serio? Necesitas 5000 intentos para hacer funcionar este codigo tan chico y pones cosas asi ininteligibles ...
no se enojen, solo quiero hacer funcionar ese codigo, si me voy por el camino facil, solo hago esto y ya
option casemap:none
extern ExitProcess:PROC
extern WSAStartup:PROC
extern socket:PROC
extern connect:PROC
extern send:PROC
WSADATA STRUCT 8
wVersion WORD ?
wHighVersion WORD ?
iMaxSockets WORD ?
iMaxUdpDg WORD ?
lpVendorInfo QWORD ?
szDescription SBYTE 257 dup (?)
szSystemStatus SBYTE 129 dup (?)
WSADATA ENDS
sockaddr STRUCT
sa_family SWORD ?
sa_port WORD ?
sa_addr DWORD ?
BYTE 8 dup (?)
sockaddr ENDS
.const
align 8
address sockaddr <2, 0B922h, 0100007Fh>
sz1 BYTE "hola mundo",0
.data?
align 8
Socket QWORD ?
wsadata WSADATA <>
.code
main proc
and rsp,-16
sub rsp,4*8
lea rdx, wsadata
mov rcx, 2h
call WSAStartup
mov r8, 0h
mov rdx, 1h
mov rcx, 2h
call socket
mov Socket, rax
mov r8, 16h
lea rdx, address
mov rcx, Socket
call connect
mov r9, 0h
mov r8, SIZEOF sz1
mov rdx, offset sz1
mov rcx, Socket
call send
xor ecx, ecx
call ExitProcess
main endp
End
pero bueno, dejemoslo hasta aqui y digamos que ya esta solucionado, nada mas no se enojen, con esta semana ya cumplo 4 semanas que empece con ASM y mi unica guia es un libro de IBM para 16 bits y muchos ejemplos en google donde hay mezcla de todo, talvez cuando cumpla algunos meses o años ya no hare cosas de esta manera, y mi unica ayuda son ustedes, porque no tengo compañeros donde vivo que sepan informatica y que pueda unirme para aprender con ellos, porque tambien para colmo soy autodidacta
salu2 ;D
Perfecto, nada mejor que hacer las cosas bien.