2015/12/09

反組譯 decompile/disassemble android apk

好久沒寫文章了,來補一下。
之前針對 C/C++ 寫了一篇
http://wadefs.blogspot.tw/2012/01/cc-disassembly.html

底下是我隨手亂寫的一點東西,當作關鍵字來看就好,懶得整理


https://github.com/pxb1988/dex2jar
http://sourceforge.net/projects/dex2jar/

a) Convert the code to a modifiable format.
d2j-dex2jar.sh -f -o test_apk-debug_dex2jar.jar test_apk-debug.apk
d2j-asm-verify.sh test_apk-debug_dex2jar.jar
d2j-jar2jasmin.sh -f -o test_apk_jasmin test_apk-debug_dex2jar.jar

b) edit test_apk_jasmin/a/b/Main.j

c) repack apk
d2j-jasmin2jar.sh -f  -o test_apk_jasmin.jar  test_apk_jasmin/
d2j-asm-verify.sh test_apk_jasmin.jar
d2j-jar2dex.sh  -f -o classes.dex test_apk_jasmin.jar
cp test_apk-debug.apk test_apk-debug-toast.apk
zip -r test_apk-debug-toast.apk classes.dex
d2j-apk-sign.sh -f -o test_apk-debug-toast-signed.apk test_apk-debug-toast.apk

1. 反編譯Apk得到Java源代碼
  dex2jar.bat    classes.dex  <-- apk="" classes.dex.dex2jar.jar="" p="">2. 上面產生的 jar 檔,透過 jd-gui 來讀原碼
  jd-gui classes.dex.dex2jar.jar
3. 若要修改資源(如要漢化)
  apktool   d  -f [apk文件 ]   [輸出文件夾]
4. 將上面輸出文件夾編譯成 apk
  apktool b [輸出文件夾]

baksmali -a 15 -x mediatek-framework.odex -d framework -o mediatek-framework

解開 AndroidManifest.xml:
 apktool d HelloWorld.apk ./HelloWorld

2014/12/10

mount partitions from disk dd image 掛載影像檔中的 硬碟分割區

假設,有一顆硬碟,利用 ddrescue 或 dd 做出一個 disk.dd
想要掛載它的話,可以利用 mount -o loop,offset=xxx  這樣的語法來掛載
比較麻煩的是要計算它的位移量,我在早前的文章有提到計算方法,
底下是利用 kpartx 來對應:
$ sudo kpartx -v -a disk.dd

add map loop0p1 (252:0): 0 204800 linear /dev/loop0 2048
add map loop0p2 (252:1): 0 180807680 linear /dev/loop0 206848
add map loop0p3 (252:2): 0 2 linear /dev/loop0 181016574
add map loop0p5 : 0 37748047 linear /dev/loop0 181016576
add map loop0p6 : 0 138412110 linear /dev/loop0 218767360
add map loop0p7 : 0 643033776 linear /dev/loop0 357181440

接下來就可以掛載它了,都不必計算
$ sudo mount /dev/mapper/loop0p5 /tmp/5 -o ro

後面的 -o ro 是掛載成唯讀的,視自己的需求決定要不要加

用完之後通常就要拔除或是 卸載,你會發現光 umount 還不夠,
必須再利用 kpartx 來解除影像檔的對應

$ sudo kpartx -v -d disk.dd

批次處理照片

有一批照片要旋轉90度,原名稱副檔名是大寫,處理後也想順便改成小寫,語法如下,必須安裝 imagemagick 套件:

for i in `ls *JPG`; do F=${i%%.JPG}; convert $F.JPG -rotate 90 $F-v1.jpg; done

其他如放大縮小也是可以查閱 convert 指令取得

2014/11/17

UTF8 remove BOM, 移除 BOM 檔頭

awk '{ if (NR==1) sub(/^\xef\xbb\xbf/,""); print }' INFILE > OUTFILE

2014/08/19

簡繁轉換 iconv, cconv, opencc,

這篇文章整理並比較了幾個簡繁轉換的工具
我拿來試了下 xml 檔的轉換,iconv 確實一直存在著字元集問題,使用 cconv 就沒有這個問題,語法範例如下:
for i in *xml; do echo $i; cconv -f UTF8-TW -t UTF8-CN -o out/$i $i; done
可以很簡單的將 utf8 的繁體轉換成 utf8 的簡體

等效的 iconv 大致如下:

for i in *xml; do echo $i; iconv -f utf8 -t big5 $i | iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o out/${i}; done

iconv 除了不直接外,還無法轉換 BOM xml file, 有些字元也會出錯

可惜的是,我不會使用 opencc....不知道怎麼從繁體轉成簡體

2014/08/04

ubuntu 如何重新啟動 usb?

我的筆電怪怪的,有時開機后,一開始還可以用 usb, 例如 usb mouse, 可是開完機不久它就失效了,重新拔插也沒有用

老實講我不知道是什麼原因造成的,但是底下的方法可以讓它重新啟動:

for u in uhci_hcd xhci_hcd; do
  for i in $( ls /sys/bus/pci/drivers/$u/ | grep : ); do
    echo -n "unbind $u... ";echo $i | sudo tee /sys/bus/pci/drivers/$u/unbind;
    echo -n "bind.. $u... ";echo $i | sudo tee /sys/bus/pci/drivers/$u/bind;
  done

done

同樣道理,如果想重新啟動其他裝置也可以比照辦理。
其他相關的指令如:
lspci
lsusb
lshw

2014/05/19

ubuntu ffmpeg 不見了,替代方案?

太久沒用了,竟然突然找不到  ffmpeg, 連套件都沒了。
其實啊,用  avconv, 算是完整的替代方案,語法基本差不多,而且更簡潔,例如,不必再指定格式。
譬如原來的語法 ffmpeg -i $1 -ss $2 -t $3 -f image2 $4
現在只需要 avconv -i $1 -ss $2 -t $3 $4
甚至,可以直接從 m4v 切割一段,直接輸出成 mp3
avconv -i $1 -ss $2 -t $3 $4.mp3

其他我就不多說了喔,好用啊!

2014/04/16

android-x86 調整 data.img 大小

預設是 512M, 說真的是小了點,若要大一點的話,當然在安裝時請不要用預設的 512, 可以改用 8192 之類的

但是若已經安裝好的話呢?是有 windows 工具,這邊要講的是 ubuntu 下的工具, 怎樣不破壞原來的資料讓它變大呢?

三個動作:
# 先修復檔案系統的錯誤
$ e2fsck -fyc /media/wade/DATA/data.img

# 因為原來有 512M, 加上 7.5G, 也就是 7680 * 1M 就會變成 8G
$ dd if=/dev/zero of=/media/wade/DATA/data.img oflag=append conv=notrunc bs=1M count=7680

# 再來就是 resize...
$ resize2fs /media/wade/DATA/data.img

2014/04/09

ubuntu 更新後,選單/工具列 不見了

可以試試底下三種方法(擇一):
一、
  $ sudo dpkg-reconfigure unity
  $ sudo dpkg --configure -a

二、
  $ dconf reset -f /org/compiz/
  $ unity --reset-icons &disown

三、
  $ sudo apt-get install compizconfig-settings-manager 
  $ export DISPLAY=:0
  $ ccsm


install adobe air on ubuntu 64

請參考這兒 http://www.tkalin.com/blog_posts/installing-adobe-air-and-elance-tracker-on-ubuntu-13-10-saucy-salamander-64-bit

$ sudo apt-get install libxt6:i386 libnspr4-0d:i386 libgtk2.0-0:i386 libstdc++6:i386 libnss3-1d:i386 lib32nss-mdns libxml2:i386 libxslt1.1:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386    

sudo apt-get install libgnome-keyring0:i386

$ sudo ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0 /usr/lib/libgnome-keyring.so.0

$ sudo ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/libgnome-keyring.so.0.2.0

接下來就是去 adobe 下載來安裝,就不寫了

2014/03/21

哇,好快

新北市因為某些原因,不肯付錢給微軟,因此採購電腦時,不再使用微軟,而是採用 ezGO, 並要求學校開課教授 ezGO, 我想,這也算是我身邊發生的第一起微軟敗退案。當然,我知道很多熱心人士致力推廣自由軟體,至少,浪潮已經湧到我身邊來了。

言歸正傳,小羊小肯早就知道多重開機,早就知道 ubuntu, 也聽我念了很多次微軟怎樣怎樣不好,現在終於正式要學 ezGO 了,剛開學那陣子非常興奮,我就做了隨身碟開機給他們,結果一直到昨天,小羊才正式跟老師提,老師還真的說「你可以用隨身碟開機」,我都很懷疑他這個美術老師兼課的電腦老師到底懂不懂隨身碟開機啊!

其實,小羊小肯愛上 ezGO 是因為,上面有一個賽車遊戲,剛開學那週就看到了,隔週終於在課堂上玩,回家就很努力要玩,也因此更加遵守媽媽的約定,總之就是變更乖了。因為之前都是用媽媽的筆電,就算隨身碟開機很慢,但是他們沒感覺,原因就是跟學校比起來快多了。我在猜,學校的新電腦不應該比我家的慢,想必是學校是因為怕每次上課前要還原電腦麻煩,採用雲端安裝的方式吧,我猜。剛剛上網體驗了下,果然雲端啊!

小羊小肯在上了幾次課後,老是抱怨學校的開機很慢,平常在家,都是哥哥先拿我的筆電開機去玩, 話說這款賽車遊戲叫 supertuxkart, 我的 ubuntu 當然也可以安裝,但是他們喜歡用自己的帳號,喜歡用 ezGO, 所以才有先前的幾篇文章。總之,我的筆電現在可以讓他們用自己的隨身碟開機,也可以用我電腦裡的 ezGO iso 開機,也燒了光碟給他們光碟開機,當然也有 ezGO 硬碟版本的開機,花樣百出。昨天,小肯終於第一次用我的電腦「關機」,結果他發出驚嘆的口氣說,『哇,關機好快喔』。

話說,這款 supertuxkart 支援搖桿,我還特地去買了兩支,不知道這樣可不可以取代 WII? 想必還是差很遠吧,但是至少目前他們是真的玩的超開心的啊!

2014/03/14

淺談虛擬機、多重開機、多重編譯環境

好像上一篇也是相關文章?
最近需要 windows, ubuntu, 各種版本的 ubuntu, ezGO....
之前我是做在一支 8G usb disk 中含有 ubuntu, GeeXboX, tiny linux,....
最近因為需要 windows, 所以用虛擬機,譬如用 vmware player for ubuntu, 或是 virtualbox....
後來又需要 ezGO, 這個超肥的 kubuntu
工作上又需要舊版的 ubuntu 來保證編譯 各種晶片的 Android, (TI, MTK, BCM...),這個有的輕易就整合在同一個開發環境中,有的沒辦法

所以啦,也是以虛擬機的方式存在。當然,我的筆電算是相當高檔就是了。
還有一種方法,就是切割多個硬碟分割區,只是不見得有辦法做到這一點,或是拿 usb 3.0 的外接 usb disk, 只是這樣的速度怎麼也快不起來,效能或許也不輸虛擬機,但是虛擬機的好處是可以多個工作環境同時存在。

有一個非常古老的方法,叫做 chroot / debootstrap ....這邊不多說,有興趣的可以上網查。
chroot 不會像虛擬機那樣占用虛擬機的資源,環境也可以自行切開,相當好用。而且硬碟空間也少非常非常多。這邊只提醒一下:
在 chroot 之前,我是這樣下命令:
cd $CHROOT_DIR
for i in dev proc srv sys tmp dev/pts ; do echo $i;sudo mount --bind /$i $i; done
chroot . /bin/bash

不用的時候,重開機是個方法,不然就是反過來 umount
當然,若要非 debian/ubuntu 的系統,還是得虛擬機或多重開機囉!

2014/03/04

各種虛擬機的檔案轉換


轉自 http://blog.sleeplessbeastie.eu/2012/04/29/virtualbox-convert-raw-image-to-vdi-and-otherwise/


VirtualBox - convert RAW image to VDI and otherwise


VirtualBox command-line interface (VBoxManage) provides an easy way to convert raw disk image to the VDI/VMDK format and otherwise.
Let's assume that we have raw image of the sdb device:
$ sudo dd if=/dev/sdb of=./sdb.raw
To use it with VirtualBox we need to convert it to the VDI format:
$ VBoxManage convertdd sdb.raw sdb.vdi --format VDI
To use it with VMware we need to convert it to the VMDK format:
$ VBoxManage convertdd sdb.raw sdb.vmdk --format VMDK
Convert between VDI/VMDK formats:
$ VBoxManage clonehd sdb.vdi sdb.vmdk --format VMDK
$ VBoxManage clonehd sdb.vmdk sdb.vdi --format VDI
Convert to the RAW image:
$ VBoxManage clonehd sdb.vdi sdb.raw --format RAW
Alternative solution to get back raw image after applying modifications is to use qemu-img command from qemu package:
$ qemu-img convert -f vmdk sdb.vmdk -O raw sdb.raw
Now we can write image to the device:
$ sudo dd if=./sdb.raw of=/dev/sdb

2013/10/18

backup newer files

在編譯 browser, kernel, 或 android 時,會產生非常多的輸出,如果要把這些輸出檔備份下來,一個最簡單的方法是 tar --newer REF_DATE_OR_FILE -cf  BACKUP.tar
也就是建立一個參考的日期或檔案,然後找出比它新的將之 tar 起來

另外,若想得到這個清單,當然也可以在 tar 完後再用 tar -t 來取得。不過若不想建立 tar 檔時怎麼處理?底下是一個 shell-script,

$ cat list-file-timestamp
#!/bin/bash
EXE=$0
EXE=${EXE##*/}
DIR=$1
[ "x$DIR" = "x" ] && DIR='.'
[ ! -d $DIR ] && DIR='.'
FORMAT=$2
[ -f BUILD-DATE ] && BUILD_DATE=BUILD-DATE
[ "x$BUILD_DATE" = "x" ] && [ -f checkenv.log ] && BUILD_DATE=checkenv.log
[ "x$BUILD_DATE" = "x" ] && [ -f ./out/target/product/pandora_g2_check-dep.log ] && BUILD_DATE=./out/target/product/pandora_g2_check-dep.log
[ "x$FORMAT" = "x" ] && FORMAT='+'
OUT=/tmp/${EXE}.lst

echo "EXE=$EXE, OUTPUT=$OUT, DIR=$DIR FORMAT=$FORMAT"
find $DIR -type f -newer $BUILD_DATE -printf "%T${FORMAT} %p\n" | sort -n -r > $OUT

用法也相當簡單:
$ list-file-timestamp
$ list-file-timestamp out
$ list-file-timestamp out @

第二個範例是指定目錄,預設是 $PWD,也就是 .
第三個是指定輸出的日期 format, 請 man find 來查,在 -printf format 項下,預設是 +

用 tar 的缺點當然就是耗時耗磁碟

可是如果已經透過上面的 list-file-timestamp 建立檔案清單了,該怎樣將它備份呢?最簡單的想法是:
$ tar cf BACKUP.tar `cat LIST_FILE`
通常會因檔案太多,無法使用上面的命令,這時候可以考慮用 xargs
$ cat LIST_FILE | xargs tar uf BACKUP.tar

不過,老實講, tar 相當慢,還可以用下面的方法:
$ cat LIST_FILE | xargs -I % cp --parents % ../BACK_DIR
上面 xargs -I % 是用來指定傳給 xargs 的參數,因為預設這個參數會加在命令的最後
而 cp --parents 則是保留目錄結構

2013/10/17

縮小 vmware ubuntu vmdk 虛擬磁碟影像檔 shink

有二個步驟,先是開啟 Guest OS, 將它的剩餘磁碟空間清乾淨,這樣才有辦法壓縮
$ cat /dev/zero > zero.fill; sync; sleep 1; sync; rm -f zero.fill

可以看到普通使用者也可以進行,當然這是因為系統沒有設定 QUOTA, 建議可以保險點用 sudo 來進行,例如:
$ sudo cat /dev/zero > zero.fill; sync; sleep 1; sync; sudo rm -f zero.fill

再來就是在 HOST OS 中將它壓縮,一般網路上查到的作法分兩步,第一個就是「磁碟重整」,再來才是壓縮。但是經過實驗,可以合併成一步:

C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager -r D:\my.vmdk -t 0 D:\my-vmdk-shrink.vmdk

2013/09/18

ubuntu amd64 編譯 x86.deb for kernel

照理,編譯 kernel 有很多方法,這篇值得參考

但是,若需要編譯給別種架構的 CPU 的話,又想要編譯出 debian pkg 的話怎麼辦?

在編譯時有個 KBUILD_DEBARCH 選項可以用,範例如下:
make KBUILD_DEBARCH=i386 deb-pkg
當然,文件中有說明,請參見 Documentation/kbuild/kbuild.txt

2013/09/11

tar backup

tar 非常好用,很顯然的,因為太好用,常常都不知道怎麼用!怪哉。

寫過 daily update backup file 每日更新備份檔
事實上要備份還有更多工具,我也沒有想要函蓋全部的企圖,這邊只是寫下我比較愛用的方式

LOCAL MACHINE

Copy A/ ==> B/
$ cd A; tar cf - . --exclude=.git | (cd B/ && tar xBf -)

REMOTE MACHINE

Copy A/ ==> M:B/
$ cd A; tar cf - . --exclude=.git | rsh M 'cd B/ && tar xBf -'

替代的有如 scp....

tar 的好處可以過濾掉某些不要的檔,如範例中的 .git
也可以只備份較新的檔,例如

tar --newer-mtime="`date -r REF-FILE`" cf - --exclude=.git | (cd B/ && tar xBF -)


2013/09/04

顯示隱藏裝置

唉,離不開 Windows...

話說,我的 skype 在 win8 中一直無法使用,今天突然好了~~~

不知道是否有人想要把『隱藏的裝置』刪掉的需求?譬如,某些廠商提供的工具,竟然限定 COM port 只能在 1-6....可是在插拔過程中,我的 COM Port 都跑到不知道多少去了,總之,絕不在1-6!!!!

那怎麼辦咧?一個辦法是拿程式來改,另一個是把沒插在電腦上的,也就是被隱藏起來的裝置移除~~請見 http://support.microsoft.com/kb/315539

剪貼一下上面網址的內容:

如果要解決這個問題,並在您按一下 [顯示隱藏裝置] 時顯示相關裝置:
  1. 按一下 [開始],依序指向 [程式集] 及 [附屬應用程式],再按一下 [命令提示字元]
  2. 在命令提示字元中輸入下列命令,然後按下 ENTER:
    set devmgr_show_nonpresent_devices=1
  3. 在命令提示字元中輸入下列命令,然後按下 ENTER:
    start devmgmt.msc
  4. 疑難排解「裝置管理員」中的裝置和驅動程式。

    注意:請先在裝置管理員的 [檢視] 功能表上按一下 [顯示隱藏裝置],以顯示未連線至電腦的裝置。
  5. 完成疑難排解後,關閉「裝置管理員」。
  6. 在命令提示字元中輸入 exit

    請注意,關閉命令提示字元視窗時,Window 會清除您在步驟 2 中所設定的 devmgr_show_nonpresent_devices=1 變數,避免隱藏連線的裝置在您按一下 [顯示隱藏裝置] 時顯現。

把影片轉成 DVD

老實說,我家算很落後,影片只有DVD Player, 其他格式很難在我家流通
小羊用 M$ Movie Maker 做出來的影片,他也會燒在光碟片中,可是就很難享受它的內容
這邊介紹兩個:
一個叫  格式工廠, 參考介紹如下
http://www.azofreeware.com/2008/10/formatfactory-155.html

一個叫 DVD Styler, 參考介紹如下
http://www.azofreeware.com/2010/02/dvdstyler-1801.html

2013/09/03

把開機光碟做在 usb disk 中 boot from usb

久沒用就忘了,還是寫下來的好

如果你想把某一片開機光碟放在隨身碟中,你會怎麼做?
有個簡單的工具: http://sourceforge.net/projects/unetbootin/files/latest/download
要教學步驟嗎?請見這兒