-1

masm32 で「ソケット」を作成しようとしていますが、accept() に何か問題があります。ollydbg は、コードが accept() を実行しようとするとアクセス違反を表示し、何が問題なのかわかりません。誰か教えてください。どうすれば修正できますか?

.686
.model flat, stdcall
option casemap:none

extrn ExitProcess@4:PROC
extrn WSAStartup@8:PROC
extrn socket@12:PROC
extrn bind@12:PROC
extrn listen@8:PROC
extrn accept@12: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 WSAStartup@8

push 0h
push 1h
push 2h
call socket@12
mov Socket, eax

push 16h
lea ecx, address
push ecx
push Socket
call bind@12

push 1h
push Socket
call listen@8

push 16h
lea ecx, address
push ecx
push Socket
call accept@12



mov eax, 0
call ExitProcess@4

mov esp, ebp
pop ebp

Start endp
END

よろしく

4

1 に答える 1

0

access の 3 番目の引数は、長さそのものではなく、長さへのポインターです。

ところで: 構造体は 16 (10 進数) であり、16h バイトの長さではありません。

したがって、コードは次のようになります。

.data?
wsadata WSADATA <>
Socket DWORD ?
addrlen DWORD 10h        <- This one is new!
.code
    ...
push 10h                 <- Instead of 16h
    ...
call bind@12
    ...
lea ecx, addrlen
push ecx
lea ecx, address
push ecx
push Socket
call accept@12
于 2013-09-20T06:49:45.100 に答える