ヘビィ・SMD! -19ページ目

ヘビィ・SMD!

そんな・・・バナナ!!
1. 甘え度+10 恐れ度+10 寿命-1週間
2. 甘え度+10 恐れ度-10
3. 甘え度-10 恐れ度-10 寿命+1週間

androidを扱った某案件で、
1. アプリのapkファイルはもらえる
2. アプリのAndroidManifest.xmlはもらえない
3. しかしAndroidManifest.xmlが必要だ

という状況に陥った。
パートナーさんから、「こういうのあるんで使ってみては?」と言われたので
あるツールを利用したところ、なるほどどうして使えるではないか。

備忘録としてここに記載しておきます。
が、リバースエンジニアリングの一種なので取り扱いは慎重に。
じゃないと最悪変な髪型の人と関係を持つ可能性も。
$ヘビィ・SMD!
冗談です。

さて、apkはjarで解凍することが出来ます。
解凍するとAndroidManifest.xmlもきちんとそこに存在します。
が、しかしこれ、バイナリデータとなっておりテキストエディタでは内容を読み取れません。
上で書いた通り、パートナーさんに紹介してもらったツールの登場です。

AXMLPrinter2.jar
というツール。
「Prints XML document from binary XML file」
infoseek先生に意味を尋ねた
「XMLが2進のXMLファイルから記録する印刷」
日本語でおk

茶番はさて置き、以下に手順をば。
※ jdkは6系を使っており、pathも設定済みとします、あたりまえだけど。

■手順1. AXMLPrinter2.jarをダウンロードする

AXMLPrinter2.jarはGoogle Codeで公開されています。
http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
ここからダウンロード可能です。
ダウンロードしたら、適宜ファイルを配置しておきます。
ここではC:\tmp にjarを配置しておきます。

■手順2. バイナリになったxmlを取得する

apkからAndroidManifest.xmlを取得します。
jarコマンドを使ってapkを解凍します。(私はLhaplusで解凍しましたが。)
解凍したAndroidManifest.xmlはバイナリ形式のはずです。
これをC:\tmpに配置します。

■手順3. AXMLPrinter2.jarの実行

バイナリのxmlをテキストデータに変換します。
C:\tmp に移動し、以下のコマンドを実行します。

C:\tmp>java -jar AXMLPrinter2.jar AndroidManifest.xml > hoge.txt

これで C:\tmp\hoge.txt にAndroidManifest.xmlのテキスト形式の内容が出力されているはずです。


元データとバイナリから変換後のデータとで比較もしてみた。
非常にシンプルな自作アプリのAndroidManifest.xmlを使っています。

元データ↓


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.gr.java_conf.smd877.CP500103"
android:versionCode="4"
android:versionName="4" >


<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.CAMERA"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

<activity
android:label="@string/app_name"
android:name=".CP500103Activity" >

<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

バイナリから変換後のデータ↓


<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="4"
android:versionName="4"
package="jp.gr.java_conf.smd877.CP500103"
>

<uses-sdk
android:minSdkVersion="8"
>

</uses-sdk>
<uses-permission
android:name="android.permission.CAMERA"
>

</uses-permission>
<application
android:label="@7F040001"
android:icon="@7F020000"
>

<activity
android:label="@7F040001"
android:name=".CP500103Activity"
>

<intent-filter
>

<action
android:name="android.intent.action.MAIN"
>

</action>
<category
android:name="android.intent.category.LAUNCHER"
>

</category>
</intent-filter>
</activity>
</application>
</manifest>


一部ラベル系のパラメータは変換されたものになっているけど、読み解く分には問題ない感じす。
PCにたまったサンプルコードはこれからどんどん放出していく所存でござる。

Javaの暗号化、かつ簡単な方法を昔探していて発見したこちら。
Blowfishという方式。
メリットは特別なライブラリを必要としないこと。(バイト配列を直接扱うのであればの話。)
まずはサンプルコードをどうぞ。
/** スクリプトが読み込めないためコード非表示 **/

mainメソッドではエンコード->デコードの順番で実行してます。

バイト配列を文字列変換するためHexクラスを利用しています。
commons-codecライブラリを使っているのはご愛嬌と言う事で。
CentOS6.2を入れようとしたら、昔とUI変わっててちょっと戸惑ったのでログります。
もちろん今回も、WinのPC上にあるVMware Player上でのインストールです。

まずは現在最新のCentOS6.2を入手します。
ミラーサイトから、minimalもしくはDVDをダウンロードしておきます。
minimalは最小構成なのでファイルサイズも小さいです。
DVDは1と2があるけど、2の方は言語追加だかなんだかで必要なので、1だけでも大丈夫。
ヘビィ・SMD!-2012-03-04_010437.png
VMware Playerは今回ver4.0.2 build-591240を利用しています。
起動したら新規仮想マシンの作成を選択します。
ヘビィ・SMD!-2012-03-04_010451.png
「後でOSをインストール」を選択します。(簡易インストールをさせない)
ゲストOSは、Linux->CentOSを選択します。
ヘビィ・SMD!-2012-03-04_010701.png
新しい仮想マシンウィザードを指定します。今回は以下で定義しました。
仮想マシン名 : Dev005
場所 : C:\opt\vm\005_dev
ヘビィ・SMD!-2012-03-04_010813.png
ディスク容量の指定を行います。
仮想ディスクは分割するより単一ファイルにしておいた方が管理が楽です。
ヘビィ・SMD!-2012-03-04_011257.png
ハードウェアをカスタマイズしておきます。
フロッピーやUSBは不要なので削除しておきます。
ヘビィ・SMD!-2012-03-04_011320.png
作成した仮想環境がリストに追加されるので、これを再生します。
ヘビィ・SMD!-2012-03-04_011617.png
何をするか聞かれるので、「Install or upgrade an existing system」を選択。
ヘビィ・SMD!-2012-03-04_012520.png
メディアのテストをする?と聞かれるので「Skip」を選択。時間短縮だ、うん。
ヘビィ・SMD!-2012-03-04_013045.png
お、昔のデザインよりかっこいいですね。nextnextっと。
言語とキーボードは日本語にしておきます。
ヘビィ・SMD!-2012-03-04_013712.png
ストレージタイプ?よくわからんのでBasicにしておきます。
ヘビィ・SMD!-2012-03-04_014134.png
ストレージデバイスもよくわからんのでどんなデータであっても破棄します。
ヘビィ・SMD!-2012-03-04_014312.png
ホスト名は適当に決めます。今回は「dev005.srv」にしました。
networkはデフォルトにしておきます。
nextを押したらタイムスタンプ指定を問われるので東京を選択します。
rootユーザのパスワードを聞かれるので入力。脆弱なパスワードだと注意されるけど無視します。

どのタイプでインストールするかを聞かれるので、「Use All Space」を選択します。仮想だしね。

ヘビィ・SMD!-2012-03-04_015020.png
Writing storage configuration to disk、ハイハイおっぱいおっぱい。
Write changes to diskですねわかります。ぽちっと。

ヘビィ・SMD!-2012-03-04_015222.png
minimalだと、パッケージ選定等はなく、すぐにインストールが始まります。
しばらく待ちます。
ヘビィ・SMD!-2012-03-04_020009.png
インストールが完了したら再起動します。

ヘビィ・SMD!-2012-03-04_020222.png
はい完了。

minimalだと本当に最小構成で、しかもネットワークでeth0が有効になっていない。
これは、インストール途中(ホスト名を決めるところ)でConfigure Networkをいじればできる。
今回はしていなかったので手動で行う。

# /etc/rc.d/init.d/network stop
これで一旦ネットワークのデーモンを停止する。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
- ONBOOT="no"
+ ONBOOT="yes"
+ BOOTPROTO="dhcp"
# /etc/rc.d/init.d/network start
これでdhcpサーバからIPを振り分けられます。

そうそう、何も入れていなければようりょうどんなもんだいと思ってdf打ってみたら
ヘビィ・SMD!-2012-03-04_022345.png
こんな感じ。仮想ファイルのサイズも800MB程度でした。
あとは適宜yumなりなんなりで必要なパッケージを追加していけばいいと思います。
簡単ですが、以上でおわり!