16進数でカりントするこずを孊習する、たたはアラヌムをリバヌス゚ンゞニアリングする

はじめに



最近、16進衚蚘で数える方法を孊ぶずいうアむデアがありたした。 私は怠け者なので、九九を孊習するような方法は私には向いおいたせんでした。 少し考えお、毎朝、アラヌムをオフにする簡単な䟋を決定するこずを思い出したした数回。 時間の経過ずずもに、ほずんど目を芚たさずに解決し始めたした。 では、なぜ䟿利なものず䟿利なものを組み合わせおみたせんか

実装方法を遞択する必芁がありたす。 私はアンドロむドの開発に぀いお知らないのでそしお、私は䞀般的にJavaに粟通しおいたせん、そのような些现なこずのアプリケヌションを曞くこずはスズメの倧砲から撮圱しおいるので、既存の目芚たし時蚈を倉曎するこずにしたした。



カットの䞋で、ツヌルの説明、プロセスを16進数に倉換した結果が衚瀺されたす。 smaliコヌドdalvik仮想マシンのオペコヌド蚀語の構文の説明。 写真はほずんどなく、たくさんのブナがありたす。





.apk構造に぀いお少し



.apkアプリケヌションは、zip圧瞮されたファむルです。 内郚には、AndroidManifest.xmlずclasses.dexずいうリ゜ヌスファむルがありたす。 2぀目は、メむンアクティビティに関する情報、むンストヌル䞭に芁求される暩限のリスト、および私たちの目的にずっお重芁ではないその他の情報など、アプリケヌションに関する基本情報を含むファむルです。 classes.dex-dalvik仮想マシン甚にコンパむルされたバむトコヌド。 これをjarに倉換しお、倚少なりずも読みやすいJavaコヌドを取埗できたす。 今䜕をしたすか。



読み取り可胜なコヌドを取埗する



そのため、アプリケヌションのファむル私の堎合はAlarmDroid を取り出しお解凍したす。 これを行うには倚くの方法がありたすが、 Apk Managerを䜿甚したした 。 次に、classes.dexをjarに倉換する必芁がありたす。 これにはdex2jarがありたす。 ファむルをdex2jar.batにドラッグアンドドロップしたす。 次に、結果のjarファむルを読み取る方法を孊習する必芁がありたす。 このためにjd-guiプログラムを䜿甚したすずころで、Eclipseには同じ名前のプラグむンがありたす。

そのため、䞀郚の堎所では逆コンパむラヌが明らかに平坊化されたすが、ほずんど読み取り可胜なコヌドが埗られたした。



.smaliファむルの逆コンパむルず読み取り



Javaコヌドは読み取り専甚であるため、仮想マシンのオペコヌドで修正する必芁がありたす。 わずか256個未満です。 逆コンパむルには、䞊蚘のApkマネヌゞャヌたたはmore console apktoolを䜿甚できたす。 ただし、1぀目は2぀目の矎しいラッパヌにすぎず、いく぀かの远加機胜たずえば、解凍レベルず圧瞮レベルの遞択が远加されおいたす。 逆コンパむル埌、拡匵子が.smaliのファむルを含むフォルダヌを取埗したす。 これらはたさにオペコヌドです。 テキスト゚ディタで既に読み取るこずができたす。 しかし、䜕らかの皮類のバックラむトを手に入れるずいいでしょう。 Notepad ++には匷調衚瀺を䜿甚したしたが、 vimにも同じこずがありたす。

さお、ツヌルを䜿甚しお、最終的に把握されたので、コヌドを分析したす。



最初の血



たず、最倧10個ではなく最倧15個の数倀を生成するずよいでしょう。コヌドを調べお、䟋を生成する方法を芋぀けたす。 あなたはそれを探す必芁がありたす、朚には倚くのクラスがありたす。 しかし、メ゜ッドの名前は保存されおいるため、それほど難しくありたせん。

RingerActivityクラスで目的のメ゜ッドを芋぀けたす。



たあ、すべおが単玔なようです3぀の数字ず2぀の文字を生成し、結果をthis.xに入れたすこれは、私たちにずっお䟿利です。

これで、smaliコヌドで同じメ゜ッドが芋぀かりたした残念ながら、smaliコヌドハむラむタヌはオンラむンにありたせん。独自のコヌドハむラむトを曞くのは面倒なので、コヌドはスクリヌンショットになりたす。



メ゜ッドコヌドはさらに続きたす

コヌドは理解できたせんが、定数が最初に䞀床蚭定されおいるこずは明らかです。 したがっお、0xaを0xfに倉曎し、倉曎が正しい軌道に乗っおいるこずを確認するために倉曎を確認したす。 Apkマネヌゞャヌを䜿甚しお、収集、眲名、電話ぞの転送Android SDKがむンストヌルされおいる堎合ぱミュレヌタヌでテストできたす、むンストヌル、先のアラヌムの蚭定、埅機、監芖を行いたす。 この手順を䜕床も繰り返す必芁がありたす。 画面䞊の数字が増えたしたが、゚ラヌは発生しおいたせん。 いいね ここで、理解できないsmaliコヌドに぀いお少し理解しおみたしょう。



smaliコヌドを理解する



䞀般的に、すべおはここでかなりよく説明されおいたす 、私は簡単に、そしおロシア語で再説したす。



タむプ、メ゜ッド、フィヌルド


dalvikオペコヌドには、プリミティブずリファレンスの2皮類のタむプがありたす。 プリミティブ型は単䞀の文字たずえば、I-int、V-voidで瀺されたす 。完党なリストはこちらです。

参照型はオブゞェクトず配列、぀たり、プリミティブ型以倖のすべおです。 コヌドでは
Lpackage / name / ObjectName ;
ここで、先頭のLはオブゞェクトであるこずを意味したす。 -名前の終わり。 この゚ントリは同等になりたす
パッケヌゞ 名前 オブゞェクト名
Javaで。

配列の圢匏は[Iはintの1次元配列ですJavaではint []になりたす。 さらに枬定するには、最初に角かっこを远加したす。 [[[I == int [] [] []枬定の最倧数は255です。 もちろん、参照型の配列を䜜成できたす。たずえば、文字列の配列は次のようになりたす。
[ Ljava / lang / String ;


メ゜ッドは長い方法で指定されたす。これには、メ゜ッドを含むオブゞェクト、メ゜ッドの名前、枡されるすべおのパラメヌタヌの型、戻り倀の型が含たれたす。
Lpackage / name / ObjectName ;-> MethodName  III  Z
この䟋では、Lpackage / name / ObjectName; メ゜ッドを含むオブゞェクト、MethodNameはメ゜ッドの名前、IIIは枡されるパラメヌタヌのタむプこの堎合は3 int、Zは戻り倀のタむプこの堎合はboolです。

別のより耇雑な䟋を次に瀺したす。

メ゜ッド I [ [ IILjava / lang / String ; [ Ljava / lang / Object ;  Ljava / lang / String ;


Javaでは、このコヌドは次のようになりたす。

文字列メ゜ッド int 、 int [ ] [ ] 、 int 、 String 、 Object [ ] 


クラスフィヌルドは次のように定矩されたす。

Lpackage / name / ObjectName ;-> FieldName  Ljava / lang / String ;


ここでは、䞀般に、すべおがすでに明確になっおいたす。



登録


smaliコヌドでは、すべおのレゞスタヌは32ビットであり、任意のタむプの倀を含めるこずができたす。 64ビット倀の堎合、2぀のレゞスタが䜿甚されたす。



メ゜ッド内のレゞスタの数を決定する


レゞスタの数を決定するには2぀の方法がありたす。 .registersディレクティブはレゞスタの総数を定矩し、.localsはメ゜ッドパラメヌタヌではないレゞスタの数を決定したす。



パラメヌタを枡す


メ゜ッドが呌び出されるず、匕数は最埌のレゞスタに分類されたす。 ぀たり メ゜ッドが2぀の匕数ず5぀のレゞスタv0〜v4で呌び出された堎合、匕数はレゞスタv3ずv4に分類されたす。

非静的メ゜ッドの最初のパラメヌタヌは、垞にメ゜ッドの呌び出し元のオブゞェクトです。 したがっお、非静的メ゜ッドを呌び出す堎合

LMyObject ;-> callMe  II  V


2぀のintに加えお、LMyObjectが枡されたす。 䞡方のintの前にあり、メ゜ッドには3぀のパラメヌタヌがあるこずがわかりたす。 メ゜ッド5たたはロヌカル番号2でレゞスタの合蚈数を蚭定するず、v2はオブゞェクトを取埗し、v3は最初のintを、v4は2番目のintを取埗したす。



レゞスタの呜名


2぀のレゞスタヌ呜名スキヌムがありたす。䞀般的なvスキヌムずパラメヌタヌレゞスタヌのpスキヌムです。 䞊蚘の䟋では、5぀の汎甚レゞスタv0〜v4ず3぀のパラメヌタレゞスタp0〜p2があり、前述のようにp0ずv2およびp1ずv3、p2ずv4は同じレゞスタを瀺したす。



䞀般に、ただ埮劙な点がいく぀かありたすが、目芚たし時蚈を倉曎するこずは重芁ではありたせん。



䟋の16進数の翻蚳



smaliコヌドですべおが明らかになったので、この䟋を16進数に倉換するずよいでしょう。 私は本圓に自分の関数を曞きたくなかったので、Googleに頌りたした。 そしお、Integer.toHexStringメ゜ッドを芋぀けたした。

正しい方法を芋぀ける
private void updateProblemView  

{

TextView localTextView = this 。 問題 ;

String str1 = String valueOf  this。a  ;

StringBuilder localStringBuilder1 = new StringBuilder  str1  。 append  ""  ;

int i = this 。 p ;

文字列 str2 = op2text  i  ;

StringBuilder localStringBuilder2 = localStringBuilder1。 append  str2  。 append  ""  ;

int j = this 。 b ;

StringBuilder localStringBuilder3 = localStringBuilder2。 append  j  。 append  ""  ;

int k = this 。 q ;

文字列 str3 = op2text  k  ;

StringBuilder localStringBuilder4 = localStringBuilder3。 append  str3  。 append  ""  ;

int m = this 。 c ;

文字列 str4 = m + "=" ;

localTextView。 setText  str4  ;

}
そしお圌をsmaliコヌドで
。 メ゜ッド private updateProblemView   V

。 地元の人 3

。 プロロヌグ

。 ラむン 520

iget-オブゞェクトv0、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;->問題 Landroid / widget / TextView ;

new-むンスタンスv1、Ljava / lang / StringBuilder ;

iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> a  I

invoke - static { v2 } 、Ljava / lang / String ;-> valueOf  I  Ljava / lang / String ;

移動-結果-オブゞェクトv2

invoke - direct { v1、v2 } 、Ljava / lang / StringBuilder ;-> < init >  Ljava / lang / String ;  V

const-文字列v2、 ""

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> p  I

invoke-盎接{ p0、v2 } 、Lcom / splunchy / android / alarmclock / RingerActivity ;-> op2text  I  Ljava / lang / String ;

移動-結果-オブゞェクトv2

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

const-文字列v2、 ""

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> b  I

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  I  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

const-文字列v2、 ""

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> q  I

invoke-盎接{ p0、v2 } 、Lcom / splunchy / android / alarmclock / RingerActivity ;-> op2text  I  Ljava / lang / String ;

移動-結果-オブゞェクトv2

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

const-文字列v2、 ""

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> c  I

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  I  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

const-文字列v2、 "="

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1

invoke - virtual { v1 } 、Ljava / lang / StringBuilder ;-> toString   Ljava / lang / String ;

移動-結果-オブゞェクトv1

invoke - virtual { v0、v1 } 、Landroid / widget / TextView ;-> setText  Ljava / lang / CharSequence ;  V

。 521 行目

リタヌン- 無効

。 終了方法


䟋の最初の数倀に぀いおは、すべおが単玔です。 亀換
invoke - static { v2 } 、Ljava / lang / String ;-> valueOf  I  Ljava / lang / String ;
に
invoke - static { v2 } 、Ljava / lang / Integer ;-> toHexString  I  Ljava / lang / String ;
そしお終わりに察凊したす。 他の2぀はもう少し耇雑で、文字列に倉換されず、結果に远加されたす。 したがっお、我々は眮き換えたす
iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> b  I

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  I  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1
に
iget v2、p0、Lcom / splunchy / android / alarmclock / RingerActivity ;-> b  I

invoke - static { v2 } 、Ljava / lang / Integer ;-> toHexString  I  Ljava / lang / String ;

移動-結果-オブゞェクトv2

invoke - virtual { v1、v2 } 、Ljava / lang / StringBuilder ;-> append  Ljava / lang / String ;  Ljava / lang / StringBuilder ;

移動-結果-オブゞェクトv1
枡される倀のタむプが倉曎されおいるこずに泚意しおください。 3番目の数倀でも同じこずを行いたす。

開始-小さな文字が衚瀺されたす。 しかし、私は䜕か倧きなものが欲しい 問題ではありたせん。文字列に远加する前に远加したす
invoke - virtual { v2 } 、Ljava / lang / String ;-> toUpperCase   Ljava / lang / String ;

移動-結果-オブゞェクトv2
3぀すべおの数倀に察しお。



入力フィヌルドを倉曎



䞀般に、これは停止でき、数えるのがはるかに難しくなりたした。 しかし、珟圚、16進数から12進数ぞの倉換は蚓緎されおおり、10進数でカりントし続けおいたす。 これは私が望んでいたものではありたせん。 したがっお、入力フィヌルドを倉換する必芁がありたす。

たず、曎新メ゜ッドを完了するには、入力フィヌルドの前に「0x」を远加したす。 たあ、それは非垞に簡単です、私たちは倉曎したす
const-文字列v2、 "="
に
const-文字列v2、 「= 0x」
次に、入力フィヌルドのタむプを数倀からテキストに倉曎する必芁がありたす残念ながら、数倀の16進数では提䟛されたせん。 同様のプロパティがxmlファむルに保存されたす。 ここでは、キヌワヌドで「算術」、「数孊」などのファむルを怜玢するこずができたした。 ファむルres / layout / ringer.xmlで次の行を芋぀けたす。
  <EditText androidtextSize = "36.0dip" androidgravity = "left" androidid = "@ id / math_solution" androidvisibility = "invisible" androidlayout_width = "wrap_content" androidlayout_height = "wrap_content" android text = "@ null" androidinputType = "phone" /> 
google、inputType倀のリストを芋぀け、「text」に倉曎したす。

生成䞭に蚈算された結果ず䞀臎するように入力を倉換する方法を孊ぶ必芁がありたすRingerActivity.x、芚えおいたすか。 次のコヌドを怜玢しお芋぀けたす
...

label1621  label1912  for  ブヌル bool15 = false ;; bool15 = true 

{

ブヌル bool16 = bool15 ;

これ 。 MathProblemSolved = bool16 ;

RingerActivity localRingerActivity14 = this ;

int i9 = 2131099787 ;

TextView localTextView4 =  TextView  localRingerActivity14。 findViewById  i9  ;

これ 。 問題 = localTextView4 ;

RingerActivity localRingerActivity15 = this ;

int i10 = 2131099788 ;

EditText localEditText1 =  EditText  localRingerActivity15。 findViewById  i10  ;

これ 。 solution = localEditText1 ;

RingerActivity localRingerActivity16 = this ;

文字列 str7 = "input_method" ;

InputMethodManager localInputMethodManager =  InputMethodManager  localRingerActivity16。 getSystemService  str7  ;

これ 。 imm = localInputMethodManager ;

EditText localEditText2 = this 。 ゜リュヌション ;

9 local91 = 新しい com / splunchy / android / alarmclock / RingerActivity $ 9 ;

9 local92 = local91 ;

RingerActivity localRingerActivity17 = this ;

ImageButton localImageButton5 = localImageButton3 ;

ImageButton localImageButton6 = localImageButton1 ;

ロヌカル92。 < init >  localRingerActivity17、localImageButton5、localImageButton6  ;

localEditText2。 setOnEditorActionListener  local91  ;

...
䜕かを理解するこずは非垞に困難ですが、゜リュヌションずcom / splunchy / android / alarmclock / RingerActivityの間に䜕らかの぀ながりがあるこずがわかりたす。 最埌に刀明したした-これはsmaliファむルであり、明らかにjd-guiは適切に衚瀺できたせんでした。 そこに行き、必芁な比范方法を芋぀けたす

...

iget-オブゞェクトv1、p0、Lcom / splunchy / android / alarmclock / RingerActivity $ 9 ;-> this $ 0  Lcom / splunchy / android / alarmclock / RingerActivity ;

invoke - static { v1 } 、Lcom / splunchy / android / alarmclock / RingerActivity ;-> $ 10にアクセス Lcom / splunchy / android / alarmclock / RingerActivity ;  Landroid / widget / EditText ;

移動-結果-オブゞェクトv1

invoke - virtual { v1 } 、Landroid / widget / EditText ;-> getText   Landroid / text / Editable ;

移動-結果-オブゞェクトv1

invoke - interface { v1 } 、Landroid / text / Editable ;-> toString   Ljava / lang / String ;

移動-結果-オブゞェクトv1

new-むンスタンスv2、Ljava / lang / Integer ;

iget-オブゞェクトv3、p0、Lcom / splunchy / android / alarmclock / RingerActivity $ 9 ;-> this $ 0  Lcom / splunchy / android / alarmclock / RingerActivity ;

iget v3、v3、Lcom / splunchy / android / alarmclock / RingerActivity ;-> x  I

invoke - direct { v2、v3 } 、Ljava / lang / Integer ;-> < init >  I  V

invoke - virtual { v2 } 、Ljava / lang / Integer ;-> toString   Ljava / lang / String ;

移動-結果-オブゞェクトv2

invoke - virtual { v1、v2 } 、Ljava / lang / String ;-> equals  Ljava / lang / Object ;  Z

移動-結果v1

...
さお、入力フィヌルドから読み取った行に倧文字の翻蚳を远加したす。これは既に孊習しおいるためです。 その埌亀換する
iget v3、v3、Lcom / splunchy / android / alarmclock / RingerActivity ;-> x  I

invoke - direct { v2、v3 } 、Ljava / lang / Integer ;-> < init >  I  V

invoke - virtual { v2 } 、Ljava / lang / Integer ;-> toString   Ljava / lang / String ;

移動-結果-オブゞェクトv2
に
iget v2、v3、Lcom / splunchy / android / alarmclock / RingerActivity ;-> x  I

invoke - static { v2 } 、Ljava / lang / Integer ;-> toHexString  I  Ljava / lang / String ;

移動-結果-オブゞェクトv2
ここでは、倧文字ぞの翻蚳も远加したす。 集めお芋たす。 やった すべおが機胜したす。



おわりに



すぐにおずぎ話が圱響を及がしたすが、すぐに物事は行われたせん。 デバッガヌがないため、アプリケヌションを実行しおパフォヌマンスを確認するためのテストは非垞に難しく、数分かかり、倚くの迷惑なアクションが発生したす。

16進数で入力するために、お気に入りのSwypeキヌボヌドのデゞタルレむアりトをやり盎したかったのです。 しかし、暗号化されたレむアりトファむルは、私にずっお乗り越えられない障害ずなっおいたす。 =



これがアラヌムの最終バヌゞョンです。 残念ながら、倉曎埌に曎新が停止したした。 ええ、はい、珟圚の機胜は十分にありたす。



ご枅聎ありがずうございたした。どんな批刀も喜んでいたす



PS 16進乗算テヌブル



All Articles