Sockets 程序集套接字创建崩溃
这是我的windows socket(ws2)程序集源代码 这个程序编译时没有任何问题,但在执行时,程序崩溃(几秒钟内,程序什么也不做) 有什么问题?我认为问题在于堆栈或Sockets 程序集套接字创建崩溃,sockets,assembly,fasm,Sockets,Assembly,Fasm,这是我的windows socket(ws2)程序集源代码 这个程序编译时没有任何问题,但在执行时,程序崩溃(几秒钟内,程序什么也不做) 有什么问题?我认为问题在于堆栈或 format PE CONSOLE entry start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; section '.bss' writeable readable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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!!!但是这个程序冻结了!!!当进程被卡住时,使用调试器打断进程,以便查看哪个函数被阻塞。