Underc0de

Programación General => C# - VB.NET => Mensaje iniciado por: fudmario en Septiembre 16, 2015, 12:01:51 PM

Título: [Function] Adf.ly Decode by fudmario[vb.net]
Publicado por: fudmario en Septiembre 16, 2015, 12:01:51 PM
Código (vbnet) [Seleccionar]

   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) [Seleccionar]
' ***********************************************************************
' 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

Título: Re:[Function]Adf.ly Decode by fudmario[vb.net]
Publicado por: BigBear en Septiembre 16, 2015, 06:14:41 PM
Hola estoy tratando de entender este codigo para tratar de traducirlo a Delphi :

Código (vbnet) [Seleccionar]

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) [Seleccionar]

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.
Título: Re:[Function]Adf.ly Decode by fudmario[vb.net]
Publicado por: fudmario en Septiembre 16, 2015, 08:03:46 PM
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://sitiooriginal.com/blal.html )
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.
      
      
      
Título: Re:[Function]Adf.ly Decode by fudmario[vb.net]
Publicado por: BigBear en Septiembre 16, 2015, 08:34:29 PM
te agradezo la explicacion Fudmario , espero tener tiempo para hacer esta traduccion aunque ahora estoy examenes.

Saludos y gracias por responder.
Título: Re:[Function] Adf.ly Decode by fudmario[vb.net]
Publicado por: perl en Diciembre 14, 2015, 03:21:01 PM
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!!
Título: Re:[Function] Adf.ly Decode by fudmario[vb.net]
Publicado por: Kr3L en Junio 22, 2016, 05:07:37 PM
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) [Seleccionar]
<?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$matchesPREG_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 == ) {
            
$left .= $ysmm[$i];
        } else {
            
$right $ysmm[$i] . $right;
        }
    }
    return 
substrbase64_decode$left $right ), );
}

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: Skizzerz (http://skizzerz.net/scripts/adfly.php)

Saludos :)