2010-11-08 22 views
5

Estoy tratando de encontrar el hash de información codificada en la URL correcta para enviar al rastreador y obtener la lista de pares.Analizando un archivo torrent - información hash. (Erlang)

Para probar, intenté analizar el torrente en this url.

vez abierto el archivo, cortar manualmente el diccionario información pieza y SHA1 hash su valor consigo este valor binario:

< < 84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 139,202,167,163,54 >>

La cadena ASCII recuperada de este último valor binario es 788f590f28a799cc1009a9b780b649fd6f0a2e91, y es el mismo valor mencionado en el sitio.

Asumamos que todo está correcto hasta ahora (¿no?).

Después de codificar el valor binario utilizando la función de codificación URL a continuación consigo T% 7c% 0f% ff% 9b% ab% 9c% a8% 5b.% Cc% 18% f9tn% 8b% ca% a7% a36, que ni siquiera está cerca del valor de urlencoded correcto que debo enviar al rastreador. (Recibo un mensaje de error no encontrado cuando envío esto al rastreador, además, no coincide con el valor que veo utilizando wireshark que es x% 8fY% 0f% 28% a7% 99% cc% 10% 09% a9 % b7% 80% b6I% fdo% 0a.% 91).

La función de codificación URL que estoy usando:

encode(<<Bin:20/binary-unit:8>>)-> 
    %io:format("~p~n", [binary_to_list(Bin)]), 
    encode(binary_to_list(Bin)); 
encode(List) -> do_encode(List). 

do_encode([])-> []; 
do_encode([H|T]) when H>=$a, H=<$z -> 
    [H| encode(T)]; 
do_encode([H|T]) when H>=$A, H=<$Z -> 
    [H| encode(T)]; 
do_encode([H|T]) when H>=$0, H=<$9 -> 
    [H| encode(T)]; 
do_encode([H|T]) when H==$- -> 
    [H| encode(T)]; 
do_encode([H|T]) when H==$. -> 
    [H|do_encode(T)]; 
do_encode([H|T]) when H==$* -> 
    [H|do_encode(T)]; 
do_encode([H|T]) -> 
    to_hex(H) ++ encode(T). 

hex(N) when N < 10 -> 
    $0+N; 
hex(N) when N >= 10, N < 16 -> 
    $a+(N-10). 
to_hex(N) when N < 256 -> 
    [$%, hex(N div 16), hex(N rem 16)]. 

es la función por encima de mal? Soy una especie de novato en lo que respecta al manejo de datos brutos. así que ayuda/ideas son muy apreciadas! ¡Gracias!

Respuesta

1

Tenga en cuenta que la codificación URL ya está disponible en erlang (aunque bien oculta).

1> B = <<84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 139,202,167,163,54>>. 
<<84,124,15,255,155,171,156,168,91,46,204,24,249,116,110, 
2> L = erlang:binary_to_list(B). 
[84,124,15,255,155,171,156,168,91,46,204,24,249,116,110,139, 
202,167,163,54] 
3> edoc_lib:escape_uri(L). 
"T%7c%f%c3%bf%c2%9b%c2%ab%c2%9c%c2%a8%5b.%c3%8c%18%c3%b9tn%c2%8b%c3%8a%c2%a7%c2%a36" 

Produce el mismo resultado que el tuyo.

+0

He intentado usar escape_uri() que dio un resultado diferente al que "uTorrent" envía al rastreador, así que traté de implementar el mío para ver si podía obtener el valor correcto. si esta es la codificación correcta del binario dado, ¿cómo es que el valor que se envía al rastreador es diferente? – Smokie

1

Su problema no es con su codificador sino con su conjetura inicial sobre los datos. La cuerda que tenemos es "788f590f28a799cc1009a9b780b649fd6f0a2e91", por lo que escribir un poco de código Erlang para convertir esto a su representación binaria como una lista:

part([]) -> []; 
part([U,L | R]) -> 
    [{list_to_integer([U], 16), 
     list_to_integer([L], 16)} | part(R)]. 

Ahora, pidiendo en una pronta da:

([email protected])16> etorrent_utils:build_encoded_form_rfc1738([U*16+L || {U,L} <- foo:part("788f590f28a799cc1009a9b780b649fd6f0a2e91")]). 
"x%8FY%0F%28%A7%99%CC%10%09%A9%B7%80%B6I%FDo%0A.%91" 

Coincidiendo con lo esperado. Debe verificar que su selección manual del infohash y su cálculo SHA1 funcione como espera que funcione. Debido a que su binario SHA1 no coincide.

Cuestiones relacionadas