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