baksmali

baksmali について


odexファイルをdexファイルにして、apkファイルにまとめてしまおうというお話。

ちょっと乱暴ですが、簡単に書きます。(自分への覚え書き程度なので…)

.dex ファイル … Dalvik VM で実行可能なファイル
.odex ファイル … Dalvik VM で実行可能なファイルの .dex を特定のVM環境に最適化したもの。

逆アセンブラ的な動作とアセンブラ的動作をするのが、baksmali、smali。
本家サイトはこちら→http://code.google.com/p/smali/

毎回、使い方を調べるのが面倒になったので、Makefile にした。
といっても、依存関係も何も無いのでシェルスクリプトとほとんど変わらないのだが、
エラーが出るとそこで止まるという利点があったりする。

下記の例だと、piyopiyo.apkとpiyopiyo.odexがあり、
FRAMEWORKのところに、特定VMの/system/frameworkディレクトリを指定すると言った感じ。
ディレクトリにそれぞれを配置して、Makefileを書き直して
$ make key
$ make
で完了です。
新apkと、key生成を依存関係で結びつけるとさらに楽かもしれない。
$ make clean
はキャンセルです。新apkを削除して、makeする前の状態にディレクトリをクリーンにする。

TARGET:=piyopiyo
FRAMEWORK:=../../system/framework/
BAKSMALI:=../..//baksmali/baksmali-1.2.8.jar
SMALI:=../../baksmali/smali-1.2.8.jar

.PHONY:all
all:
	rm -rf out
	java -jar  $(BAKSMALI) \
	-d $(FRAMEWORK) \
	-x $(TARGET).odex
	java -jar $(SMALI) -o classes.dex out
	rm -rf temp
	mkdir temp
	( cd temp; \
	  unzip ../$(TARGET).apk;)
	rm -f ./temp/META-INF/*
	cp classes.dex ./temp/
	( cd temp; \
	jar cvf ../$(TARGET)_new.apk .;)
	mv $(TARGET).apk $(TARGET)_old.apk
	mv $(TARGET)_new.apk $(TARGET).apk
	jarsigner -keystore is01.keystore -verbose $(TARGET).apk is01key

.PHONY:clean
clean:
	rm -f *~ classes.dex
	rm -f $(TARGET).dex
	rm -rf out
	rm -rf temp
	mv $(TARGET)_old.apk $(TARGET).apk

.PHONY:key
key:
	keytool -genkey -dname "c=j" \
	-keypass hogehoge \
	-keystore is01.keystore \
	-storepass hogehoge \
	-validity 10000 \
	-alias is01key \
	-keyalg RSA

コメント
名前:
コメント:
最終更新:2011年09月25日 21:00
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。