JEB Plugin 開発チュートリアル 第1回

Similar documents
JEB Plugin 開発チュートリアル 第3回

JEB Plugin 開発チュートリアル 第4回

JEB Plugin 開発チュートリアル 第2回

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

Microsoft PowerPoint ppt

Prog2_9th

GEC-Java

Java言語 第1回

Prog2_6th

Prog2_12th

ToDo: 今回のタイトル

Prog2_10th

Microsoft PowerPoint - prog03.ppt

メソッドのまとめ

Oracle SOA Suite 11gコンポジットに対するSOASchedulerの構成

ファイルを直接編集する画面を切り替えることができる. 図 3 標準のレイアウトを削除する (2) グラフィカル レイアウト画面で LinearLayout(Vertical) を追加するパレットウィンドウの レイアウト の中にある LinearLayout(Vertical) をドラッグして, 編集

プログラミング基礎I(再)

EnSight 10.1の新機能

ch2_android_2pri.indd

コードテンプレートフレームワーク 機能ガイド 基礎編

think9i Oracle Internet File System i を使用した ソフトウェア開発手法 日本オラクル株式会社製品本部システム製品マーケティング部 Copyright 2001 Oracle Corporation Japan. All Rights Reserved.

Himawari の異常な暗号

JBoss Application Server におけるディレクトリトラバーサルの脆弱性

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

やってみようINFINITY-製品仕様書 品質評価表 メタデータ 編-

ポインタ変数

Apache ActiveMQ における認証処理不備の脆弱性

Prog2_6th

Prog2_10th

PowerPoint プレゼンテーション

Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説

Android Layout SDK プログラミング マニュアル

ガイダンス

プロジェクト毎に名前を指定する ( ここでは AndroidTest) 動作可能な最低バージョン メインターゲットのバージョン すべて設定してクリック チェックを外す クリック

Prog2_5th

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

MISAO with WPF

PowerPoint プレゼンテーション

ガイダンス

目次 1 はじめに 利用条件 動作環境 アドインのインストール アドインの操作方法 アドインの実行 Excel CSV の出力 テンプレートの作成 編集 テンプレートのレイアウト変更 特記

制御システムセキュリティアセスメントサービス

PowerPoint プレゼンテーション

Prog1_10th

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

MMC Unity講座

ガイダンス

HTTP 404 への対処

Javaプログラムの実行手順

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft Word - Android_SQLite講座_画面800×1280

Eclipse 操作方法 (Servlet/JSP 入門補助テキスト)

V8.1新規機能紹介記事

第1章 ビジュアルプログラミング入門

作業環境カスタマイズ 機能ガイド(応用編)

Microsoft PowerPoint - OOP.pptx

C#の基本

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

Prog2_6th

Java講座

intra-mart Accel Platform

Prog1_15th

Microsoft PowerPoint - ruby_instruction.ppt

デジタル表現論・第6回

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft Word - USB60BCR_10.doc

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

Prog2_15th

ポインタ変数

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

Hello, Android

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Prog1_6th

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog04.ppt

1

Prog1_10th

Microsoft Word - tutorial3-dbreverse.docx

基本情報STEP UP演習Java対策

WebOTXマニュアル

Prog2_2nd

TestDesign for Web

108 頁通過テスト 2. の本文 111 頁紹介文 136 頁練習 5-1 プログラム 136 頁練習 5-1 問 2 末尾に句点追加 158 頁練習問題文 161 頁練習 2-2 コメント文 166 頁練習 3-1 問 1 クラス名を挿入 178 頁通過テスト 3 文字 s を削除 180 頁コ

Oracle JDeveloper 10g ADF Creation Date: Jul 07, 2004 Last Update: Jul 08, 2004 Version 1.0

JavaScript 演習 2 1

プログラミング入門1

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

Si 知識情報処理

19 ステップで 2 大人気スクリプト言語を学ぶ GUI のあるアプリを作る STEP11 から STEP12 までまとめ 1.Python での GUI アプリ作成 Python は標準ではグラフィックスの機能を持ちませんが ライブラリを使うことで GUI のアプリを作成することができる そこで

PowerPoint プレゼンテーション

文字列操作と正規表現

HCI プログラミング 10 回目テキストフィールドとキーイベント 今日の講義で学ぶ内容 テキストフィールドの利用 キーイベントの処理 テキストフィールドの利用 1 テキストフィールドを配置してみましょう テキストフィールドを用いることにより 数値や文字列などのデータ入力が可能になります ソースファ

Java知識テスト問題

PowerPoint プレゼンテーション

とても使いやすい Boost の serialization

Python の基本事項の学習 このラーニングラボでは Python のシンタックス ( 構文 ) スコープ ( 有効範囲 ) 変数 演算子 単純な条件分岐の基本事項を学習します 目標 所要時間 :45 分 Python の基本的なインデントとスコープを理解しよう 変数の割り当て方法と使用方法を学習

スライド 1

Transcription:

Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=jp, st=tokyo, l=chiyoda-ku, email=office@jpcert.or.jp, o=japan Computer Emergency Response Team Coordination Center, cn=japan Computer Emergency Response Team Coordination Center 日付 : 2014.07.22 11:33:22 +09'00' JEB Plugin 開発チュートリアル 第1回 JEB Pluginとは 構造 UIからの情報取得と設定方法 を修得する 一般社団法人JPCERTコーディネーションセンター

目次 第 0 回 JEB とは? 第 1 回 JEB Plugin とは 1. JEB Plugin の使い方 2. JEB Plugin の構造 3. JEB の UI を利用するための API 4. View と Signature 第 2 回 DEX ファイルの構造を理解する 1. DEX ファイルの構造 2. jeb.api.dex 3. クロスリファレンス第 3 回バイトコードについての理解 1. CodeItem 第 4 回 JEB Plugin から AST を扱う 1

1. JEB PLUGIN の使い方 2

JEB Plugin とは 用意されている API を使って JEB の機能を拡張し 解析作業を効率化するためのスクリプト Java または Python で記述する JEB は Java で実装されており Python のスクリプトは Jython という Java Runtime 上で Python を実行するフレームワークを使用 Native コードを含むような Python ライブラリは使用できない Pure Python のライブラリは? JEB に同梱されている Plugin Java と Python のサンプル Plugin ライブラリを識別する Plugin Signature を生成する Plugin 次の URL からも既成 Plugin をダウンロードできる http://www.android-decompiler.com/download.php API Reference http://www.android-decompiler.com/apidoc/ 3

JEB Plugin の中で使用できる API jeb.api jeb.api.ui jeb.api.dex jeb.api.ast これら API を使用して JEB を自動操作したり DEX ファイルの操作や AST を使用してアプリを解析することが可能 4

JEB Plugin の指定方法 Plugin 実行までの流れ 1. JEBを起動する 2. 解析対象となるAndroidアプリをJEBで開く 3. Pluginを指定して実行する 実行する Plugin を指定するには 3 つの方法がある [File] [Run Script ] 実行したいファイルを選択し実行する [File] [Run last Script] (Ctrl( ) + i) 最後に実行した Plugin を実行する [Action] [Custom Actions] から選択 JEB ディレクトリ /plugins 以下にあるファイルが [Custom Actions]( 次のページ参照 ) に一覧表示される 5

Custom Actions JEB の [Action] メニューの中の [Custom Actions] に一覧表示される Plugin ショートカットキーを割り当てることが可能 メニューに一覧表示されるので Plugin の実行が簡単 Custom Actions に表示される Plugin の置く場所は環境設定で変更可能 マジックコメント Plugin の先頭行に? で始まるコメントを Custom Actions の表示やショートカットなどをカスタマイズ key=value, のような記法で記述する 記述内容 name, author, shortcut, help #? name=signature Generator, shortcut=ctrl+shift+s, author=nicolas Falliere, help=create binary signatures for library code recognition マジックコメントは JEB 起動時に読み込まれるので 途中で変更しても反映されない JEB を再起動する必要がある Plugin 自体は毎回読み込まれるので挙動は変更出来る 6

2. JEB PLUGIN の構造 jeb.api.iscript jeb.api.jebinstance 7

JEB Plugin の記述方法 Python または Java で記述する Python を使用した例 from jeb.api import IScript class SamplePluginPython(IScript): def run(self, jeb): jeb.print("this line is generated by a Python plugin") Java を使用した例 import jeb.api.iscript; import jeb.api.jebinstance; public class SamplePluginJava implements IScript { } public void run(jebinstance jeb) { jeb.print("this line is generated by a Java plugin"); } 8

JEB Plugin 例 まずは次の Plugin を書いてみよう from jeb.api import IScript class Hello(IScript): def run(self, jeb): jeb.print('hello World!!') Hello World!! を標準出力に出力するするサンプル Plugin 注意 クラス名とファイル名は同一にする class Hello Hello.py 9

jeb.api.iscript クラス from jeb.api import IScript class Hello(IScript): def run(self, jeb): jeb.print('hello World!!') JEB の Plugin の基底クラス 全ての JEB Plugin はこのクラスを継承して作成 Plugin を実行すると IScript クラスを継承したクラスの run メソッドが JEB から呼び出される IScript.run() をオーバーライドし Plugin の処理を記述する run メソッドには JebInstance オブジェクトが引数で渡される 10

jeb.api.jebinstance とは JEB のアプリケーションインスタンス IScript.run メソッドの引数として Plugin に渡される JebInstance 主な機能 JEB の操作 load, save, close, exit 情報の取得 / 設定 ユーザ情報 API バージョン コメント デコンパイルソースコード View Dex AST rename 11

例題 1 JEB Plugin を登録して実行する Hello.py 12

[ 例題 1] JEB Plugin を登録して実行する 課題 先の JEB Plugin 例 で書いた Plugin を JEB に登録して実行する Plugin はどこにおいても良い [File] [Run Script ] でファイル選択する JEB の [File] から [Run Script ] で実行する 標準出力は JEB のコンソールウィンドウに出力される JEB には出力用のメソッドとして JebInstance.print メソッドが用意されているが 代わりに Python の print 文を使用することもできる 13

例題 2 すべてのコメントをコンソールに出力する Plugin を作成する jeb.api.comment クラスの使い方を理解する 14

[ 例題 2] すべてのコメントをコンソールに出力する Plugin を作成する 課題 すべてのコメントをコンソールに出力する 期待する出力結果 注意 jeb.api.comment から取得できる情報を全て出力する 事前に JEB を使用して apk ファイルに複数のコメントを挿入してから Plugin を実行する ヒント JebInstance.getAllComments() jeb.api.comment の配列が返される どんなクラスなのか API リファレンスで確認しよう 15

例題 2 の解答例 AllComments.py 16

例題 2 で作った Plugin の実行 解答例にならって Plugin を自作し アプリ Sample01.apk に対して実行してみてください Running script /Users/vul-an/bin/jeb/plugins/AllComments.py... sig:lcom/example/sample01/mainactivity;->oncreate(landroid/os/bundle;)v, offset:6 comment: "R.layout.activity_main" sig:lcom/example/sample01/mainactivity;->oncreateoptionsmenu(landroid/view/menu;)z, offset:8 comment: "R.menu.main" 17

例題 3 Custom Actions に設定してみよう マジックコメントの書き方を理解する 18

[ 例題 3] Custom Actions に設定してみよう 例題 2 で作成した Plugin を Custom Actions に設定する P.6 の解説を参考に 使い方 Pluginをpluginsディレクトリに置く Pluginにマジックコメントを書く 名前とショートカットを指定 JEBを再起動設定したショートカットで実行する 19

[ 解答例 ] Custom Actions に設定してみよう #? name=all Comments, shortcut=shift+ctrl+c, author=vulan, help=show all comments, Plugin の先頭に "?" で始まるコメントを記述することで ショートカットキーを割り当てることができる この例では Shift キーと Ctrl キーと C を押すことで JEB の GUI からこの Plugin を実行することができるようになる 20

3. JEB の UI を利用するための API 21

jeb.api.ui クラス JebUI JEB の UI をコントロールしているクラス メッセージボックスの表示 JebUI.displayQuestionBox, displaymessagebox View の取得 JebUI.getView(View.Type) View の表示設定 JebUI.forcusView(View.Type), isvisibleview(view.type) ステータスバーの取得 表示 デコンパイルの実行 View JEB に用意されている Assembly や Java Manifest などの各 View を定義している CodePosition CodeView の位置を表すクラス Enums ( 定数値 ) BottunGroup OK OK_CANCEL YES_NO YES_NO_CANCEL IconType ERROR INFORMATION QUESTION WARNING View.Type ASSEMBLY CLASS_HIERARCHY CONSOLE JAVA MANIFEST NOTES 22

JEB のメッセージボックス JebUI.displayQuestionBox ユーザからの入力を求めるメッセージボックスを表示する JebUI.displayMessageBox メッセージボックスを表示する ButtonGroupType でボタンの種類を選択できる 23

例題 4 メッセージボックスの表示 JebUI.displayQuestionBox() JebUI.displayMessageBox() を理解する 24

[ 例題 4] メッセージボックスを表示する 以下の機能を実装してみよう displayquestionbox を使ってユーザ入力を求める 入力結果を displaymessagebox で表示する displaymessagebox は IconType と ButtonGroupType を指定する必要がある 25

例題 4 の解答例 MessageBox.py 26

[ 解説 ] メッセージボックスを表示する from jeb.api import IScript class MessageBox(IScript): def run(self, jeb): ui = jeb.getui() ret = ui.displayquestionbox("who", "Who are you?", "") print(ret) ret = ui.displaymessagebox("return", "retun value:" + ret, ui.icontype.error, ui.buttongrouptype.yes_no_cancel) print(ret) ui.displayquestionbox の返り値にはユーザが入力したデータが入っている ui.displaymessagebox の返り値にはユーザがクリックしたボタンの番号 (int) が入っている 0(cancel), 1(ok), 2(yes), 3(no) 27

4. VIEW と SIGNATURE 28

View と Signature JEBには各用途に合ったViewが用意されている ディスアセンブリしたコードを表示するAssembly View デコンパイルされたJavaのコードを表示するJava View AndroidManifest.xmlを表示するManifest View クラス階層構造を表示するClass Hierarchy View JEB には DEX 内にある Item(class, method, field) を一意に特定するための文字列 (Signature) がある Signature を使用して デコンパイル 29

View クラスの継承関係 View TextView InteractiveTextView CodeView AssemblyView JavaView XmlView (Manifest) TreeView (Class Hierarchy View) 30

View Assembly View DEX ファイルをディスアセンブリしたコードが表示されるビュー Java View デコンパイルされた Java の コードが表示されるビュー この他にも Manifest View や Notes View などがあり JEB Plugin で操作できる View は View.Type で定義されている 31

View の操作 共通 refresh CodeView(Assembly, Java) getcodeposition キャレット位置の取得 CodePosition.getSignature() AssemblyView setcodeposition キャレット位置の指定 InteractiveView getactiveitem キャレットが当たっている Item の名前 32

Signature (partial_sig) CodePosition.getSignature で得られる文字列 DEX の Item(class, method, field) を一意に特定する これをつかうことで いろんな情報が取得できる クラス Lcom/example/SomeObject; L + パッケージパス + クラス名 + ; メソッド Lcom/example/SomeObject;->getSome()String クラス名 + -> + メソッド名 + ( 引数 ) + 型 フィールド Lcom/example/SomeObject;->FieldName:String クラス名 + -> + フィールド名 : + 型 33

Signature(partial_sig) 用途 JebInstance クラス decompileclass(string), decompilemethod(string) 引数には Signature を渡す デコンパイルした文字列が返される getclass, getmethod AST の取得 JebUI.decompileClass() 指定したメソッドをデコンパイルして Java View にフォーカス AssemblyView.setCodePosition() CodePosition のコンストラクタの引数にもつかえる それで setcodeposition が出来る 34

例題 5 Decompile Codeを表示する Viewの切り替えを理解する Signatureの使い方を理解する Pluginからデコンパイルする方法を理解する 35

[ 例題 5] Decompile Code を表示する 課題 Assembly View でキャレット位置のメソッドをデコンパイルして コンソールに出力してみよう期待する出力結果 ヒント 例えばこのような流れで出力できる 1. JebUIの取得 2. Viewの取得 3. CodePositionの取得 4. Signatureの取得 5. デコンパイル結果の取得 (from JebInstance) 6. コンソールへの表示 36

例題 5 の解答例 DecompileMethod.py 37

[ 解説 ] Decompile Code を表示する # get assembly view view = ui.getview(view.type.assembly) 1. # get signature from caret position msig = view.getcodeposition().getsignature() 2. print("[%s]" % msig) print(jeb.decompilemethod(msig)) 3. 1. まず ui.getview() メソッドで AssemblyView を取得する 2. getcodeposition() メソッドで現在のキャレット位置の CodePosition を取得し getsignature() でそこの Signature を取得する 3. decompilemethod() メソッドに取得した Signature を渡すことで デコンパイルされたコードが取得できる 38

例題 6 ManifestView -> AssemblyView を便利にする View の切り替えと AndroidManifest.xml のパースを理解する 39

[ 例題 6] ManifestView AssemblyView を便利にする 課題 Manifest View でキャレット位置にある Activity の name 属性を取得して そのクラスの Assembly View にジャンプする Plugin を作成してみようヒント Signature. で始まるものは パッケージ名を足す必要があるそれ以外はそのまま使える Signature は Lxxx/yyy/Zzz; の形式 キャレット位置のアイテムの取得 View.getActiveItem() クラス一覧 JebInstance.getDex().getClassSignatures() で取得できる パッケージ名 XML Parser (xml.etree.elementtree) 40

例題 6 の解答例 ManifestJump.py 41

[ 解説 ] ManifestView -> AssemblyView を便利にする from xml.etree.elementtree import * ManifestView に表示されている XML(AndroidManifest.xml) をパースする必要があるので XML Parser を Import する # get package name xml = jeb.getmanifest() root = fromstring(xml) package = root.attrib['package'] 1. # determine target names if target.startswith('.'): target = package + target elif target.find(u'.') == -1: target = package + '.' + target 2. target = "L%s;" % target.replace('.', '/') 3. 1. getmanifest() メソッドを使用してAndroidManifest.xmlを取得し XML Parserを使用してパッケージ名を取得する 2. クラス名が "." で始まっている場合は "." の前にパッケージ名を追加する 3. "." を "/" に変換し先頭に "L" を追加して Signatureを作る 42

[ 解説 ] ManifestView -> AssemblyView を便利にする # if target class is included in dex, jump to target class if target in jeb.getdex().getclasssignatures(false): print('jump to ' + target) ui.focusview(view.type.assembly) asm_view = ui.getview(view.type.assembly) asm_view.setcodeposition(codeposition(target)) else: print('jump target is not found') 作成した Signature がクラスの Signature だった場合 focusview() メソッドで AssemblyView に切り替えて 該当するコードにキャレット位置を移動させる 43