logre un socket en nasm jeje

Iniciado por Belial & Grimoire, 20 Julio 2013, 22:05 PM

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

Belial & Grimoire

yeeeeeah!! lo logre

les dejo el codigo por si a alguien mas le sirve y por si lo pierdo se que aqui estara, solo me falta el servidor pero espero se me facilite un poco mas

y gracias al consejo de cpu2 de usar direcciones en vez de usar estructuras logre hacerlo

Código (asm) [Seleccionar]
[BITS 32]

section .data

wsdll: db 'ws2_32.dll',0
wsaddr: dd '0xFFFFFFFF'
Getpc: dd '0xFFFFFFFF'

WStp: db 'WSAStartup',0
WSaddr: dd '0xFFFFFFFF'
WSD: dd 'WSADATA',0
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'
conn: db 'connect', 0
conaddr: dd '0xFFFFFFFF'
sen: db 'send', 0
sendadd: dd '0xFFFFFFFF'

res1: db "WSAStartup %d", 10, 0
res2: db "Socket %d", 10, 0
res3: db "connect %d", 10, 0
res4: db "send %d", 10 ,0

sre: db "hola mundo",0

section .bss
sn resb 10

section .text

global _WinMain@16
extern _ExitProcess@4
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _printf
extern _WSAStartup@8

_WinMain@16:

xor eax, eax

push wsdll
call _LoadLibraryA@4
mov [wsaddr], eax

push WStp
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push WSD
push 0x202
call [Getpc]
mov [saveWSA], eax

cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
call _printf

push soc
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push 6
push 1
push 2
call [Getpc]
mov [soadd], eax

push dword [soadd]
push res2
call _printf

push conn
push dword [wsaddr]
call _GetProcAddress@8
mov [conaddr], eax

push dword [conaddr]
push res3
call _printf

push 0x0100007F
push 0xB9220002
mov esi, esp
push byte 16
push esi
push dword [soadd]
call [conaddr]

erro:
push 0
call _ExitProcess@4



Habia leido sobre poner sockaddr_in en nasm pero no supe como usar estructuras asi que puse directamente la ip, el puerto y el formato de direccion (AF_INET) lo guarde en ESI, despues reserve 16 bytes de espacio para la longitud de sockaddr_in y listo, meti en la pila la longitud, ESI, el descriptor e hice un call a connect

aun me confundo en la posicion de las cosas, habia puesto el descriptor socket al inicio pero iba antes de connect

bueno, espero a alguien mas le ayude esto que si me costo trabajo, seguire estudiando todavia mas sobre asm

solo como ultima peticion, alguien me podria explicar bien el funcionamiento de ESI y EDI

funciona para concatenar o copiar?, por ejemplo

lo que haya en esi se concatena con edi

esi = 1
edi = 2

mov eax, edi
eax = 12

es algo asi?

se que significa source index y destination index y en este caso me ayudo como registro para salvar lo que habia en esp, pero muy bien aun no lo entiendo, podrian explicarme y si se puede con un ejemplo porfavor

gracias y salu2
.                                 

cpu2

Pues nada, me alegro de que lo hayas conseguido.

Cita de: Belial & Grimoire en 20 Julio 2013, 22:05 PMy gracias al consejo de cpu2 de usar direcciones en vez de usar estructuras logre hacerlo

Me parece que no entiendes muy bien lo que te explique, se nota que vienes de un lenguaje de alto nivel. Bueno ya lo entenderas.

Sobre esi y edi no se concatenan de esa forma de donde sacaste eso? simplemente copiaria 0x00000002 a eax.
Donde si tabrajan juntas esi y edi son con instrucciones especiales de manejo de cadenas.

Y sobre source index y destination index no te entendi muy bien, te refieres al stack?

Un saludo

Belial & Grimoire

jeje lo siento, no me fije que puse direcciones en ves de valores, o en otras palabras, ip, puerto y AF_INET

es que cuando buscaba informacion lei que alguien decia que ESI y EDI eran continuos, asi que imagine que lo que se ponia en uno, se concatenaba al otro, pero ya despues lei en otro lugar que era algo parecido a esto

buffer1[i++] = buffer2[j++]

por eso me confundo, porque ya no seria concatenar, seria copiar y veo que muchos usan

push esi
push edi

e incluso veo que lo usan mucho con ecx

push esi
push edi
push ecx

por eso quisiera saber cual es el proposito, de esi y edi
.                                 

cpu2

#3
Cita de: Belial & Grimoire en 20 Julio 2013, 23:46 PMpor eso me confundo, porque ya no seria concatenar, seria copiar y veo que muchos usan

push esi
push edi

e incluso veo que lo usan mucho con ecx

push esi
push edi
push ecx

por eso quisiera saber cual es el proposito, de esi y edi

Estas cargando los valores de dichos registros al stack, eso se acerca mas a concatenar.

Ejemplo, si esi vale 0x02 y edi 0x03.

Código (asm) [Seleccionar]
push esi
push edi


Concatenas esto 0x0000000200000003, espero que lo entiendas.

Cita de: Belial & Grimoire en 20 Julio 2013, 23:46 PMpor eso quisiera saber cual es el proposito, de esi y edi

Te invito a la chincheta de documentacion, y que te mires el manual de AMD o Intel, yo tengo a mano el de AMD, en la pagina 31 y 32 del tomo numero 1, estan escritos los usos que tiene cada registro, esi y edi tienen el mismo proposito solo que tienen una diferencia.



Un saludo.