Сбой создания сокета сборки - PullRequest
       23

Сбой создания сокета сборки

0 голосов
/ 30 сентября 2019

это мой исходный код сборки для сокета Windows (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) для каждой функции ... ?? это проблема? или проблема в связывании функций?

1 Ответ

0 голосов
/ 30 сентября 2019

я обнаружил проблему ... проблема связана с ссылками ... моя ссылка неверна, потому что я использовал макрос fASM по умолчанию (для ссылок), и он работал без проблем ... теперь в чем проблема моей ссылки? !!!!!

...