【问题标题】:Assembly socket creation crash装配套接字创建崩溃
【发布时间】:2019-09-30 13:01:58
【问题描述】:

这是我的 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

我应该为每个函数使用 (add esp, x) ... ??这是问题吗? 还是问题出在函数链接上?

【问题讨论】:

  • 使用您的调试器至少查明崩溃的位置。
  • 其实不是崩溃……是冻结几秒然后存在……
  • 您忘记将套接字句柄写入____SOCKET 变量。
  • 是的,但这不是问题....至少,如果____SOCKET 无效,它必须返回错误!但是这个程序冻结了!!!
  • 使用调试器在进程卡住时中断进程,以便查看哪个函数正在阻塞。

标签: sockets assembly fasm


【解决方案1】:

我发现了问题...问题出在链接...我的链接错误,因为我使用了 fASM 的默认宏(用于链接)并且它可以正常工作...现在我的链接有什么问题?!!!!!!

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多