PHP Forum - Coding Board
Juni 18, 2018, 02:34:36 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: [MASM] SOCKS4 Server  (Gelesen 132 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
CorVu5
Newbie
*
Beiträge: 32



Profil anzeigen E-Mail
« am: März 15, 2009, 12:35:16 »

War zum verbessern meiner ASM-skills gedacht.
Benutzt viel MASM-spezifischen Lamer code Zwinkernd

socks4.inc:
Code:
.586
.MODEL flat, stdcall

OPTION CASEMAP:NONE   ;Case sensitive

Include windows.inc
Include kernel32.inc
Include masm32.inc
include wsock32.inc

IncludeLib kernel32.lib
IncludeLib masm32.lib
includelib wsock32.lib

SOCKS4_REQUEST Struct
    ucVersion  byte ?
    ucCommand  byte ?
    wDestport  word ?
    dwDestIp   dword ?
SOCKS4_REQUEST EndS


Main        PROTO
;;macros
Print_Text Macro txt:REQ ;;note txt is not a pointer
    Invoke StdOut,ADDR txt
EndM


.DATA
SOCKS_PORT DWord 8080
;;;;;;;;;;;;;;;;;;;;;
welcome    DB "Welcome to the socks4 server by Hamtaro aka CorVu5: ",13,10, 0
endmsg    DB "socks4 quitted",0
connection DB "SOCKS4 connection attempt!",13,10,"---------------------------",13,10,0
senderror    DB "Send error occured!",13,10,"---------------------------",13,10,0
recverror    DB "Recv error occured!",13,10,"---------------------------",13,10,0
concon    DB "Connection etablished",13,10,"---------------------------",13,10,0
conclosed DB "Connection closed",13,10,"---------------------------",13,10,0
conrcv1    DB "Data recvd from Client",13,10,"---------------------------",13,10,0
conrcv2 DB "Data recvd from Tunnel",13,10,"---------------------------",13,10,0
errstr DB 100 DUP (?)
Socks4.asm
Code:
Include socks4.Inc

.CODE

Start:

  Invoke Main
  Invoke ExitProcess,0
SocksProc Proc lpParam : DWORD
    local recvsock : SOCKET
    local tunnelsock : SOCKET
    local tunneladdr_in : sockaddr_in
    local socks4req : SOCKS4_REQUEST
    local socks4answer : SOCKS4_REQUEST
    local buffer[4096] : BYTE
    local User[64]:byte
    local data : DWORD
    local set : fd_set
    local tv : timeval
    Print_Text concon
    mov eax,lpParam
    mov recvsock,eax
    invoke recv,recvsock,addr socks4req,sizeof socks4req,MSG_PEEK
    .if socks4req.ucVersion == 4        ;ist Socks4
        invoke recv,recvsock,addr socks4req,sizeof socks4req,0    ;socks4 struct abrufen
        invoke recv,recvsock,addr User,64,0                        ;User abrufen
        .if socks4req.ucCommand ==     1        ; Connection anfrage
            Print_Text connection
            ;;tunnelsocket einrichten
            invoke socket, PF_INET, SOCK_STREAM, 0
            .if eax == INVALID_SOCKET
                 jmp qquit
            .endif
            mov tunnelsock, eax
            mov eax, socks4req.dwDestIp
            mov tunneladdr_in.sin_addr, eax
            mov tunneladdr_in.sin_family, AF_INET
            mov ax, socks4req.wDestport
            mov tunneladdr_in.sin_port, ax
            invoke connect,tunnelsock,addr tunneladdr_in, sizeof tunneladdr_in
            .if eax == SOCKET_ERROR
                ;;SOCKS4 Antwort schicken (Misserfolg)
                  mov socks4req.ucVersion, 0
                  mov socks4req.ucCommand, 91
                  invoke send,recvsock,addr socks4req,sizeof SOCKS4_REQUEST,0
                  jmp qquit
              .endif
            ;;SOCKS4 Antwort schicken    (Erfolg)
            mov socks4req.ucVersion, 0
             mov socks4req.ucCommand, 90
            invoke send,recvsock,addr socks4req,sizeof SOCKS4_REQUEST,0
            .if eax == SOCKET_ERROR
                jmp qquit
            .endif
            ;;Ab jetzt alles tunneln was geht und kommt
            mov tv.tv_sec, 2
            .while 1
                ;WARTEN BIS WAS KOMMT
                mov set.fd_count,0
                mov eax,[recvsock]
                mov set.fd_array, eax
                inc set.fd_count
                mov eax,[tunnelsock]
                mov dword ptr [set.fd_array + 4], eax
                inc set.fd_count
                invoke select,0,addr set,0,0,addr tv
                .if eax == 0 || eax < 0
                    jmp qquit
                .endif
                invoke __WSAFDIsSet,tunnelsock,addr set
                .if eax == TRUE
                    ;WENN WAS VOM TUNNEL KOMMT
                    invoke recv,tunnelsock,addr buffer,sizeof buffer,MSG_PEEK
                    .if eax == 0
                        jmp qquit
                    .endif                    
                        Print_Text conrcv2
                        invoke recv,tunnelsock,addr buffer,sizeof buffer,0
    ;                    Print_Text buffer
                        .if eax == 0    ;Connection ist geschlossen
                            jmp qquit
                        .endif
                        .if eax == SOCKET_ERROR    || eax < 0; SOCKET Error
                             Print_Text recverror
                             invoke WSAGetLastError
                             invoke dwtoa, eax,addr errstr
                             Print_Text errstr
                            jmp qquit
                        .endif
                        invoke send,recvsock,addr buffer,eax,0        ;Das empfangene Weitersenden
                        .if eax == SOCKET_ERROR    ; SOCKET Error
                             Print_Text senderror
                            jmp qquit
                        .endif
                 .endif
                invoke __WSAFDIsSet,recvsock,addr set
                .if eax == TRUE
                       ;WENN WAS VOM CLIENT KOMMT
                    invoke recv,recvsock,addr buffer,sizeof buffer,MSG_PEEK
                    .if eax == 0
                        jmp qquit
                    .endif                    
                          Print_Text conrcv1            
                        invoke recv,recvsock,addr buffer,sizeof buffer,0
                        .if eax == 0    ;Connection ist geschlossen
                             ;Print_Text error
                            jmp qquit
                        .endif
                        .if eax == SOCKET_ERROR || eax < 0 ;SOCKET Error
                             Print_Text recverror
                             invoke WSAGetLastError
                             invoke dwtoa, eax,addr errstr
                             Print_Text errstr
                            jmp qquit
                        .endif
                        invoke send,tunnelsock,addr buffer,eax,0        ;Das empfangene Weitersenden
                        .if eax == SOCKET_ERROR    ; SOCKET Error
                             Print_Text senderror
                            jmp qquit
                        .endif    
                .endif
                   ;ZzZzZZZzZ              
                invoke Sleep,50            
            .endw
        .endif
    .endif
    qquit::
    Print_Text conclosed
    invoke closesocket,recvsock
    invoke closesocket,tunnelsock
    Ret
SocksProc EndP
StartSocks Proc dwPort : Dword
    local WsaData : WSADATA
    local sock       : SOCKET
    local socks4  : sockaddr_in
    local client  : sockaddr
    invoke WSAStartup,101h, addr WsaData
    invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
    .if eax == SOCKET_ERROR
        jmp quit
    .endif
    mov sock,eax
    mov socks4.sin_family, AF_INET
    invoke htons, SOCKS_PORT
    mov socks4.sin_port, ax
    xor eax, eax
    mov socks4.sin_addr, eax
    invoke bind,sock,addr socks4, sizeof socks4
    .if eax == SOCKET_ERROR
        jmp quit
    .endif
    invoke listen,sock,SOMAXCONN
    .if eax == SOCKET_ERROR
        jmp quit
    .endif
    .while 1
        wait4connect::
        invoke accept,sock,addr client,0
        .if eax == SOCKET_ERROR
            jmp wait4connect
        .endif
        invoke CreateThread,0,0,addr SocksProc,eax,0,0
        Invoke Sleep,100
    .endw
    quit::
    Print_Text endmsg
    invoke WSACleanup
    Ret
StartSocks EndP
Main Proc
    Print_Text welcome
    ;;
    invoke StartSocks, SOCKS_PORT
    ;;
    RET
Main EndP

End Start
Gespeichert
Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS