[Function] Adf.ly Decode by fudmario[vb.net]

Iniciado por fudmario, Septiembre 16, 2015, 12:01:51 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 16, 2015, 12:01:51 PM Ultima modificación: Noviembre 08, 2015, 04:06:18 PM por Expermicid
Código: vbnet

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = AdflyUrlDecode("http://adf.ly/1NfMkS")
       
    End Sub

' Return: https://itunes.apple.com/us/app/game-of-thrones-ascent/id799145075



Código: vbnet
' ***********************************************************************
' Author           : fudmario
' Created          : 09-15-2015
'
' Last Modified By : fudmario
' Last Modified On : 09-16-2015
' ***********************************************************************
' <copyright file="Adfly_Decode.vb" company="fudmarioDev">
'     Copyright (c) fudmarioDev. All rights reserved.
' </copyright>
' <summary></summary>
' ***********************************************************************
Imports System.IO
Imports System.Net
Imports System.Text
Module AdflyDecode
    ''' <summary>
    '''     Decodifica una Url de Adf.ly.
    ''' </summary>
    ''' <param name="url">URL a decodificar.</param>
    ''' <returns>Retorna la Url Decodificada.</returns>
    Public Function AdflyUrlDecode(url As String) As String
        Try
            Dim sb As New StringBuilder
            Dim data As String = GetSource(url:=url)
            Dim rt As String() = {"ysmm = '", "'"c}
            Dim a As Integer = data.IndexOf(rt(0), StringComparison.Ordinal) + rt(0).Length + 1
            Dim b As Integer = data.Substring(a).IndexOf(rt(1), StringComparison.Ordinal) + 1
            Dim s As String = Mid(data, a, b)
            For i = 0 To s.Length - 1 Step 2
                sb.Append(s(i))
            Next
            For k = s.Length - 1 To 0 Step -2
                sb.Append(s(k))
            Next
            Return Encoding.ASCII.GetString(Convert.FromBase64String(sb.ToString())).Substring(2)
        Catch ex As Exception
            Return String.Empty
        End Try
    End Function

    ''' <summary>
    '''     Obtiene el Código Fuente de una Url.
    ''' </summary>
    ''' <param name="url">Url.</param>
    ''' <returns>Retorna el código fuente de una Url.</returns>
    Private Function GetSource(url As String) As String
        Try
            Return New StreamReader(WebRequest.Create(url).GetResponse().GetResponseStream()).ReadToEnd()
        Catch ex As Exception
            Return String.Empty
        End Try
    End Function
End Module




Septiembre 16, 2015, 06:14:41 PM #1 Ultima modificación: Septiembre 16, 2015, 06:16:43 PM por Doddy
Hola estoy tratando de entender este codigo para tratar de traducirlo a Delphi :

Código: vbnet

For i = 0 To s.Length - 1 Step 2
  sb.Append(s(i))
Next
For k = s.Length - 1 To 0 Step -2
  sb.Append(s(k))
Next


Mi pregunta es , ¿ que trata de hacer el autor en ese codigo ? ¿ leer al reves la variable "sb" ? ¿ para que sirve step ?

Otra parte es :

Código: vbnet

Return Encoding.ASCII.GetString(Convert.FromBase64String(sb.ToString())).Substring(2)


¿ Para que sirve Encoding.ASCII.GetString ? ¿ Para decodificar un ASCII a texto normal ? ¿ Que hace SubString(2) en la variable ?

Solo son esas dudas espero no molestar.

Que es lo que hace esta funcion es:

Primero descarga el codigo fuente de una url y lo almacena en la variable "data"
Luego obtiene el valor que esta entre "ysmm = '" y "'"
por ejemplo si fuese el resultado asi: "HoOmLoAc"
recorremos cada letra saltando de 2 en dos comenzado con la H,O,L,A
y luego lo hacemos de manera inversa comenzamos del final hasta la penultima letra c,o,m,o

y luego el resultado es H,O,L,A,c,o,m,o->HOLAcomo
y luego lo decodificamos en base64 (el resultado real que obtenemos  será  de la forma 64http:No tienes permitido ver los links. Registrarse o Entrar a mi cuenta )
omitimos las 2 primeras letras y Listo URL Decodificada.



Ahora respecto a tus dudas:
Al principio Inicializamos una nueva instancia de la clase System.Text.StringBuilder.
Dim sb as New StringBuilder
Con el For recorremos cada letra  desde 0 hasta la longitud de la cadena que obtuvimos aumentado de dos en dos.
y con el sb.Append(s(i))  lo que hace es: Anexar a sb la representación en forma de cadena del carácter Unicode especificado.
tomando el ejemplo anterior: comienza con H luego le anexa la siguiente que seria O es decir HO->HOL y asi sucesivamente hasta llegar a :"HOLA"

y luego lo hacemos de manera inversa del final a el inicio primero "c" luego "co"->"com"->"como" seguimos anexando a la misma instancia que inicializamos.

con respecto a : Encoding.ASCII.GetString(bytes() As Byte), que mejor que la definicion que nos da:
    ' Resumen:
        '     Cuando se reemplaza en una clase derivada, descodifica todos los bytes de la
        '     matriz de bytes especificada en una cadena.
        '
        ' Parámetros:
        '   bytes:
        '     Matriz de bytes que contiene la secuencia de bytes que se va a descodificar(en este caso la que obtendremos de Convert.FromBase64String(sb.ToString())).
        '
        ' Devuelve:
        '     Cadena que contiene el resultado de la descodificación de la secuencia de bytes
        '     especificada.
   
      
Y Substring(2)

     Lo que hace es empezar en una posición de caracteres especificada(en este caso 2, será la Posición  inicial.) y continúa hasta el final de la cadena.
      
      
      



te agradezo la explicacion Fudmario , espero tener tiempo para hacer esta traduccion aunque ahora estoy examenes.

Saludos y gracias por responder.

buenas, gracias por el aporte y por la explicación , nunca hubiera adivinado que las letras estaban entrelazadas pares e impares y codificada en base64... eres una maquina!! Saludos y gracias por ayudar a los que empezamos!!

Me gustó, gracias por compartirlo y por tu explicación. Como soy nuevo me puse a buscar en internet y tambien me tope con el mismo script pero en lenguaje PHP, aqui se los comparto.

Código: php
<?php

function request( $url ) {
    $ua = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1712.4 Safari/537.36';
    if ( !preg_match( '/^[a-zA-Z0-9\/]+$/', $url ) )
        return false;

    $ch = curl_init();
    curl_setopt_array( $ch, array(
        CURLOPT_FAILONERROR => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_USERAGENT => $ua,
        CURLOPT_URL => 'http://adf.ly/' . $url
    ) );
    $data = curl_exec( $ch );
    curl_close( $ch );

    if ( preg_match( "#var ysmm = '([a-zA-Z0-9+/=]+)'#", $data, $matches ) ) {
        $final = $url = decode( $matches[1] );
        // check for redirects
        $ch = curl_init();
        curl_setopt_array( $ch, array(
            CURLOPT_FAILONERROR => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_NOBODY => true,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_USERAGENT => $ua,
            CURLOPT_URL => $url
        ) );
        $data = curl_exec( $ch );
        if ( preg_match_all( '/Location:\s*(.+)\s*$/im', $data, $matches, PREG_SET_ORDER ) ) {
            $last = array_pop( $matches );
            $final = trim( $last[1] );
        }

        return array( $url, $final );
    }

    return false;
}

function decode( $ysmm ) {
    $left = '';
    $right = '';
    for ( $i = 0; $i < strlen( $ysmm ); $i++ ) {
        if ( $i % 2 == 0 ) {
            $left .= $ysmm[$i];
        } else {
            $right = $ysmm[$i] . $right;
        }
    }
    return substr( base64_decode( $left . $right ), 2 );
}

if ( isset( $_GET['url'] ) && $_GET['url'] ) {
    // strip out beginning (everything up to last slash)
    $stripped = '';
    $slashes = explode( '/', $_GET['url'] );
    $stripped = array_pop( $slashes );

    list( $url, $final ) = request( $stripped );
    if ( $url ) {
        echo '<p>Your URL is <a href="' . $url . '">' . $url . '</a>';
        if ( $url != $final ) {
            echo ' (<a href="' . $final . '">' . $final . '</a>)';
        }
        echo '</p>';
    } else {
        // try 2 parts
        $stripped = array_pop( $slashes ) . '/' . $stripped;
        list( $url, $final ) = request( $stripped );
        if ( $url ) {
            echo '<p>Your URL is <a href="' . $url . '">' . $url . '</a>';
            if ( $url != $final ) {
                echo ' (<a href="' . $final . '">' . $final . '</a>)';
            }
            echo '</p>';
        } else {
            echo '<p>Adf.ly URL not found</p>';
        }
    }
}
?>


Fuente: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos :)
Hola, soy Kr3L !