Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eternal Idol

#1761
Perfecto, nada mejor que hacer las cosas bien.
#1762
Bob1098: segui leyendo y presta mas atencion esta vez.

Cita de: amchacon en 11 Agosto 2013, 19:18 PMNo seas tan cínico, aunque así lo fuera, no pasaría nada por explicarle datos teóricos...

Tal vez yo no sea cinico y vos seas muy ingenuo, quien sabe, eso si no creas ni por un segundo que tenes el mas minimo derecho a ordenarle nada a los demas.
#1763
En cualquier libro te lo explica y en Google tambien lo podes encontrar ... ¿Es una pregunta de un trabajo por casualidad?  :silbar:
#1764
argc = argument count y argv = argument vector.

De 0 a argc - 1 podes acceder a los parametros en argv, normalmente el primero es el mismo programa.
#1765
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 ...
#1766
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 ...
#1767
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
);
#1768
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]
#1769
Programación C/C++ / Re: Estructuras en C
10 Agosto 2013, 10:39 AM
No se hacen tareas.
#1770
No se cuales columnas estaras viendo pero si depuras y/o desensamblas el programa podras ve como no es correcta tu conclusion.

Por ejemplo dentro del destructor de foo y antes de salir se llama a:
call   ILT+570(??1?$basic_stringDU?$char_traitsDstdV?$allocatorD

que a su vez salta a

ILT+570(??1?$basic_stringDU?$char_traitsDstdV?$allocatorD:
jmp std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >

Si lo depuras podes ver como dentro del string el puntero a memoria que use (yo estoy en VC++ y es _Bx->_Ptr) deja de ser valido.



EDITO

Con 10mb tal vez lo veas mas claro:

Código (c++) [Seleccionar]
foo() : str(10485760/*1000000*/,'a')

1) Espacio de trabajo: 2040KB Memoria: 520KB
2) Espacio de trabajo: 12312KB Memoria: 10784KB
3) Espacio de trabajo: 2048KB Memoria: 520KB