Tuesday, August 10, 2021

Nitip Catatan Pribadi (1)

VECTORS:
- http://vectorcharacters.net
- https://graphicmama.com

~~~~~~~~~~~~~~~~~~~~~~
 BASH GET EXTERNAL IP
~~~~~~~~~~~~~~~~~~~~~~
myip=$( wget -q -O - http://bot.whatismyipaddress.com/ )

~~~~~~~~~~~~~~~
  SMALI DEBUG
~~~~~~~~~~~~~~~
const-string v8, "log-tag"

invoke-static {v1}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v9

invoke-static {v8, v9}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

~~~~~~~~~~~~~~~~
  DYNAMIC DNS
~~~~~~~~~~~~~~~~
yang gampang update IP pake wget / cron
https://freedns.afraid.org/
- https://www.cloudns.net/


Friday, April 17, 2020

Reboot Router ZTE F609 Menggunakan Script

Titip catatan :

#!/usr/bin/php -q
<?php

/*
Script : router.php
Author : rizapn@gmail.com - apr3,2020
-------------------------------------
Connect to ZTE F609 router
check IP and send reboot command remotely
*/

$PATH0 = dirname(__FILE__);

$IP = '192.168.1.1';
$user = 'user';
$pwd_enc = '';   //--encrypted password
$random = '92198674';

$url = "http://$IP/";

$result = @file_get_contents($url);

if (preg_match('/"Frm_Logintoken", "(\d+)"/s',$result,$M))
{
  $token = $M[1];
  $type = 1;
}
else if (preg_match('/getObj\("Frm_Logintoken"\)\.value = "(\d+)";/s',$result,$M))
{
  $token = $M[1];
  $type = 2;
}
else
{
  addLog("Error reading First Login Token !",3);
  exit;
}

$user = 'user';

if ($type==1)
{
//  $random = rand(10000000,99999999);
//  $pwd_enc = hash('sha256',$pwd.$random);
    $post =
       "action=login&Username=$user&".
       "Password=$pwd_enc&Frm_Logintoken=$token&UserRandomNum=$random";
}
else if ($type==2)
{
  $post = "frashnum=&action=login&Frm_Logintoken=$token&Username=$user&Password=$pwd";
}

$HEADERS = array(
        'Connection' => 'keep-alive',
        'Content-Type' => 'application/x-www-form-urlencoded',
        'Cookie' => '_TESTCOOKIESUPPORT=1',
        'Host' => $IP,
        'Referer' => $url,
        'Upgrade-Insecure-Requests' => 1,
);

list($result,$resp) = sendHttp($url,$post);

$SID = '';
if (preg_match('/SID=(.+?);/',$resp['Set-Cookie'],$M))
{
  $SID = $M[1];
  addLog("Cookie: $SID",1);
}

$HEADERS['Cookie'] = "_TESTCOOKIESUPPORT=1; SID=$SID";

$url_start = "http://$IP/start.ghtml";
list($result,$resp) = sendHttp($url_start,'');
$HEADERS['Referer'] = $url_start;

$url_netinfo = "http://{$IP}/getpage.gch?pid=1002&nextpage=IPv46_status_wan2_if_t.gch";         //--network-info
list($result,$resp) = sendHttp($url_netinfo,'');

$public = 1;
$REM_IP = array('PRIVATE','PUBLIC');
$myIP = '0.0.0.0';
if (preg_match('#>IP</.+?">(.+?)</#s',$result,$M))
{
  if (preg_match('#Online Duration</td>.+?>(\d+) #s',$result,$M2))
      $online = $M2[1];
  $myIP = $M[1];
  if (substr($myIP,0,3)=='10.') $public = 0;
  $online += 0;
  $ss = $online % 60;
  $mm = floor($online/60);
  $hh = floor($mm/60);
  $day = floor($hh/24);
  $hh = $hh % 24;
  $mm = $mm % 60;
  $pREM = $REM_IP[$public];
}
else
{
  $myIP = '???';
  addLog("NoIP",1);
}

$stok = '';
if (substr($cmd,0,6)=='reboot')
{
  if ($cmd=='reboot-force' || $public==0) $stok = rebootRouter();
     else addLog("NOT REBOOTED",1);
}

$post = "logout=1&_SESSION_TOKEN=$stok";
sendHttp($url, $post);

addLog("Finished!",1);
exit;

/* ------ END OF SCRIPT ------ */

function rebootRouter()
{
  global $IP;
  $url_admin = "http://{$IP}/getpage.gch?pid=1002&nextpage=manager_dev_conf_t.gch";
  list($result,$resp) = sendHttp($url_admin,'');

  if (preg_match('/session_token = "(.+?)";/s',$result,$M))
  {
    $stok = $M[1];
    addLog("session_token: $stok",1);
  }
  addLog("<<< REBOOTED >>>",3);
  $post = "IF_ACTION=devrestart&IF_ERRORSTR=SUCC&IF_ERRORPARAM=SUCC&IF_ERRORTYPE=-1&flag=1&_SESSION_TOKEN=$stok";
  list($result,$resp) = sendHttp($url_admin,$post);
  return $stok;
}

function sendHttp($url,$post)
{
  global $HEADERS;

  $clen = strlen($post);
  if ($clen>0)
  {
    $method = 'POST';
    $HEADERS['Content-Length'] = $clen;
  }
  else
  {
    $method = 'GET';
    unset($HEADERS['Content-Length']);
  }
  $opts = array('http' =>
    array(
      'timeout' => 15,
      'method' => $method,
      'header' => getHeaders($HEADERS),
       )
    );
  if ($clen>0) $opts['http']['content'] = $post;

  $context = stream_context_create($opts);
  $result = @file_get_contents($url,false,$context);
  $resp = getResp($http_response_header);
  return array($result,$resp);
}

function getHeaders($HEADERS)
{
  $out = '';
  foreach ($HEADERS as $id=>$val) $out .= "$id: $val\n";
  return $out;
}

function getResp($RESP)
{
  $out = array();
  foreach ($RESP as $r)
  {
    if (preg_match('/^(.+?): (.*?)$/',$r,$M)) $out[$M[1]] = $M[2];
       else if (preg_match('#HTTP.+? (\d+) (.+)$#',$r,$M))
             {
               $out['code'] = $M[1];
               $out['status'] = $M[2];
             }
  }
  return $out;
}

function addLog($txt,$flag)
{
  global $PATH0;
  $out = strftime("%Y-%m-%d %H:%M:%S")."> $txt\n";
  $fout = "$PATH0/cek_router.log";
  if (($flag&1)>0) print $out;
  if (($flag&2)>0) file_put_contents($fout,$out,FILE_APPEND);
}


?>

Mengambil isi dmesg secara realtime

Dibawah ini adalah contoh aplikasi untuk mengambil keycode remote secara real-time di STB armbian dengan memanfaatkan command dmesg ...

#!/usr/bin/python

from subprocess import Popen, PIPE
import time
import re

tmx = int(round(time.time()*1000))

def run(command):
    process = Popen(command, stdout=PIPE, shell=True)
    while True:
        line = process.stdout.readline().rstrip()
        if not line:
            break
        yield line

if __name__ == "__main__":
    for line in run("dmesg -wH"):
       tmn = int(round(time.time()*1000));
       if (tmn-tmx>1000):
          #print(line)
          x = re.search("remote: Wrong custom code is 0x(.+)$",line).group(1)
          print("Keycode: "+x)

Tinggal ditambah/dimodif sedikit saja, sehingga script tersebut bisa dijadikan daemon, dan menjalankan file/script/aplikasi lain jika tombol X ditekan.

Semoga bermanfaat,

Saturday, July 20, 2019

Menjalankan Aplikasi Linux Secara Native di Android

Saya baru tahu kalo aplikasi native linux (ternyata) bisa langsung dijalankan di Android. Padahal, selama ini selalu kebingungan googling, misalnya "htop binary for android" ... atau aplikasi lainnya ditambah keyword for android.

Ternyata, caranya gampang. Tapi syaratnya, kita harus punya akses root ke si Android. Metode ini sangat cocok dipakai kalau kita ingin memaksimalkan fungsi STB Android. Selain untuk tontonan / entertainment, kita bisa jalankan fungsi-fungsi lain, termasuk sebagai web server, bot server, compiler, dan sebagainya.

Yang pertama harus diperhatikan tentu saja, arsitektur si Android. Kemungkinan besar, pilihannya 2 : arm 64 bit, dan arm 32 bit. Kalau arm 64 bit, kita gunakan resource dari OS linux (berbasis arm) yang 64bit, dan pilih OS linux berbasis arm 32bit kalau Android kita juga 32bit. Bisa dicari di website resmi debian/armbian. Pakai yang buat device apa saja terserah (asal sesuai 32bit/64bit-nya).

Berikutnya, kita harus bikin link, di system Android kita ke folder /usr dan /lib ... bisa saja kita ambilkan dari /system/ulib dan /system/uusr atau dari /cache/lib dan /cache/usr). Terserah saja, mana yang kira-kira lebih pas (space-nya cukup). Link ini penting, karena linux mencari library di dalam /lib atau /usr/lib ... dan aplikasi di /usr/bin ... Kita kumpulkan saja nanti semua native disitu, biar gampang manage-nya.

# mkdir /usr
# mkdir /lib
# mkdir /system/lusr
# mkdir /system/llib
# ln -s /system/lusr /usr
# ln -s /system/llib /lib
# mkdir /usr/bin
# mkdir /usr/lib


Salah satu folder utama linux, yang sayangnya juga dipakai oleh Android adalah /etc (di link ke /system/etc). Folder ini juga sangat banyak dipakai oleh linux. Beberapa aplikasi juga menggunakan /var ... cek apakah sudah dipakai oleh si Android. Kalau sudah, kita bikin saja link, misalnya /var/lib ke /data/var/lib atau /cache/var/lib ... dan beberapa /var/xxx lain sesuai kebutuhan.

# mkdir -p /data/arm64/var/lib
# mkdir -p /var/lib
# ln -s /data/arm64/var/lib /var/lib


OK ... langkah persiapan sudah cukup. Sekarang tahap yang agak rumit, yaitu mencari tau, library apa yang dipakai oleh si aplikasi native yang ingin kita copy. Kalau Anda bisa akses terminal linux / armbian aslinya, coba gunakan command : readelf -a nama_aplikasi | grep NEEDED. Nanti akan ada library apa saja yang dibutuhkan. Yang paling utama adalah library ld-linux ...

(Salah satu contoh kasus saya) Untuk armbian 64bit (aarch64 armv8), file ld-linux yang dibutuhkan adalah ld-linux-aarch64.so.1 ... sedangkan arm 32bit (armv7 dll), butuh ld-linux-armhf.so.3 atau ld-linux-arm.so.3 ... atau silakan periksa di folder /lib asli armbian-nya. File ld-linux-xxxxx ...

Copy file ld-linux tersebut ke Android, di folder /lib bikinan kita.
Setelah itu, copy file native / binary linux/armbian yang ingin kita coba jalankan di Android ke folder /usr/bin (biar ngumpul). Contohnya, kita akan copy htop. Tambah mode eksekusi untuk kedua file tersebut (chmod +x /lib/ld-linux-xxx dan /usr/bin/htop).

# cp /arm64/lib/ld-linux-aarch64.so.1 /lib
# cp /arm64/usr/bin/htop /usr/bin


Selanjutnya, jalankan file htop tadi. Jika beruntung, langsung bisa jalan ... tapi kemungkinan besar akan muncul error. Karena dia butuh banyak library. Cari library tsb di linux/armbian aslinya, lalu copy ke Android di folder /lib atau /usr/lib (tergantung lokasi aslinya di linux). Kalau aslinya dia ada di /lib copy juga ke /lib ... selain itu, copy saja ke /usr/lib.

Jalankan lagi htop, dan cek lagi error-nya. Begitu seterusnya, sampai semua file library yang dibutuhkan tercopy ke Android, dan htop bisa jalan dengan baik.

Saran saya, aplikasi/binary pertama yang perlu kita copy ke Android adalah readelf dan strace. Karena mereka akan sangat bermanfaat untuk proses copy binary-binary yang lain, terutama strace.

Dengan metode ini, semua aplikasi yang jalan di linux, Insya Allah akan jalan di Android (kecuali yang memang gak jalan, karena butuh struktur folder yang sangat specific dan lebih rumit).

Ada beberapa aplikasi yang butuh akses socket/internet, atau akses ke DNS resolv ... mereka perlu penanganan tambahan, yaitu penambahan user/group ke file /etc/passwd /etc/group, dan DNS resolv di /etc/resolv.conf ...

Selanjutnya ... kalau ingin menjalankan aplikasi2 tersebut pada saat proses booting Android, tinggal kita cari shell script yang dijalankan oleh si Android pada saat booting, lalu kita tambahkan script kita sendiri disitu. Proses booting bisa macem-macem, tergantung device Android yang kita pakai. Cari di /etc/rc.d atau script /init si Android.

Selamat mencoba,
Semoga bermanfaat.

Thursday, July 18, 2019

Menjalankan Armbian (OS linux berbasis ARM) di Android

ARMBIAN bisa jalan di STB ANDROID, tanpa perlu menghapus android-nya.
Caranya?

Burn salah satu image armbian ke sdcard (download dari armbian.com ... pilih yang sesuai dengan arsitektur device Android Anda, misal B760H => armv7l 32bit, cocok dengan image-nya NANOPI, B860H/HG680P armv8 64bit, gunakan image aarch64, dsb) ==> STB 64bit bisa digunakan untuk menjalankan OS linux yang 32bit. Belum dicoba kalau sebaliknya, kayaknya sih gak bisa ...

Connect ke STB pada mode root (terserah mau pake adb, TTL, putty, terminal, dsb) :

# mount -o rw,remount /
# mkdir /armbian
# mount
--> lihat hasil mount-nya, cek yang /dev/block/vold/public: ...
--> di saya /dev/block/vold/public:179,129 ... tambah 1 (untuk partisi linux-nya)
# mount -t ext4 /dev/block/vold/public:179,130 /armbian
# export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/bin:/usr/bin:$PATH
# for f in dev dev/pts proc sys ; do mount -o bind /$f /armbian/$f ; done
# export TMPDIR=/tmp
# export HOME=/armbian

Pertama kali menjalankan armbian di Android, lakukan langkah-langkah ini:

# chroot /armbian /bin/bash -l
# rm /etc/resolv.conf
# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# groupadd -g 3003 inet
# groupadd -g 3004 net_raw
# usermod -a -G inet,net_raw root
# usermod -g 3003 _apt
# exit

Jika sudah pernah, langsung saja lakukan ini (gak perlu lagi langkah no.3)

# chroot /armbian /bin/su - root 

Cara ini cocok buat kita yang tidak mau kehilangan Android untuk keperluan nonton TV, streaming, main game, dsb ... tetapi ingin memiliki perangkat console berbasis LINUX (misalnya untuk keperluan compile, running aplikasi di level command-line, dsb). 1 STB multi-fungsi.

Catatan :

  • karena booting STB dalam mode Android, maka beberapa module yang dibawa oleh image OS yang kita pasang, tidak akan diload. Kalau mau coba, ya load secara manual (insmod/modprobe). 
  • cara ini juga bisa dipakai untuk mencoba OS linux apa-pun (bukan hanya armbian).


Semoga bermanfaat.

Referensi : googling “chroot android”


Oprek-Oprek STB Jadul ZTE B700 B700V5

STB B700v5 saat ini kayaknya sudah menjadi barang "jadul". Silakan searching di tempat-tempat jualan online, harganya lumayan murah. Apalagi kalau Anda bisa ketemu penjual offline, harganya bisa hanya 10rb. Menarik untuk di-oprek.

Kalau dibongkar, dalemannya kira-kira seperti ini :



Bahan-bahan untuk oprek-oprek STB ini cukup simple, yaitu USB-to-TTL lengkap dengan kabel jumpernya. Untungnya koneksi serial B700 ini sudah dilengkapi dengan pin di motherboardnya, jadi kita gak perlu nyolder-nyolder lagi pasang pin. Ssst ... info rahasianya adalah : hanya chipset cp2102 yang bisa nyambung ke B700. Chip-chip lain, sudah saya coba, gak bisa. Mungkin Anda berhasil ... silakan dicoba.

Wednesday, June 3, 2015

Problem Timezone pada PHP di Openwrt

Jika script PHP Anda di openwrt menggunakan fungsi date time, misalnya strftime(), dsb ... dan Anda mendapatkan message seperti ini :

Warning
It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. 
In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

kemungkinan besar karena proses install php kita belum "selesai".
Cara supaya error itu tidak terjadi lagi, yaitu setelah melakukan proses instalasi php dengan menggunakan :

#opkg update
#opkg install php5-cgi

selanjutnya lakukanlah langkah ini :

#opkg install zoneinfo-core zoneinfo-asia

Setelah itu, edit file /etc/php.ini di bagian :

[Date]
date.timezone = "Asia/Jakarta"

(seandainya Anda berada di Jakarta) ...
Jangan lupa hilangkan tanda remark (;) di awal baris jika sebelumnya masih ada.

Jika sudah selesai, coba lagi script yang tadi error ... seharusnya bisa berjalan normal tanpa mengeluarkan warning.

Semoga membantu,