2013-09-20 2 views
-1

Я пытаюсь создать «сокет» с masm32, но что-то не так с accept(), ollydbg показывает мне нарушение доступа, когда код пытается выполнить accept() и I не знаю, что не так, Может кто-нибудь сказать мне, как я могу это исправить, пожалуйста?access abuse socket accept() on masm32

.686 
.model flat, stdcall 
option casemap:none 

extrn [email protected]:PROC 
extrn [email protected]:PROC 
extrn [email protected]:PROC 
extrn [email protected]:PROC 
extrn [email protected]:PROC 
extrn [email protected]:PROC 

WSADATA STRUCT 8 
wVersion   WORD ? 
wHighVersion  WORD ? 
iMaxSocket  WORD ? 
iMaxUdpDg   WORD ? 
lpVendorInfo  DWORD ? 
szDescription  SBYTE 257 dup (?) 
szSystemStatus SBYTE 129 dup (?) 
WSADATA ENDS 

sockaddr STRUCT 
sa_family WORD ? 
sa_port  WORD ? 
sa_addr  DWORD ? 
      BYTE 8 dup (?) 
sockaddr ENDS 

.const 
address sockaddr<2, 0B922h, 00000000h> 
sbuff BYTE 50 dup (0) 

.data? 
wsadata WSADATA <> 
Socket DWORD ? 
.code 

Start proc 
push ebp 
mov ebp, esp 

lea edx, wsadata 
push edx 
push 2h 
call [email protected] 

push 0h 
push 1h 
push 2h 
call [email protected] 
mov Socket, eax 

push 16h 
lea ecx, address 
push ecx 
push Socket 
call [email protected] 

push 1h 
push Socket 
call [email protected] 

push 16h 
lea ecx, address 
push ecx 
push Socket 
call [email protected] 



mov eax, 0 
call [email protected] 

mov esp, ebp 
pop ebp 

Start endp 
END 

рассматривает

ответ

0

Третий аргумент доступа является указателем длины, а не сама длина.

К слову: структура 16 (десятичная), а не 16h байт.

Поэтому ваш код должен выглядеть следующим образом:

.data? 
wsadata WSADATA <> 
Socket DWORD ? 
addrlen DWORD 10h  <- This one is new! 
.code 
    ... 
push 10h     <- Instead of 16h 
    ... 
call [email protected] 
    ... 
lea ecx, addrlen 
push ecx 
lea ecx, address 
push ecx 
push Socket 
call [email protected] 
+0

Что касается размеров структуры; MASM32 также имеет переменные 'LENGTHOF variable',' SIZEOF variable' и 'SIZEOF type'. – Michael

+0

работает отлично, спасибо –