SOCKS4 proxy with MASM32

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by А®ТеS, 12 Aug 2007.

  1. А®ТеS

    А®ТеS Active Member

    Joined:
    25 Nov 2006
    Messages:
    198
    Likes Received:
    193
    Reputations:
    41
    Сегодня ночью мне не спалось (хотя уже трое суток не дрых!) и решил немного помучать компутер, а именно написать SOCKS4 проксик на MASM'e.
    Почему именно прокси? Просто давно хотел попробовать реализовать этот протокол. Почему на MASM'e? Просто я мазохист :), к тому же если
    сервер будет сильно загруженным, то "ручная" сборка будет лучше. Короче, хочу поделиться трудами, появившимися на свет благодаря часу непрерывной
    работы и народному мату :), как профессиональную разработку его котировать разумеется нельзя, но учиться (на чужих ошибках ;-)) вполне.
    Результирующий размер PE'шки получился 3,5 килобайта, строчек в сорце около 200. Вобщем заценяем код, ногами сильно не пинаем, а я пойду спать (уже четвертые сутки на исходе :)):
    Code:
    ;Small SOCKS4 Proxy Server. Do not use for criminal, this is only example release SOCKS4 on x86 under win32... this is very old technology, i prefer .NET Framework :)
    ;(C)oded by A®TeS (king Artas ;-)), ICQ: 903521 (may be write to offline, generally my status is offline (NOT invisible - offline)), mail : Antichat's (/) Private Message for user A®TeS :)
    ;Thnx: Gorl (for C++ source :)), Shturmovik, 1dt.w0lf, All ANTICHAT, All WASM.ru, All Cr@ckLab, All RST (project closed :( ), specialy: =HALK=, Dronga, Pete®, XSP, AM, Draco and other good people :). 
    ;Best viewed with NOTEPAD! (about MASM32 code)
     
    .386
    
    .model flat, stdcall
    
    option CaseMap : none
    
    INCLUDE \masm32\include\kernel32.inc
    INCLUDE \masm32\include\wsock32.inc
    INCLUDE \masm32\include\windows.inc
    
    INCLUDELIB \masm32\lib\kernel32.lib
    INCLUDELIB \masm32\lib\wsock32.lib
    
    SocksHandlerThreadProc proto : DWORD
    FlushRecvBufferUntil proto : DWORD
    
    SOCK4_REQUEST struct
    ucVersion db ?
    ucCommand db ?
    wDestPort dw ?
    dwDestIp dd ?
    SOCK4_REQUEST ends
    
    .data?
    wsadata WSADATA <?>
    l_sock SOCKET ?
    sock4 sockaddr_in <?>
    Client sockaddr <?>
    size1 DWORD ?
    h HANDLE ?
    hMemory HANDLE ?
    pMemory DWORD ?
    hMemoryff HANDLE ?
    pMemoryff DWORD ?
    
    .code
    start:
    invoke WSAStartup, 2h, addr wsadata
    invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
    mov l_sock, EAX
    mov sock4.sin_family, AF_INET
    invoke htons, 1080d
    mov sock4.sin_port, AX
    mov sock4.sin_addr.S_un.S_addr, INADDR_ANY
    mov size1, sizeof Client
    invoke bind, dword ptr [l_sock], addr sock4, sizeof sock4
    cmp EAX, 0h
    jnz @end
    invoke listen, dword ptr [l_sock], 0FFh
    cmp EAX, 0h
    jnz @end
    @entry_to_while:
    invoke accept, dword ptr [l_sock], addr Client, addr size1
    invoke CreateThread, NULL, 0h, addr SocksHandlerThreadProc, EAX, 0, h
    jmp @entry_to_while
    @end:
    invoke ExitProcess, 0h
    
    SocksHandlerThreadProc proc pParam : DWORD
    LOCAL s : SOCKET
    LOCAL tunnelSock : SOCKET
    LOCAL socks4Request : SOCK4_REQUEST
    LOCAL socks4Response : SOCK4_REQUEST
    LOCAL remoteAddr : sockaddr_in
    LOCAL fds_read : fd_set
    LOCAL tv : timeval
    LOCAL bSocksVersion : BYTE
    LOCAL dwVal : DWORD
    
    mov EAX, pParam
    mov s, EAX
    mov tunnelSock, 0h
    mov fds_read.fd_count, 0h
    mov EAX, dword ptr [s]
    mov fds_read.fd_array, EAX
    inc fds_read.fd_count
    mov tv.tv_sec, 30d
    mov bSocksVersion, 0h
    invoke select, 0h, addr fds_read, NULL, NULL, addr tv
    cmp EAX, SOCKET_ERROR
    jz @ret
    not EAX
    cmp EAX, 0h
    jg @ret
    mov dwVal, 0h
    invoke ioctlsocket, dword ptr [s], FIONBIO, addr dwVal
    invoke recv, dword ptr [s], addr bSocksVersion, 1, MSG_PEEK
    cmp EAX, SOCKET_ERROR
    jz @ret
    cmp byte ptr [bSocksVersion], 4h
    jnz @ret
    invoke recv, dword ptr [s], addr socks4Request, sizeof socks4Request, 0h
    cmp EAX, SOCKET_ERROR
    jz @ret
    mov dwVal, 1h
    invoke ioctlsocket, dword ptr [s], FIONBIO, addr dwVal
    invoke FlushRecvBufferUntil, dword ptr [s]
    cmp byte ptr [socks4Request.ucCommand], 1h
    jnz @ret
    invoke ioctlsocket, dword ptr [s], FIONBIO, addr dwVal
    mov remoteAddr.sin_family, AF_INET
    mov EAX, socks4Request.dwDestIp
    mov remoteAddr.sin_addr, EAX
    mov AX, socks4Request.wDestPort
    mov remoteAddr.sin_port, AX
    invoke socket, AF_INET, SOCK_STREAM, 0h
    mov tunnelSock, EAX
    invoke connect, dword ptr [tunnelSock], addr remoteAddr, sizeof remoteAddr
    cmp EAX, SOCKET_ERROR
    jz @ret
    mov socks4Response.ucCommand, 90d
    mov socks4Response.ucVersion, 0h
    invoke send, dword ptr [s], addr socks4Response, sizeof socks4Response, 0h
    cmp EAX, SOCKET_ERROR
    jz @ret
    mov dwVal, 0h
    invoke ioctlsocket, dword ptr [s], FIONBIO, addr dwVal
    invoke ioctlsocket, dword ptr [tunnelSock], FIONBIO, addr dwVal
    invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, 65535d
    mov hMemory, EAX
    invoke GlobalLock, hMemory
    mov pMemory, EAX
    mov tv.tv_sec, 2h
    @while_label:
    mov fds_read.fd_count, 0h
    mov EAX, dword ptr [s]
    mov fds_read.fd_array, EAX
    inc fds_read.fd_count
    mov EAX, dword ptr [tunnelSock]
    mov dword ptr [fds_read.fd_array + 4h], EAX
    inc fds_read.fd_count
    invoke select, 0, addr fds_read, NULL, NULL, addr tv
    cmp EAX, 0h
    jng @ret
    invoke __WSAFDIsSet, dword ptr [s], addr fds_read
    cmp EAX, TRUE
    jnz @next
    invoke recv, dword ptr [s], pMemory, sizeof pMemory, MSG_PEEK
    cmp EAX, 0h
    jz @ret
    invoke recv, dword ptr [s], pMemory, sizeof pMemory, 0h
    cmp EAX, SOCKET_ERROR
    jz @ret
    jng @ret
    invoke send, dword ptr [tunnelSock], pMemory, sizeof pMemory, 0
    
    @next:
    invoke __WSAFDIsSet, dword ptr [tunnelSock], addr fds_read
    cmp EAX, TRUE
    jnz @jmp
    invoke recv, dword ptr [tunnelSock], pMemory, sizeof pMemory, MSG_PEEK
    cmp EAX, 0h
    jz @ret
    invoke recv, dword ptr [tunnelSock], pMemory, sizeof pMemory, 0h
    cmp EAX, SOCKET_ERROR
    jz @ret
    jng @ret
    invoke send, dword ptr [s], pMemory, sizeof pMemory, 0
    
    @jmp:
    jmp @while_label
    @ret:
    
    invoke GlobalUnlock, pMemory
    invoke GlobalFree, hMemory
    
    ;invoke shutdown, dword ptr [s], 2h
    invoke closesocket, dword ptr [s]
    ;invoke shutdown, dword ptr [tunnelSock], 2h
    invoke closesocket, dword ptr [tunnelSock]
    ret
    SocksHandlerThreadProc endp
    
    FlushRecvBufferUntil proc s : SOCKET
    invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, 1d
    mov hMemoryff, EAX
    invoke GlobalLock, hMemoryff
    mov pMemoryff, EAX
    
    @start_FlushRecvBufferUntil:
    invoke recv, s, pMemoryff, 1, 0h
    cmp pMemoryff, 0h
    jz @ret
    cmp EAX, SOCKET_ERROR
    jz @ret
    cmp EAX, 0h
    jz @ret
    jmp @start_FlushRecvBufferUntil
    
    @ret:
    
    invoke GlobalUnlock, pMemoryff
    invoke GlobalFree, hMemoryff
    
    ret
    FlushRecvBufferUntil endp
    end start
    
     
    1 person likes this.
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    дододо а тебе не кажется что ты настолько хотел спать что уже сам не помнишь что на самом деле просто тупо переписал исходник gorl'а с диска журнала "хакер" - у тебя даже названия ф-ий те же
     
  3. zl0y

    zl0y Banned

    Joined:
    13 Sep 2006
    Messages:
    371
    Likes Received:
    270
    Reputations:
    109
    До до ,для начала почитай словарь русского языка :\ копирайты он поставил,так что все нормально а ты отличился незнанием русского языка :mad: