Sockets 程序集套接字创建崩溃

Sockets 程序集套接字创建崩溃,sockets,assembly,fasm,Sockets,Assembly,Fasm,这是我的windows socket(ws2)程序集源代码 这个程序编译时没有任何问题,但在执行时,程序崩溃(几秒钟内,程序什么也不做) 有什么问题?我认为问题在于堆栈或 format PE CONSOLE entry start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; section '.bss' writeable readable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

这是我的windows socket(ws2)程序集源代码

这个程序编译时没有任何问题,但在执行时,程序崩溃(几秒钟内,程序什么也不做)

有什么问题?我认为问题在于堆栈或

format PE CONSOLE
entry start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.bss' writeable readable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        ____STD_OUTPUT_HANDLE     RD 1
        ____SOCKET                RD 1
        ____LPWSADATA             RB 400

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.text' code readable executable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

start:
        sub     esp, 16 ; struct sockaddr_in

        ; GetStdHandle
        push    -11
        call    [GetStdHandle]
        test    eax, eax
        jz      .exit
        mov     [____STD_OUTPUT_HANDLE], eax

        ; WSAStartup
        push    ____LPWSADATA
        push    2
        call    [WSAStartup]
        test    eax, eax
        jnz     .init_failed

        ; SOCKET
        push    6
        push    1
        push    2
        call    [socket]
        test    eax, eax
        jz      .socket_failed

        ; HTONS (PORT)
        push    80
        call    [htons]
        mov     [esp+2], WORD ax                ; sin_port = htons(port)

        ; SOCKADDR
        mov     [esp], WORD 2                   ; sin_family = AF_INET
        mov     [esp+4], DWORD 2130706433       ; sin_addr   = 127.0.0.1 (addr in long = (2130706433))

        ; BIND
        push    16
        lea     eax, [esp]
        push    eax
        push    [____SOCKET]
        call    [bind]
        test    eax, eax
        jnz     .bind_failed

        ; LISTEN
        push    5               ; SOMAXCONN
        push    [____SOCKET]
        call    [listen]
        test    eax, eax
        jnz     .listen_failed

        ; CLOSE
        ; ...
        ; ...


        jmp     .exit


        .init_failed:
                push    0
                push    0
                push    DWORD [.err0_len]
                push    DWORD .err0
                push    [____STD_OUTPUT_HANDLE]
                call    [WriteFile]
                jmp     .exit

        .socket_failed:
                push    0
                push    0
                push    DWORD [.err1_len]
                push    DWORD .err1
                push    [____STD_OUTPUT_HANDLE]
                call    [WriteFile]
                jmp     .exit

        .bind_failed:
                push    0
                push    0
                push    DWORD [.err2_len]
                push    DWORD .err2
                push    [____STD_OUTPUT_HANDLE]
                call    [WriteFile]
                jmp     .exit

        .listen_failed:
                push    0
                push    0
                push    DWORD [.err3_len]
                push    DWORD .err3
                push    [____STD_OUTPUT_HANDLE]
                call    [WriteFile]
                jmp     .exit

        .exit:
                push    0
                call    [ExitProcess]
                hlt

        .err0:
                DB      'Socket initialization failed', 0x0A, 0x00

        .err0_len:
                DD      $ - .err0

        .err1:
                DB      'Socket creation failed', 0x0A, 0x00

        .err1_len:
                DD      $ - .err1

        .err2:
                DB      'Socket bind failed', 0x0A, 0x00

        .err2_len:
                DD      $ - .err2

        .err3:
                DB      'Socket listen failed', 0x0A, 0x00

        .err3_len:
                DD      $ - .err3


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.idata' import data readable writeable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        DD      0,0,0,RVA kernel_name, RVA kernel_list
        DD      0,0,0,0,0

        DD      0,0,0,RVA ws2_name, RVA ws2_list
        DD      0,0,0,0,0

        kernel_list:
                ExitProcess     DD RVA _ExitProcess
                GetStdHandle    DD RVA _GetStdHandle
                WriteFile       DD RVA _WriteFile
                CloseHandle     DD RVA _CloseHandle
                                DD 0

        kernel_name:        DB 'KERNEL32.DLL', 0

        _ExitProcess:           DB 0,0,'ExitProcess',0
        _GetStdHandle:          DB 0,0,'GetStdHandle',0
        _WriteFile:             DB 0,0,'WriteFile',0
        _CloseHandle:           DB 0,0,'CloseHandle',0

        ws2_list:
                socket                  DD RVA _socket
                htons                   DD RVA _htons
                WSAStartup              DD RVA _WSAStartup
                WSACleanup              DD RVA _WSACleanup
                WSAGetLastError         DD RVA _WSAGetLastError
                getpeername             DD RVA _getpeername
                bind                    DD RVA _bind
                listen                  DD RVA _listen
                accept                  DD RVA _accept
                recv                    DD RVA _recv
                send                    DD RVA _send
                setsockopt              DD RVA _setsockopt
                shutdown                DD RVA _shutdown
                closesocket             DD RVA _closesocket
                                        DD 0

        ws2_name:           DB 'WS2_32.DLL', 0

        _socket:                DB 0,0,'socket',0
        _htons:                 DB 0,0,'htons', 0
        _WSAStartup:            DB 0,0,'WSAStartup',0
        _WSACleanup:            DB 0,0,'WSACleanup',0
        _WSAGetLastError:       DB 0,0,'WSAGetLastError',0
        _getpeername:           DB 0,0,'getpeername',0
        _bind:                  DB 0,0,'bind',0
        _listen:                DB 0,0,'listen',0
        _accept:                DB 0,0,'accept',0
        _recv:                  DB 0,0,'recv',0
        _send:                  DB 0,0,'send',0
        _setsockopt:            DB 0,0,'setsockopt',0
        _shutdown:              DB 0,0,'shutdown',0
        _closesocket:           DB 0,0,'closesocket',0
我应该为每个函数使用(添加esp,x)吗??这就是问题所在吗?
或者问题在于函数链接?

我发现了问题。。。问题是连接。。。我的链接是错误的,因为我使用了默认的fASM宏(用于链接),它的工作没有任何问题。。。现在我的链接有什么问题

使用调试器至少确定崩溃的位置。事实上,它不是崩溃。。。它冻结了几秒钟,然后就存在了…您忘记将套接字句柄写入
\uuuuuuuuuu socket
变量。是的,但这不是问题所在。。。。至少,如果uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!!!但是这个程序冻结了!!!当进程被卡住时,使用调试器打断进程,以便查看哪个函数被阻塞。