アンドロイド 改造 ブログトップ

アンドロイドをダウングレードして改造してみる [アンドロイド 改造]

今まで半年間使ってきた国内初のAndroid機HT-03Aですが、Xperiaをあぽかんが買ったのを機にダウングレードしてRootを取ってみました!

簡単いうと、今までロックがかかっていて弄れなかったケータイのシステムを弄って自分好みにしよう!ということです。

現在Android機はdocomoからHT-03AとXperiaが出てるのですが、Xperiaはfastbootが無い為今回やってるような事はできない模様。

上記の内容から読み取れる通り、xperiaが羨ましかったのでそれを紛らわす為にやりました!ww



とりあえずコムギドットネットさんを参考にしながら、AndroidSDKをインストールして環境作り!


USBドライバが壊れてると聞いて不安になってたけどここらは特に問題もなくクリア

若干、adb shellコマンドが効かなくて困ったりはしたけれどww


次にGOLDCARDの作成。ここも色々弄ってクリア


次はついにダウングレード!

なぜ、ダウングレードするかというと、OSのバージョンが公式1.6ではrootをとる事ができないので1.5まで強制的にダウングレードしないといけないのです。

そして、ダウングレードにはいくつかの代償を払わねばならず……

まずドコモの保証が効かなくなります。

あとはドコモの起動ロゴを永遠に失います。これが地味に痛い。

しかも、ケータイが文鎮化してしまうというリスクが!(文鎮化;電源落ちたまま動かなくなること)


とりあえず、それらを承知の上でダウングレード!

goldcardぶっ刺して、リカバリモードからSAPPIMG.nbh実行だ! と思ったらなぜか通らない!
misss

理由は簡単で、SAPPIMGではなくSAPPINGになってた模様。

すぐさまリネームして再度実行!

ysの

androidタソ「Updateはじめますかぁ?(実際はダウングレード)」

もちろんYES! docomoロゴとおさらば!


そしてこうなりました!
ぼrdふぉn

Vodafone!!

これはSAPPIMG.nbhがvodafoneイメージだかららしい。

とりあえずダウングレードが完了したので次はroot奪取へ!

これは特に問題もなく、setupsu.apkをインストールしてrootedに!


あとはROMを落としてきてリカバリモードで展開、rebootしてしまえば完成なのですが…

カスタムROMイメージDwang1.1.7を入れて展開しrebootしたところ、画面がブラックアウトしてまったくキーが効かない状態に!!


まさか文鎮化!?と思って色々触ってみても動かず……

「僕のHT-03Aオワタ」と思っていたら、突如リカバリモードに入れる様になりました!

急いでwipe data/factory resetして再度チャレンジすると何とかROMの導入に成功!

今回はさすがに焦った。


で、カスタムテーマやフォントを入れて…結果こうなりました!


d1
ホーム画面(メイン1


d2
ホーム画面(メイン2


d3
setting


d4
メニュー(途中






結局、何がよくなったかというと、

◎サクサク動くようになった!通常時はXperiaにも劣らないぐらいかも。

◎かっこよくなった!フォントも起動画面•アニメーションも自由に変えられます!

◎外装交換が可能になった!今までは補償外になるのが怖くて出来なかったけど今更だと余裕ww

◎カメラが無音になった!無音.oggを作ってコマンドパチパチ打たないといけないのでちょっと面倒だったけど凄く便利!

◎クロックアップ等も自在にできるので今までよりハード性能を活用できる!

◎スクリーンショットが可能に!デフォだとこれできなくて困ってたんですよ。



rootとってみると意外と利点が多くて、「なんで今までやらなかったんだろう」という気持ちにwww

まぁこれでXperiaやDesireに対する羨望が少し減ったので良かったww

液晶の感覚やハードの格好良さ、一部性能等はそれでも羨ましいけれどもww

近いうちに外装交換も行おうと思います。
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:携帯コンテンツ

アンドロイドをサクッと改造する [アンドロイド 改造]

さて....今回は、ちょっとダークな話題など....。 『怪しい"中華パッド"の黎明期から、息の長い活躍を続けている《EKEN M001》を、なんちゃって"android2.2(通称フローズンヨーグルト)"にしてみました!?』って話です!!  何が、なんちゃってなのかは、後々として....先ずは、基本スペックを"確認"しておいてください!!    では、早速、電源オンから....。  このバージョンで立ち上げますと、起動画面では"アンドロイド君"が円盤にのってクルクル廻って大サービスしてくれます。更に、起動直後のログインもタッチパネル上での"スライド方式"なんです!!いかにもなフローズンヨーグルトテイスト満載の出来なんですよねぇ!?  では、早速、お馴染みの端末情報の項目をチェックしてみます。 まぁ....正直、何処に出しても恥ずかしく無い程"フローズン・ヨーグルト"な訳でして....『ご覧の通り、アンドロイドのバージョンは"Android2.2"で、カーネルバージョンは"2.6.29-00236-g4f8dbbb-dirty"になってます!!ちなみに、ビルド番号が"WMT2.1.2"ですね!!更に、あれあれ???なんかメモリーが"256MB"に増えてるし!!ラッキーみたいな...』....。正直、最初は私も"はしゃぎ"ましたよ!!ひょっとして、元々のチップは"256MB"だけど、半分しか認識していなかったとか??....なんて夢見ちゃう感じ....。ただ、確実に、体感速度などが上がってこない(むしろ、以前のCFWより、クソ遅い....)のは謎だったんですが.....。  まぁ....気にせず、セットアップを続けました!!!公式の"ANDROID MARKET"にアクセスできるので、セットアップも簡単!!簡単!!  ANDROID1.6 当時に愛用していたアプリ類をドンドン入れて、セットアップを続けていくと....気になることが......。なんか、弾かれるんですよ.....。気になっていたけど、ANDROID1.6 では入れられなくて悔しかったアプリ類(flash player...etc...)を入れようとしても....出てこない.....。それならって事で、ネット上を徘徊し、直接PCでダウンロードした《○○○.apk》をSDカードに書き写して、そこからインストールを試みても....このバージョンには対応していないと怒られてお終い!!みたいな.....  そして、ここで"ハッ!!!"っと気付いたわけですね!!!。『ひょっとして、こいつ.....実は"andoroid1.6"なんじゃねぇ??』みたいな.....。そう考えると、思い当たる"節"が山盛りでして....例えば"ブラウザー"なんですが、私の場合、マイナーなんですが"Galapagos Browser(ガラパゴス)"って言うブラウザーを愛用していたんですが、ANDROID2.2 なら、アップデート版の"Angel Browser(エンジェル)"ってブラウザーになるはずなのに、何故か"Galapagos Browser"しか入らないし...他にも、対応バージョンが"ANDROID1.8" 以上からになっているモノは、軒並み駄目だったような.....。  後は、簡単な話でして.....システム系の詳細をチェックする"アプリ(android system info)"を入れて、詳細をチェックしてみますと.....まぁ、予想通り、こんな感じでした....。  やはり、どこからどう見ても、従来通り"android1.6"で、メモリーも"128MB"です!!つまり....なんか....『ひょっとして"端末情報類を【偽装】"してる????』って事に.....なるのかなぁ????  ...っと、まぁ.....今回の顛末は、こんな感じです!!ちなみに、このCFW....実は、意外と良く出来ておりまして.....なんと、本文でもさり気無く触れておきましたが"公式アンドロイドマーケット"にも、何の問題もなくアクセスできます。その他、無線&タッチパネル&各種スイッチ類も、全て完全に反応しますから、考えようによっては、『別に、気にせず、このまま使っても良いんじゃねぇ??』みたいな話でして.....皆さんなら、どうします??  でも.....この起動直後の画面構成とか....あと、この端末情報画面とか.....ちょっと前にはなりますが、どっかのオークションで、大量に見掛けたような.....気がしない?????危うく、私も"ポチっ"と行くとこでしたよ.....。怖い怖い.....。  私の場合、この機種に関しては、それこそ様々なカスタムファームウェア(今回のCFWも、この辺の奥のほうから取り出したと思うんですが....詳細は不明とさせて下さい!!)が公開されているので、正直、本当に勉強になりました!!ちなみに、色々、比べてはみたものの、最終的にはリラックス系( EKEN Relax v2.0.2 )のCFWを愛用しているのですが、他にも "WINDOWS CE & デビアン(LINUX)"などへの入れ替えなども、実用化されています。  実は、これとは別の"中華パット(こちらもWM8650系と呼ばれる、これまた怪しい1台に、無理やり"EKEN M009S"用のカスタムウェア"をグリグリ"して入れ替えた物)"を持ち歩いているので、もっぱら、こちら(EKEN M001)は、実験機(という名の、おもちゃ...)なんですが.....流石に、古い機種なので、新しいCFWなども出なくなりました。そろそろ、オークションででも処分しようかと思っているところです。まぁ....流石に【初期型 EKEN M001 なのに"ANDROID2.2+256MB(メモリー)"の奇跡の1台】とか言って売る勇気は在りませんが....誰か、欲しい人なんて居ませんかねぇ???個人的には、初心者にも弄りがいのある、"超"お薦めモデルだと思っております。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:携帯コンテンツ

アンドロイド改造方法 2本だて [アンドロイド 改造]

ちょっと今回は改造と読んでよいものか!笑
とりあえずチェックしてきたいと思います! 

改造というほど仰々しいことでもありませんが、、、。

8円運用で買ったフルキーボードアンドロイド「IS01」ですが、文字が打ちにくいという欠点があります。

 

そこで、100円ショップで売っている、デコレーションシールをキーボードに貼ることにしました。

参考:IS01 キーボードにクリスタルシール

100円ショップで100円で販売中。ケータイのデコ用?

貼った様子。下の文字に多少かぶりますが、問題はありません。

かなり打ちやすくなった印象です。

とじた様子。しっかりは締まりません。が問題はありません。

以上。簡単ですのでキーボードに悩んでいる人はトライしてみてください。

SHARP IS01向け Android 2.3(Gingerbread) ROMです。
これまでの開発の経過はis01rebuid@wikiを参照願います。
基本的に、チャレンジしていただける方向けです。

経過はTwitterで随時流していますが、@RO215IS01アカウントが検索に引っかからない症状になっているため、情報が出にくい状況となっております。
情報がありましたら、@RO215IS01宛か、公開討議フォーラムの方にコメントいただけると助かります。

IS01Rooterのすべての先人たちにお礼申し上げます。

Android 2.3 (Gingerbread) for SHARP IS01プロジェクトのリリースは下のリリースファイル一覧からダウンロードできます。

 


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:携帯コンテンツ

アンドロイド改造方法 [アンドロイド 改造]

結論を先に書くと、Androidアプリケーションのリバースエンジニアリングは非常に簡単である。理由は大きく2つあり、一つはそれがJavaアプリケーションであること、もうひとつはAndroidがオープンソースであることだ(ただしJNI等を使ってC++やCのコードなどを呼び出している場合には、下層のモジュールの解析は通常のCアプリケーション同様に面倒ではないかと考えられる)。

Androidアプリケーションは.apkという拡張子でファイル単体で配布されるので、まずそれを用意する。筆者はAppMonsterというツールを使っている。このツールだと簡単にSDカードにapkファイルを保存してくれる。このエントリでは例としてテスト用のアプリケーションであるandroid1.apkを使用する。

apkファイルはZIP形式の圧縮されたファイルとなっているので、unzipコマンドで任意の場所に展開する。

root@kaldi:/android/tmp# unzip android1.apk
Archive:  android1.apk
  inflating: res/layout/main.xml
  inflating: AndroidManifest.xml
 extracting: resources.arsc
 extracting: res/drawable-hdpi/icon.png
 extracting: res/drawable-ldpi/icon.png
 extracting: res/drawable-mdpi/icon.png
  inflating: classes.dex
  inflating: META-INF/MANIFEST.MF
  inflating: META-INF/CERT.SF
  inflating: META-INF/CERT.RSA
root@kaldi:/android/tmp# ls -l
total 36
-rw-r--r-- 1 root root  1504 Jan 20 16:45 AndroidManifest.xml
drwxr-xr-x 2 root root  4096 Jan 20 17:58 META-INF
-rw-r--r-- 1 root root 14515 Jan 20 16:46 android1.apk
-rw-r--r-- 1 root root  3780 Jan 20 16:45 classes.dex
drwxr-xr-x 6 root root  4096 Jan 20 17:58 res
-rw-r--r-- 1 root root  1488 Jan 20 16:45 resources.arsc

AndroidアプリケーションではActivityをはじめさまざまな情報がAndroidManifest.xmlにまとめられている。そのため解析対象のアプリケーションの内部構造を俯瞰するには、まずこのファイルから手を付けるのがよい。しかしAndroidでは極力モバイルデバイスの負荷を減らすためにXMLファイルはあらかじめパースされたバイナリ形式となって格納されており、このままではAndroidManifest.xmlをエディタで開いても中身を読むことができない。そこでバイナリ形式から通常のXML形式に戻すためにAXMLPrinter2.jarというツールを使用する。jarという拡張子からわかるようにこのツールはJavaアプリケーションであり、java -jarして引数にファイル名を与えると標準出力にXMLを吐いてくれる。

root@kaldi:/android/tmp# java -jar ../AXMLPrinter2.jar AndroidManifest.xml 
<?xml version="1.0" encoding="utf-8"?>
<manifest
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:versionCode="1"
 android:versionName="1.0"
 package="net.jumperz.app.android.test1"
 >
 <application
  android:label="@7F040001"
  android:icon="@7F020000"
  android:debuggable="true"
  >
  <activity
   android:label="@7F040001"
   android:name=".HelloActivity"
   >
   <intent-filter
    >
    <action
     android:name="android.intent.action.MAIN"
     >
    </action>
    <category
     android:name="android.intent.category.LAUNCHER"
     >
    </category>
   </intent-filter>
  </activity>
 </application>
 <uses-sdk
  android:minSdkVersion="4"
  >
 </uses-sdk>
</manifest>

このようにAndroidManifest.xmlを解析することで、このアプリケーションはActivityをひとつしか持たないことがすぐにわかる。

続いて実際のアプリケーションの細かな動作をコントロールしている、中心となる部分を解析する。Androidアプリケーションでは、アプリケーションの細かな挙動は開発時にはJavaのソースコード(拡張子.javaのテキストファイル)として存在する。それがOracleのJDKなどでコンパイルされ、クラスファイル(拡張子.classのバイナリファイル)となる。Androidアプリケーションとしてデプロイされる際には、アプリケーション内部で使用されるクラスファイルはすべてAndroid独自のdex形式として1つのファイルにまとめられる。このファイルはclasses.dexという名前でapkファイル内に存在している。

classes.dexファイルはバイナリファイルなので、そのままでは中身を読むことができない。そこでbaksmaliというツールを使う。baksmaliはsmaliと対となるツールであり、それぞれアイスランド語でディスアセンブラ/アセンブラという意味を持つらしい。AndroidのJVMであるDalvikという単語がアイスランド由来であることから、このような名前を付けたようだ。

baksmali/smaliともJavaで作成されたアプリケーションであり、jarファイルとして存在している。次の例のように引数にclasses.dexファイルを渡すと、out/というディレクトリを生成してその中にsmali形式のファイルを吐いてくれる。

root@kaldi:/android/tmp# mkdir smali
root@kaldi:/android/tmp# cd smali
root@kaldi:/android/tmp/smali# java -Xmx1G -jar ../../baksmali-1.2.6.jar ../classes.dex
root@kaldi:/android/tmp/smali# find . -type f
./out/net/jumperz/app/android/test1/R$drawable.smali
./out/net/jumperz/app/android/test1/R.smali
./out/net/jumperz/app/android/test1/R$id.smali
./out/net/jumperz/app/android/test1/R$layout.smali
./out/net/jumperz/app/android/test1/R$attr.smali
./out/net/jumperz/app/android/test1/R$string.smali
./out/net/jumperz/app/android/test1/HelloActivity.smali

拡張子.smaliのsmali形式のファイルはテキストファイルであり、エディタで編集することができる。以下にHelloActivity.smaliの一部を掲載する。

# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
    .registers 5
    .parameter "savedInstanceState"

    .prologue
    .line 28
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 29
    const/high16 v0, 0x7f03

    invoke-virtual {p0, v0}, Lnet/jumperz/app/android/test1/HelloActivity;->setContentView(I)V

    .line 30
    const v0, 0x7f050001

    invoke-virtual {p0, v0}, Lnet/jumperz/app/android/test1/HelloActivity;->findViewById(I)Landroid/view/View;

smaliファイルの中身はDalvik VMのバイトコードをディスアセンブルしたものである。最初に見たときは「わけがわからない」と投げ出したくなるかもしれないが、Javaの開発者であれば大部分はすぐに読めるようになる(難しいアルゴリズムの実装部分などはそのまま読むのは厳しいかもしれないが)。smaliファイルに慣れるためには、まず自分で簡単なAndroidアプリケーションをJavaで書き、それを上記の方法でsmali形式に変換する。そしてJavaソースコードとsmaliファイルを行ごとに付き合わせて読んでいけばいい。おそらく30分もあれば基本的な構造についてはかなり読めるようになっているだろう。Dalvikのバイトコードやその他の説明は以下のURLが参考になる。

http://code.google.com/p/smali/w/list
http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html

今回、例として使用しているアプリケーションは筆者が作成したものなので、もちろん元となるJavaのソースコードが手に入る。簡単に以下の行について説明を行う。

    .line 28
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

.line 28とあることから、元のJavaソースコードの28行目であることがわかる。該当するJavaソースコードは以下となっている。

27:    public void onCreate(Bundle savedInstanceState) {
28:        super.onCreate(savedInstanceState);

invoke-superは親クラスのメソッドを呼び出すことを意味している。次のp0とp1は呼び出しの際に使うレジスタを表している。pではじまる名前のレジスタは実行中の関数の引数(パラメータ)であり、p0が0番目(this)、p1がひとつめの引数だ。Landroid/app/Activity;はandroid.app.Activityクラスのことだ(頭のLは続く文字列がクラス名であることを意味する)。続くonCreateは呼び出す関数の名前であり、引数が(Landroid/os/Bundle;なので)android.os.Bundleクラスのインスタンスであるという意味になる。つまりthisオブジェクト(p0)の親のonCreateを、実行中の関数のひとつめの引数(p1)であるsavedInstanceStateを引数として実行する、ということになる。最後のVは戻り値がvoidであることを意味する。

実際のアプリケーション解析では、元となるJavaのソースコードは手に入らないだろう。しかしbaksmaliを使用することで、このようにある程度読みやすい形のディスアセンブルリストは手にすることができる。smali形式を読み解くことができれば、アプリケーションはあなたの前で丸裸になったようなものだ。

しかし、もっと楽をしたいと考える人もいるだろう。実はdex2jarと呼ばれるツールが存在しており、このツールを使うとclasses.dexをjar形式に変換することができる。jarファイルはJavaのクラスファイル群をZIP形式で固めたものなので、unzipすることでJavaのクラスファイルを手に入れることができる。知っている人も多いかと思うが、Javaのクラスファイルはディスアセンブルが非常に容易であり、JDやjadなどのツールを使うことでほぼ完全なJavaソースコードを手にすることができる。しかし残念なことに、Androidアプリケーションではこの前段の変換を行うdex2jarの変換精度はあまり良くないようだ。これはDalvik VMと従来のJavaVMの仕様があまりにも異なっているため仕方がないことなのだと考えられる。

それでもdex2jarとJDなどを組み合わせてJavaソースコードを手に入れることには意味がある。読みやすさではsmali形式よりもJavaソースコードの方が圧倒的に優れているので、解析する際に、目的の処理がアプリケーション全体においてだいたいどの辺り(どのクラス)に存在しているのかを探すのには非常に便利なのだ。

dex2jarは以下のようにして使用する。

root@kaldi:/android/tmp# mkdir dex2jar
root@kaldi:/android/tmp# cd dex2jar
root@kaldi:/android/tmp/dex2jar# ../../dex2jar/dex2jar.sh ../classes.dex
version:0.0.7.8-SNAPSHOT
2 [main] INFO pxb.android.dex2jar.v3.Main - dex2jar ../classes.dex -> ../classes.dex.dex2jar.jar
Done.
root@kaldi:/android/tmp/dex2jar# jar -x < ../classes.dex.dex2jar.jar
root@kaldi:/android/tmp/dex2jar# find . -type f
./net/jumperz/app/android/test1/R.class
./net/jumperz/app/android/test1/R$drawable.class
./net/jumperz/app/android/test1/R$string.class
./net/jumperz/app/android/test1/HelloActivity.class
./net/jumperz/app/android/test1/R$layout.class
./net/jumperz/app/android/test1/R$attr.class
./net/jumperz/app/android/test1/R$id.class

クラスファイルが生成されているので、後はJDやjadなどのツールを使ってJavaソースコードに変換すればいい。

Androidアプリケーションのリバースエンジニアリングをする場合には、目的として「解析だけしたい」場合と、「解析した上で、さらに動作を自分好みに変更する」、つまりアプリケーションの改造までを行いたい場合があるだろう。前者の場合、JDによるJavaソースコード形式への(ときに不完全な)変換で十分な場合もあるだろう。この場合、読みにくいsmali形式のファイルと格闘する必要がないかもしれない。しかし後者、つまり改造までを行いたい場合、アプリケーション内の目的の箇所を自分の意図を達成するように書き換え、ふたたびAndroidアプリケーションとして動作するよう、正しくアセンブルしなおす必要がある。smaliはこれを可能にしてくれる。非常に精度が高いディスアセンブル・アセンブルが可能なので、classes.dex -> smali -> classes.dexという変換が可能なのだ。

ここでは筆者がAndroidの参考書からコピペで作成したサンプルアプリケーションを例に、改造する例を見ていく。このアプリケーションはテキスト入力欄をひとつ持ち、そこに文字列を入力してEnterキーを押すと、その下にあるリストに文字列が追加されていく、というだけのものだ。ソースコードは以下のようになる。

package net.jumperz.app.android.test1;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.text.*;
import android.content.Context;

import java.util.*;

public class HelloActivity
extends Activity
implements OnKeyListener
{
private List todoItems = new ArrayList();
private ListView lv;
private EditText et;
private ArrayAdapter aa;
//----------------------------------

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.main );
        lv = ( ListView )findViewById( R.id.ListView01 );
        et = ( EditText )findViewById( R.id.EditText01 );

        aa = new ArrayAdapter( this, android.R.layout.simple_list_item_1, todoItems );
        lv.setAdapter( aa );

        et.setOnKeyListener( this );
    }
//----------------------------------
public boolean onKey( View view, int keyCode, KeyEvent event )
{
if( event.getAction() == KeyEvent.ACTION_DOWN )
	{
	if( keyCode == KeyEvent.KEYCODE_ENTER )
		{
		String str = et.getText().toString();
		todoItems.add( 0, str );
		aa.notifyDataSetChanged();
		et.setText( "" );
		return true;
		}
	}
return false;
}
//----------------------------------
}

このアプリケーションを改造し、Enterキーが押された際に、そのときの文字列がクリップボードにコピーされるよう動作を変更(追加)してみる。改造する際にはsmali形式のファイルを直接編集することになる。ここでは「文字列をクリップボードにコピーする」という処理をsmali形式で記述しなければならない。

先述したようにこのような場合、ゼロからsmali形式で記述する必要はなく、自分で文字列をクリップボードにコピーするアプリケーションを作成して、該当部分がどのようにsmali形式に変換されるのかを確認すればよい。処理を追加する際には、その部分をわかりやすい引数を持つ関数として独立させるのがおすすめだ。ここでは以下のような関数を使用する。

private void copyToClipboard( Activity activity, String str )
{
ClipboardManager cm =  (ClipboardManager)activity.getSystemService( Context.CLIPBOARD_SERVICE );
cm.setText( str );
}

この関数はsmali形式では次のようになる。

.method private copyToClipboard(Landroid/app/Activity;Ljava/lang/String;)V
    .registers 5
    .parameter "activity"
    .parameter "str"

    .prologue
    .line 62
    const-string v1, "clipboard"

    invoke-virtual {p1, v1}, Landroid/app/Activity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/text/ClipboardManager;

    .line 63
    .local v0, cm:Landroid/text/ClipboardManager;
    invoke-virtual {v0, p2}, Landroid/text/ClipboardManager;->setText(Ljava/lang/CharSequence;)V

    .line 64
    return-void
.end method

この部分をまるごとout/net/jumperz/app/android/test1/HelloActivity.smaliファイル内に追記することで、HelloActivityクラスにcopyToClipboardという関数が追加されることになる。非常にシンプルで簡単だ。

次に、この追加した関数を呼び出す必要がある。Javaの以下の部分で目的の文字列がstrという変数に格納されていることに注目する。

String str = et.getText().toString();

対応するsmaliファイル内の記述は以下の部分だ。

    invoke-interface {v1}, Landroid/text/Editable;->toString()Ljava/lang/String;
    move-result-object v0

ここで、対象の文字列がv0というレジスタに格納されているので、この処理の後に関数呼び出しを追記すればよい。追記する内容は以下となる。

invoke-direct {p0, p0, v0}, Lnet/jumperz/app/android/test1/HelloActivity;->copyToClipboard(Landroid/app/Activity;Ljava/lang/String;)V

HelloActivityクラス自身のメソッドを呼び出すため、invoke-directを使う。thisインスタンス(p0)の関数を、thisインスタンス(p0)と対象文字列(v0)を引数として呼び出すため、{p0, p0, v0},という記述になる。

smaliファイルをこのように書き換えたら、アセンブラであるsmaliを使って再びclasses.dexの形に変換する。

root@kaldi:/android/tmp/smali# ls
out
root@kaldi:/android/tmp/smali# java -jar ../../smali-1.2.6.jar -o classes.dex out/
root@kaldi:/android/tmp/smali# ls -l
total 8
-rw-r--r-- 1 root root 3768 Jan 21 00:21 classes.dex
drwxr-xr-x 3 root root 4096 Jan 21 00:05 out

apkファイル内のclasses.dexを、zipコマンドで入れ替える。

root@kaldi:/android/tmp/smali# zip ../android1.apk classes.dex
updating: classes.dex (deflated 50%)

apkファイルは署名する必要があるので、jarsignerコマンドを使って署名する。まず署名関連のファイルを削除する。

root@kaldi:/android/tmp# zip -d android1.apk META-INF/*
deleting: META-INF/MANIFEST.MF
deleting: META-INF/CERT.SF
deleting: META-INF/CERT.RSA

そして再び署名する。jarsignerコマンドを使うためには.keystoreファイルの用意などが必要だが、本題ではないのでここでは細かいプロセスは省略する。Javaのキーストア関連の知識がないと少し面倒かもしれない。

root@kaldi:/android/tmp# jarsigner -verbose android1.apk test
Enter Passphrase for keystore:
   adding: META-INF/MANIFEST.MF
   adding: META-INF/TEST.SF
   adding: META-INF/TEST.RSA
  signing: res/layout/main.xml
  signing: AndroidManifest.xml
  signing: resources.arsc
  signing: res/drawable-hdpi/icon.png
  signing: res/drawable-ldpi/icon.png
  signing: res/drawable-mdpi/icon.png
  signing: classes.dex

これでアプリケーションの改造は終了だ。android1.apkをインストールして文字列を入力し、Enterキーを押すと、その文字列はクリップボードにコピーされる。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:携帯コンテンツ

アンドロイドで有料アプリを無料でダウンロード [アンドロイド 改造]

※追記
裏マーケット特集「地瓜」「applanet」(ザ・ウイルス感染最前線!) 
この裏マーケット使えばアプリ一個でほぼ同じ事が出来るようになりました。 ただし、ウイルス感染が現実的になってきたので要注意です

もう身も蓋も無いタイトルですね。これは。

まず野良アプリについて。
Androidを使いこなそう!その弐
読んでない方はまず見てください。

一部例外を除き、ほとんどの有料アプリは一回DLすれば、そのファイルをSDにバックアップなりして取り出して簡単にコピー出来るわ、他の端末に入れれるわ、自由に使えます。
コピーガードが無い&マーケットを通さなくてもインストール出来るアンドロイドならではの技です。

そのようにして、ネット上には誰かが買った有料アプリのコピー(=野良アプリ)が大量に転がっています。
探し方は、

「(アルファベットで)アプリ名 apk」

でグーグル検索すれば海外のアップローダー中心にわんさか出てきます。
※アップローダー=不特定多数の人がファイルを自由にアップできるシステムです。

多少やりずらいですが、PC使わなくても直接アンドロイドで出来ます。
むしろ、怪しいサイトでPCがウイルス感染するよりは気分的にスマフォ直の方がウイルスくらう事も(今のところは)少ないので気軽です。

よく出てくるアップローダーで
・hotfile
・megaupload
は登録無しでもDL出来るのでよく使ってます。

また、有料版の見分け方は
xxxxPro
xxxxfull
xxxxPlus
xxxxClack
等とつくファイル名が多く、

逆に無料版=Liteです。
これはマーケットで普通に取れるのでいちいち野良使う意味が無いですね。
最初に無料版をSDにバックアップとって、どんなファイル名か一回確認しておくと探すときに少し楽です。

また、ZIPで圧縮してありインストール出来ない場合、

①とりあえずアストロで開いてみる
②開かない場合解凍してみる
③解凍後複数ファイルに分かれてしまい失敗したら
解凍せずにファイル名を編集→リネーム(拡張子変換といいます。)
で最後の.zipを.apkに変更してみる

※この方法は「.text」等に偽装してある場合にも使えます。

④それでも駄目ならPCに移して解凍して「.apk」ファイルが出てきたら成功→また戻す
↑こういうときDropBoxが便利。

だいたいこの流れでほとんどいけます。たまに失敗もありますが。

※一部記事削除のお知らせ ゲームロフト系とかメジャーなゲームは時期的にそろそろ嫌な予感がするんで外しました。 自力でがんばってくださいね。 それでは、また! 

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:携帯コンテンツ
アンドロイド 改造 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。