elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  [Codigo] Pequeño Servidor HTTP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Codigo] Pequeño Servidor HTTP  (Leído 3,502 veces)
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
[Codigo] Pequeño Servidor HTTP
« en: 3 Diciembre 2011, 22:29 pm »

Código
  1. ;modificar szRoot para indicar la ubicacion del servidor, default C:\Server
  2. ;msvcrt no viene en el paquete de fasm, la crean con la utilidad dll2inc
  3. ;o hacen los include a mano^^
  4. format PE Console
  5. entry start
  6.  
  7. include '%fasminc%/win32a.inc'
  8. include '%fasminc%/macro/if.inc'
  9.  
  10. MAX_QUEUE   equ 100     ;max namber of pending connections
  11. BUFFER_SIZE equ 2048    ;max size of the header sent by the client
  12. MAX_URL_SIZE equ 1024   ;max size of url in the header send
  13. SHOW_DETAILED_MSG equ TRUE ;set TRUE if want to see the full client message
  14.  
  15. section '.data' data readable writeable
  16.    wsa     WSADATA
  17.    port    dd 80
  18.  
  19.    szPause db "PAUSE",0
  20.    h404    db "HTTP/1.1 404 Not Found",13,10,"Server: EnkoHttpServer 1.0.0.0 ",13,10,13,10,"<HTML><BODY>404 Not Found</BODY></HTML>",13,10
  21.    .size = $ - h404
  22.    h200    db "HTTP/1.1 200 OK",13,10,"Server: EnkoHttpServer 1.0.0.0 ",13,10,"Allow: GET",13,10,13,10
  23.    .size = $ - h200
  24.    szRoot      db "C:\Server",0
  25.    szSlashes   db '/\',0
  26.    szSlash     db '\',0
  27.    szTockens   db " ",13,10,0
  28.    szError     db "ERROR: %i",13,10,0
  29.    szDot       db ".",0
  30.    szFileNotExists db "File Not Exists",13,10,0
  31.    szInt       db "%i",0
  32.    szFile      db "FILE: %s",13,10,0
  33.    szClient    db "Client IP: %s",13,10,0
  34.    szRequest   db "REQUEST: %s",13,10,0
  35.    szStatus    db "STATUS: %s",13,10,0
  36.    szString    db "%s",0
  37.    szEndLine   db 13,10,0
  38.    .size = $ - szEndLine
  39.    szBr        db "<br>",0
  40.    szIndex     db "index.html",0
  41.    szFileSent    db "File Sent ok",13,10,0
  42.    .size = $ - szBr
  43.    wSocketVersion dd 0x0101
  44.    transmiteBuffer dd h200,h200.size,NULL,NULL
  45.    thread  dd ?    
  46.    peer    dd ?
  47.    peerAddr sockaddr_in
  48.    sizePeerAddr dd sizeof.sockaddr_in
  49.    sock     dd ?
  50.    sock_addr   sockaddr_in
  51.    szBuffer db 32 dup ?
  52.    szIp     db 16 dup ?
  53.  
  54.  
  55. section '.code' code readable executable
  56. start:
  57.    ;inicializacion socket
  58.    invoke  WSAStartup, [wSocketVersion], wsa    
  59.    invoke  socket,AF_INET,SOCK_STREAM,NULL
  60.    mov     [sock],eax    
  61.    mov     [sock_addr.sin_family], AF_INET
  62.    invoke  htons,[port]
  63.    mov     [sock_addr.sin_port],ax    
  64.    mov     [sock_addr.sin_addr],NULL
  65.    invoke  bind, [sock], sock_addr,sizeof.sockaddr_in
  66.    .if eax <> 0
  67.        invoke  WSAGetLastError
  68.        cinvoke printf, szError, eax        
  69.    .endif    
  70.    invoke listen, [sock],MAX_QUEUE
  71.    ;activamos la escucha del socket
  72. accepted:
  73.    invoke accept, [sock],peerAddr,sizePeerAddr
  74.    mov     [peer],eax  
  75.    stdcall ipToString,[peerAddr.sin_addr],szIp
  76.    cinvoke printf, szClient,szIp
  77.    ;nuevo hilo para cada conexion
  78.    invoke CreateThread, NULL,NULL, resolveConnection,[peer],NULL,NULL
  79.    ;o mejor la funcion de abajo, ayudaria a la estabilidad y contra ataques DOS
  80.    ;invoke QueueUserWorkItem, resolveConnection, [peer], NULL ;WT_EXECUTEDEFAUL
  81.    jmp     accepted
  82.    invoke  ExitProcess,0
  83.  
  84. ;hilo que resuelve las peticiones
  85. proc resolveConnection, lpParam
  86. local lpeer: DWORD, lbuffer: DWORD, lurl: DWORD, lfile: DWORD  
  87.    mov     eax, [lpParam] Dermatoesqueleto    mov     [lpeer],eax
  88.    cinvoke malloc, BUFFER_SIZE
  89.    mov     [lbuffer],eax
  90.    invoke  recv, [lpeer],[lbuffer],BUFFER_SIZE,0  
  91.    ;vemos si hay un mensaje en el buffer y continuamos
  92.    .if eax <> 0    
  93.        mov ebx,[lbuffer]
  94.        mov byte [ebx+eax],0
  95.        .if SHOW_DETAILED_MSG
  96.            cinvoke printf,szRequest, [lbuffer]    
  97.        .endif
  98.        cinvoke strtok, [lbuffer], szTockens
  99.        .if eax <> 0  
  100.            ;solamente respondemos al mensaje GET
  101.            .if dword[eax] = "GET"          
  102.                ;url sring allocation
  103.                ;buscamos la url en la peticion GET
  104.                ;solamente las peticiones que terminan con alguna extensión
  105.                cinvoke malloc, MAX_URL_SIZE
  106.                mov    [lurl],eax
  107.                cinvoke strcpy, [lurl],szRoot
  108.                cinvoke strtok, NULL, szTockens
  109.                cinvoke strcat,[lurl],eax  
  110.                mov     ebx,eax      
  111.                cinvoke strlen, eax
  112.                mov edx,eax
  113.                dec edx
  114.                .repeat  
  115.                    dec eax
  116.                    cmp byte[ebx+eax],"/"
  117.                    .if ZERO?
  118.                        mov byte[ebx+eax],"\"
  119.                    .endif                    
  120.                .until eax = 0
  121.                .if byte[ebx+edx] = "\"
  122.                    cinvoke strcat,[lurl],szIndex
  123.                .endif
  124.                cinvoke printf, szFile, [lurl]
  125.                ;ya tenemos el nombre del archivo, ahora lo abrimos desde el disco
  126.                invoke  CreateFile,[lurl],GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0
  127.                ;si el archivo existe, lo enviamos
  128.                .if eax <> INVALID_HANDLE_VALUE  
  129.                    mov [lfile],eax            
  130.                    invoke  GetFileSize, [lfile],NULL
  131.                    invoke  TransmitFile, [lpeer],[lfile],eax,NULL,NULL,transmiteBuffer,NULL  
  132.                    .if eax
  133.                        ;escribimos en la consola el detalle
  134.                        cinvoke printf, szStatus, szFileSent
  135.                    .endif
  136.                    invoke  CloseHandle, [lfile]
  137.                .else
  138.                    ;no existe el archivo, error 404
  139.                    cinvoke printf, szStatus, szFileNotExists                    
  140.                    invoke  send, [lpeer], h404, h404.size, 0                
  141.                .endif
  142.                cinvoke free, [lurl]
  143.            .endif
  144.        .endif
  145.    .endif
  146.    .exit:
  147.    cinvoke free, [lbuffer]
  148.    invoke  CloseHandle, [lpeer]
  149.    invoke  ExitThread
  150.    ret
  151. endp
  152.  
  153. ;convertimos DWORD ip  a una cadena
  154. proc ipToString, ip, string
  155. local buffer: DWORD
  156.    mov ebx, [ip]
  157.    mov esi,4
  158.    mov eax,[string]
  159.    mov byte [eax],0
  160.    .repeat
  161.        xor     eax,eax
  162.        mov     al,bl
  163.        cinvoke sprintf,[buffer],szInt,eax
  164.        cinvoke strcat,[string],[buffer]
  165.        cinvoke strcat,[string],szDot
  166.        shr ebx,8
  167.        dec esi
  168.    .until esi=0
  169.    cinvoke strlen, [string]
  170.    mov ebx, [string]
  171.    mov byte[ebx+eax-1],0
  172.    mov byte[buffer],0
  173.    ret
  174. endp
  175. section '.idata' import data readable writeable
  176.  
  177. library kernel32,'KERNEL32.DLL',\
  178.        user32,'USER32.DLL',\
  179.        msvcrt,'msvcrt.dll',\
  180.        wsock32, 'WSOCK32.DLL'
  181.  
  182. include '%fasminc%\api\kernel32.inc'
  183. include '%fasminc%\api\user32.inc'
  184. include '%fasminc%\api\msvcrt.inc'
  185. include '%fasminc%\api\wsock32.inc'
  186.  

El codigo funciona bastante bien. Si la url es complicada es probable que no la pueda resolver. En canto a saturacion o DDOS, sumamente susceptible.

Screenshot
http://i41.tinypic.com/5lxyfk.png

hay una duda que tengo:
Si se usa  CreateThreade es necesario usar ExitThread... hasta ahi bien.

Ahora, si se  usa QueueUserWorkItem, ¿Hace falta?
en la msdn no especifica, hice la prueba y aparentemente no. Ya que si se usa, en una prueba rapida se nota que deja de funcionar la segunda vez que se llama.

Saludos.


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.789


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Codigo] Pequeño Servidor HTTP
« Respuesta #1 en: 5 Diciembre 2011, 21:20 pm »

Si llama a ExitThread terminas el hilo trabajador ese, mala idea. Lo ideal es que nunca llames a esa funcion, con retornar es suficiente (fijate que codigo se ejecuta justo despues cuando retornas de un hilo creado con CreateThread).


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: [Codigo] Pequeño Servidor HTTP
« Respuesta #2 en: 5 Diciembre 2011, 23:20 pm »

Hola, la idea es que no es un hilo solo.

Es decir, para cada conexion nueva, se genera un hilo nuevo. Y cuando se desconecta el usuario, creo que tendria que terminar el hilo.

la tecnica es super saturable. 100 peticiones equivaldrian a 100 hilos.

Por eso creo que cada vez que el hilo hace su trabajo, deberia terminarlo.
(Hilo creado con CreateThread)

Citar
Si llama a ExitThread terminas el hilo trabajador ese, mala idea.
con usar ret, el hilo es eliminado?
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.789


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Codigo] Pequeño Servidor HTTP
« Respuesta #3 en: 5 Diciembre 2011, 23:29 pm »

Con hilo trabajador me refiero al que procesa el work item que encolas con QueueUserWorkItem (Queues a work item to a worker thread in the thread pool), el punto es que el hilo trabajador no lo creaste vos y tampoco lo tenes que terminar (un hilo trabajador de estos es, simplificando, un bucle esperando a que haya un work item en la cola para llamar al  LPTHREAD_START_ROUTINE del mismo y continuar el bucle en cuanto este retorne). Con usar ret le devolves el control al hilo trabajador y su bucle, en el caso de un hilo creado con CreateThread la funcion a la que retornas llama a ExitThread inmediatamente. Es asi:

Código
  1. kernel32!BaseThreadInitThunk:
  2. 755c3388 8bff            mov     edi,edi
  3. 755c338a 55              push    ebp
  4. 755c338b 8bec            mov     ebp,esp
  5. 755c338d 85c9            test    ecx,ecx
  6. 755c338f 0f85752e0000    jne     kernel32!BaseThreadInitThunk+0x15 (755c620a)
  7. 755c3395 ff7508          push    dword ptr [ebp+8]
  8. 755c3398 ffd2            call    edx ;el LPTHREAD_START_ROUTINE
  9. 755c339a 50              push    eax
  10. 755c339b ff1504075c75    call    dword ptr [kernel32!_imp__RtlExitUserThread (755c0704)] ds:002b:755c0704={ntdll!RtlExitUserThread (77e2d598)}
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: [Codigo] Pequeño Servidor HTTP
« Respuesta #4 en: 5 Diciembre 2011, 23:38 pm »

A... no habia entendido "hilo trabajador"....

QueueUserWorkItem, solo se usa RET. Confirmado :)


Gracias Nuevamente.
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.789


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Codigo] Pequeño Servidor HTTP
« Respuesta #5 en: 5 Diciembre 2011, 23:41 pm »

De nadas  :)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Servidor FTP y HTTP « 1 2 »
Programación Visual Basic
RED_HORSE 12 3,543 Último mensaje 3 Abril 2006, 18:11 pm
por RED_HORSE
Le podeis echar un ojo a este codigo??. Es un codigo pequeño y facil. « 1 2 »
PHP
70N1 10 5,209 Último mensaje 19 Febrero 2010, 18:14 pm
por 70N1
NAS como servidor HTTP
Hardware
Dracomega 5 8,510 Último mensaje 9 Mayo 2011, 18:36 pm
por T0rete
duda servidor http y ftp
Redes
Siempre Azul 6 1,730 Último mensaje 3 Julio 2014, 02:57 am
por Gh057
Versiones http de un servidor
Java
NaSaRiD15 0 870 Último mensaje 3 Octubre 2016, 14:56 pm
por NaSaRiD15
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines