Mostrando entradas con la etiqueta android. Mostrar todas las entradas
Mostrando entradas con la etiqueta android. Mostrar todas las entradas

Jugando con el GPS del celular (Android) con Python

La mayoría de los celulares actuales integran GPS, siendo este poco utilizado/aprovechado para los usuarios que desconocen todas las ventajas que podría tener el utilizar esta característica de sus celulares.

Primero que nada...

¿Cómo leer los datos del GPS?

Existe algo llamado NMEA:

“NMEA 0183 (o NMEA de forma abreviada) es una especificación combinada eléctrica y de datos entre aparatos electrónicos marinos y, también, más generalmente, receptores GPS.” Wikipedia

Me vino a la mente que “nmea” es por el león de Heracles, pero no lo puedo confirmar :P

En otras palabras, se pueden leer todos los datos del GPS en formato CVS (valor separado por coma), vamos a ver algunas cosas rápidas del estándar NMEA:

Satélites utilizados:
 $GPGSA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17><Checksum><CR><LF>

Siendo el 1 es la forma en la que está trabajando el GPS del celular:

Posibles valores:
M: Manual (Forzar a trabajar en 3D/2D)

A: Automático

El 2 es el modo 2:
1=No fijo, 2=2D, 3=3D

 

Del 3 al 14 ID's de satélites usados (valor numérico).
15 Position dilution of precision (PDOP)

16 Horizontal dilution of precision (HDOP)

17 Vertical dilution of precision (VDOP)

En fin, no tiene caso hacer una copia de los RFC que existen sobre este protocolo, por lo que vamos directamente al grano:

Para poder acceder a los datos del GPS en la PC (me parece más bonito y útil usar el GPS en la PC que en el celular) vamos a utilizar una herramienta llamada ShareGPS (que pueden encontrar en el Play Store) y adb (que viene en el SDK de android) o “adb lite” (google).

Iniciamos ShareGPS en el celular y en la configuración marcamos: “Use USB”

Ahora en adb vamos a redireccionar el puerto (sí, se puede redireccionar puertos del celular a la pc):
 Zer0-null:/home/xianur0 # adb forward tcp:50000 tcp:50000

Con esto el puerto 50000 del celular queda en el 50000 de nuestra máquina, probemos:
Zer0-null:/home/xianur0 # nc -vvv localhost 50000

nc: connect to localhost port 50000 (tcp) failed: Connection refused

Connection to localhost 50000 port [tcp/mrt] succeeded!

$GPGSV,4,1,16,01,,,,03,45,070,,04,,,,05,,,*4E

$GPGSV,4,2,16,06,27,054,,07,35,320,,08,13,293,,10,18,291,*7A

$GPGSV,4,3,16,11,11,151,,13,73,350,,16,20,036,,19,46,108,*7F

$GPGSV,4,4,16,20,13,185,,23,69,132,,28,12,233,,30,,,*44

[…]

Esos datos raros que pueden ser ahí es directamente los datos NMEA, ahora la cosa es bastante fácil, podemos conectarnos con python al puerto 50000 de localhost (también se podría a través de una red wifi, pero me gusta más esta forma).
 import socket,string

# -*- coding: utf-8 -*-

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('localhost', 50000))

 

while 1:

linea = s.recv(250)

print linea

 

Con esto haremos exactamente lo mismo que netcat, pero vamos un por más allá, recuerdan que dije que está en formato CVS todo?
            datos=string.split(linea,',')

 

Con esto ya tenemos cada valor de la linea en datos, ahora podemos analizarlo:
            try:

result = {

'$GPRMC': GPRMC ,

'$GPGSV': GPGSV

}[datos[0]](datos[1:])

except KeyError:

pass

 

Para los que no estén familiarizados con python, este no tiene swich como tal, entonces esta es mi versión de este.

Lo que hacemos con esto es llamar a cada una de esas funciones (GPRMC,GPGSV,GPGSA) cada vez que una linea tenga por ejemplo “$GPRMC” que llamaría a la función GPRMC , pasandole como argumento todos los elementos de datos excepto el primero (no tiene caso mandarle “$GPRMC ” por ejemplo xD)

Vamos a parsear el primero (GPRMC nos indica el estado de la conexión los satélites y los datos obtenidos de este):
def GPRMC (datos):

if datos[1] != 'V':

print "[-] Conectado con satelites!"

print "[-] Hora actual: "+datos[0][0:2]+":"+datos[0][2:4]+":"+datos[0][4:6]+" con "+datos[0][7:]+" milisegundos"

print "[-] Coordenadas actuales: ("+datos[2]+","+datos[4]+")"

print "[-] Latitud Hemisferio: "+datos[3]

print "[-] Longitud Hemisferio: "+datos[5]

print "[-] Velocidad actual: "+datos[6]+" nudos"

azimut=int(datos[7])

rumbo=''

if(azimut==0):

rumbo='Norte'

elif(azimut<90 and azimut > 0):

rumbo='Noreste'

elif(azimut==90):

rumbo='Este'

if(azimut>90 and azimut < 180):

rumbo='Sureste'

if(azimut==180):

rumbo='Sur'

if(azimut>180 and azimut<360):

rumbo='Suroeste'

if(azumit==360):

rumbo='Oeste'

print "[-] Rumbo: "+rumbo+" ("+datos[7]+" grados)"

print "[-] Fecha UTC: "+datos[8]

 

Azimut es una forma de medir la dirección hacia la cual vamos (rumbo) en grados:

0° sería el norte, 90 el Este, 180 el Sur y 360 el Oeste.

Nota de interés: La fecha UTC la genera el receptor GPS en base a la de los satélites que está utilizando.

Ahora va  GPGSV que nos da información sobre los satélites visibles
def GPGSV (datos):

print datos

print "\n[!] Información de satélites visibles: "

print "[-] Total Número de mensajes: "+datos[0]

print "[-] Número de mensaje: "+datos[1]

print "[-] Satélites visibles: "+datos[2]

c=0

for a in range(3):

print "[-] Satélite número: "+datos[3+c]

print "\t[-] Grados de elevación: "+datos[3+c+1]

print "\t[-] Asimut: "+datos[3+c+2]

print "\t[-] SNR: "+datos[3+c+3]+" dB-Hz"

c=c+4

 

Nota de interés:  SNR es la relación señal/ruido y en base a esta se puede calcular la calidad de enlace con el satélite.

Código completo.


 

import socket,string

# -*- coding: utf-8 -*-

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(('localhost', 50000))

 

def GPRMC (datos):

if datos[1] != 'V':

print "[!] Conectado con satelites!"

print "[-] Hora actual: "+datos[0][0:2]+":"+datos[0][2:4]+":"+datos[0][4:6]+" con "+datos[0][7:]+" milisegundos"

print "[-] Coordenadas actuales: ("+datos[2]+","+datos[4]+")"

print "[-] Latitud Hemisferio: "+datos[3]

print "[-] Longitud Hemisferio: "+datos[5]

print "[-] Velocidad actual: "+datos[6]+" nudos"

azimut=int(datos[7])

rumbo=''

if(azimut==0):

rumbo='Norte'

elif(azimut<90 and azimut > 0):

rumbo='Noreste'

elif(azimut==90):

rumbo='Este'

if(azimut>90 and azimut < 180):

rumbo='Sureste'

if(azimut==180):

rumbo='Sur'

if(azimut>180 and azimut<360):

rumbo='Suroeste'

if(azimut==360):

rumbo='Oeste'

print "[-] Rumbo: "+rumbo+" ("+datos[7]+" grados)"

print "[-] Fecha UTC: "+datos[8]

 

def GPGSV (datos):

print datos

print "\n[!] Información de satélites visibles: "

print "[-] Total Número de mensajes: "+datos[0]

print "[-] Número de mensaje: "+datos[1]

print "[-] Satélites visibles: "+datos[2]

c=0

for a in range(3):

print "[-] Satélite número: "+datos[3+c]

print "\t[-] Grados de elevación: "+datos[3+c+1]

print "\t[-] Asimut: "+datos[3+c+2]

print "\t[-] SNR: "+datos[3+c+3]+" dB-Hz"

c=c+4

 

 

while 1:

linea = s.recv(250)

if linea == '':

raise RuntimeError("socket connection broken")

datos=string.split(linea,',')

try:

result = {

'$GPRMC': GPRMC,

'$GPGSV': GPGSV

}[datos[0]](datos[1:])

except KeyError:

pass

By Xianur0
READMORE
 

Portando cualquier programa GNU/Linux a Android

Últimamente ha sonado mucho el “Ubuntu for android” que no es más que un port de ubuntu que corre sobre android (sí, no remplaza android, simplemente corre en un entorno chroot SOBRE android), pero aun queda esperar para probarlo, pero no somos de las personas que les guste esperar, además podemos asumir que no nos interesa tener la distro completa, solo ciertas herramientas que podemos utilizar para el pentesting.

La cosa es bastante simple, primero necesitamos bajar la iso de debian para ARMEL
 Zer0-null:/home/xianur0 # wget http://cdimage.debian.org/debian-cd/current/armel/iso-cd/debian-6.0.6-armel-xfce+lxde-CD-1.iso

Ya que tengamos ese iso, extraemos la carpeta pool (no nos interesa nadamás del iso) y utilizaremos la herramienta “Deb2Droid” para “instalar” cualquier programa en el android.

Nota: Podemos bajar archivos con extensión “.deb” de otros repositorios de debian, siempre y cuando sean para la arquitectura “armel”:

Por ejemplo tenemos este:
http://ftp.fr.debian.org/debian/pool/main

Para este caso bajaremos nmap:
 http://ftp.fr.debian.org/debian/pool/main/n/nmap/nmap_5.00-3_armel.deb

y lo meteremos dentro de pool/main/n/

Ahora con la herramienta “Deb2Droid” vamos a exportar nmap con todas sus dependencias:
 Zer0-null:/home/xianur0/debian-arm # perl export.pl

Deb2Droid v0.1 by Xianur0

Use: ./export.pl [pool dir] [deb]

Zer0-null:/home/xianur0/debian-arm/nmap # perl export.pl ../pool/main/ n/nmap_5.00-3_armel.deb

[...]

[-] Instaladas!

[-] Paquete y dependencias extraidos correctamente!

Llegados a este punto ya tendremos todo extraído en la carpeta actual (donde ejecutamos el export.pl).
Zer0-null:/home/xianur0/debian-arm/nmap # ls

bin  config  etc  export.pl  lib  sbin  selinux  shlibs  symbols  templates  usr  var

De este modo ya tendríamos listo nmap para correrlo en cualquier dispositivo android, el detalle hasta ahora es que... pesa mucho...
 Zer0-null:/home/xianur0/debian-arm/nmap # du -sh .

68M    .

Ahora la cosa es tomar solo lo que nos sirve:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x nmap  | grep NEEDED

NEEDED               libpcre.so.3

NEEDED               libpcap.so.0.8

NEEDED               libssl.so.0.9.8

NEEDED               libcrypto.so.0.9.8

NEEDED               liblua5.1.so.0

NEEDED               libdl.so.2

NEEDED               libstdc++.so.6

NEEDED               libm.so.6

NEEDED               libgcc_s.so.1

NEEDED               libc.so.6

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp nmap /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/lib

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libpcre.so.3 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libpcap.so.0.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libssl.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libcrypto.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/liblua5.1.so.0 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libdl.so.2 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libstdc++.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libm.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libgcc_s.so.1 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libc.so.6 /home/xianur0/nmap-final/lib/

Listo, ya tenemos nmap con todas sus dependencias reales en /home/xianur0/nmap-final

Pero ahora toca ver si alguna de sus dependencias tiene alguna dependencia sin cumplir (hacer recursivamente esto hasta tener todas las libs necesarias):
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x * | grep -i NEEDED | sort -n | uniq

NEEDED               libacl.so.1

NEEDED               libattr.so.1

NEEDED               libbz2.so.1.0

NEEDED               libcrypto.so.0.9.8

NEEDED               libcrypt.so.1

NEEDED               libc.so.6

NEEDED               libdl.so.2

NEEDED               libgcc_s.so.1

NEEDED               liblua5.1.so.0

NEEDED               liblzma.so.2

NEEDED               libm.so.6

NEEDED               libpcap.so.0.8

NEEDED               libpcreposix.so.3

NEEDED               libpcre.so.3

NEEDED               libperl.so.5.10

NEEDED               libpthread.so.0

NEEDED               librt.so.1

NEEDED               libselinux.so.1

NEEDED               libssl.so.0.9.8

NEEDED               libstdc++.so.6

NEEDED               libz.so.1

y copiamos todas las que nos falte:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -l /home/xianur0/nmap-final/lib/

total 6712

-rwxr-xr-x 1 root root  122340 ene 14 04:53 ld-linux.so.3

-rw-r--r-- 1 root root   25412 ene 14 05:01 libacl.so.1

-rw-r--r-- 1 root root   14576 ene 14 05:02 libattr.so.1

-rw-r--r-- 1 root root   74552 ene 14 04:57 libbz2.so.1.0

-rw-r--r-- 1 root root 1247604 ene 14 04:26 libcrypto.so.0.9.8

-rw-r--r-- 1 root root   34376 ene 14 05:00 libcrypt.so.1

-rwxr-xr-x 1 root root 1205684 ene 14 04:27 libc.so.6

-rw-r--r-- 1 root root    9808 ene 14 04:26 libdl.so.2

-rw-r--r-- 1 root root   47212 ene 14 04:27 libgcc_s.so.1

-rw-r--r-- 1 root root  143460 ene 14 04:26 liblua5.1.so.0

-rw-r--r-- 1 root root  127380 ene 14 04:54 liblzma.so.2

-rw-r--r-- 1 root root  652912 ene 14 04:27 libm.so.6

-rw-r--r-- 1 root root  193012 ene 14 05:01 libpcap.so.0.8

-rw-r--r-- 1 root root    5892 ene 14 04:56 libpcreposix.so.3

-rw-r--r-- 1 root root  186208 ene 14 04:25 libpcre.so.3

-rw-r--r-- 1 root root 1251792 ene 14 04:56 libperl.so.5.10

-rwxr-xr-x 1 root root  120505 ene 14 04:53 libpthread.so.0

-rw-r--r-- 1 root root   26632 ene 14 04:55 librt.so.1

-rw-r--r-- 1 root root  100312 ene 14 04:54 libselinux.so.1

-rw-r--r-- 1 root root  270772 ene 14 04:26 libssl.so.0.9.8

-rw-r--r-- 1 root root  874176 ene 14 04:27 libstdc++.so.6

-rw-r--r-- 1 root root   82124 ene 14 04:53 libz.so.1

 
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -alh /home/xianur0/nmap-final/bin

total 620K

drwxr-xr-x 2 root root 4,0K ene 14 04:24 .

drwxr-xr-x 4 root root 4,0K ene 14 04:25 ..

-rwxr-xr-x 1 root root 609K ene 14 04:24 nmap

 

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # du -sh /home/xianur0/nmap-final/

7,2M   /home/xianur0/nmap-final/

Ahora pesa mucho menos que los 68 MB's con la basura de debian.

Preparemos el entorno y subamos al dispositivo todo:
Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/proc

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/dev

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/sys

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # adb push /home/xianur0/nmap-final /sdcard/nmap

Y probemos en el dispositivo a ver si funciona:

Primero copiaré la carpeta a /data/local/nmap porque la SD es fat32 y no acepta permisos de ejecución (que requerimos para ejecutar el programa):
# cp -R /sdcard/nmap /data/local/nmap

# cd /data/local/nmap

Montamos las particiones para que se comunique con el sistema:
# mount -o bind /proc proc

# mount -o bind /dev dev

# mount -o bind /sys sys

Ahora vamos a ver si se ejecuta:
 # chroot /data/local/nmap /bin/nmap -V

Nmap version 5.00 ( http://nmap.org )

Y listo nmap corriendo en android :D.

También podemos portar GCC/Make y otras herramientas de desarrollo y directamente compilar el programa en el celular, lo cual nos ahorraría eliminar tanta basura.

 export.pl


#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die(("\t"x3)."Deb2Droid v0.1 by Xianur0\n\nUse: ./export.pl [pool dir] [deb]\n");
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system("mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info");
open STATUS,">>var/lib/dpkg/status";
sub copiar {
my ($origen,$destino) = @_;
open(FILES,"<".$origen) || return 0;
my $contenido = "";
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,">".$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= "/" if($dir !~ /\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\///g;
if(-d $file) {
if($file !~ /^\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print "[-] Posible paquete encontrado: ".$dep." ? ".$file."\n";
print "ar x ".$file." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\n";
if($install == 1){
print "[-] Extrayendo paquete...\n";
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}

sub finddeps {
my $searchpackagename = "";
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = "" unless defined $searchpackagename;
open CONTROL,"<control" || return;
open MD5,"<md5sums";
open CONFFILES,"<conffiles";
my $control = "";
my $md5 = "";
my $conffiles = "";
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = "";
$packagename = $1 if($control =~ /Package: ([^\r\n]+)/);
print "Paquete: ".$searchpackagename."=? ".$packagename."\n";
if($searchpackagename ne "" && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = "Status: install ok not-installed";
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\r\n]+//g;
open F, ".".$f;
my $cf = "";
while(<F>){
$cf .= $_;
}
$conffiles.=" ".$f." ".Digest::MD5::md5_hex($cf)."\n";
}
close(CONFFILES);
$control =~ s/(Description:\s+)/Conffiles:\n$conffiles$1/;
$status = "Status: install reinstreq half-configured";
}
checkmd5($md5);
my $depsstring = "";
$depsstring = $1 if($control =~ /Depends: ([^\r\n]+)/);
copiar("archivos.list","var/lib/dpkg/info/".$packagename.".list");
copiar("postinst","var/lib/dpkg/info/".$packagename.".postinst");
copiar("preinst","var/lib/dpkg/info/".$packagename.".preinst");
copiar("postrm","var/lib/dpkg/info/".$packagename.".postrm");
copiar("prerm","var/lib/dpkg/info/".$packagename.".prerm");
open MD5OUT,">>var/lib/dpkg/info/".$packagename.".md5sums";
print MD5OUT $md5;
$md5 = "";
if($depsstring eq ""){
print "[-] Sin dependencias... continuando...\n";
return 1;
}
my @deps = ($depsstring =~ /[^\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\s+//g;
my $version = $dep;
$version =~ s/(.+\()//g;
$version =~ s/\)//g;
my $condicion = "";
if($version=~/^(>|>=|<=|==|<)\s+([\:\.\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version="";}
$dep =~ s/\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print "[-]Instalando dependencias....\n\n";
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print "[-] Buscando paquete: ".$dep."...\n";
if(!locatedep($base,$dep)) {
die("\n[!] No se pudo resolver la dependencia: ".$dep."\n");
}
}
}
print "[-] Agregando a status...\n";
$control =~s/^Package\:([^\r\n]+)/Package:$1\n$status/;
print $control."\n";
print STATUS $control."\n\n";
print "[-] Instaladas!\n";
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = "";
system("ar x ".$p." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1");
my $estado = finddeps($packname);
system("rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo ");
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\r\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\w\d]+)\s+(.+)$/);
open OBJETO,"<".$objeto;
binmode OBJETO;
my $bin = "";
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die("\n[!] MD5 incorrecto: ".$md5."!=".$md5real." en: ${objeto}\n");
} else {
print "\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\r";
}
}
print "\n[-] MD5's correctos!\n";
}
for $package (@packages){
extract($base.$package);
}
print "[-] Paquete y dependencias extraidos correctamente!\n";

 

By Xianur0
READMORE