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

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

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

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

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

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

Microsoft PowerPoint ppt

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

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

オブジェクト指向プログラミング・同演習 5月21日演習課題

解きながら学ぶJava入門編

Microsoft PowerPoint - ruby_instruction.ppt

Prog1_10th

JavaプログラミングⅠ

JAVA入門

Prog2_12th

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

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

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Java演習(4) -- 変数と型 --

Java講座

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

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

GEC-Java


Prog2_9th

人工知能入門

レコードとオブジェクト

基本情報STEP UP演習Java対策

PowerPoint プレゼンテーション

Prog1_15th

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Prog1_6th

Java知識テスト問題

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

新・明解Java入門

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

listings-ext

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

JavaプログラミングⅠ

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

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Himawari の異常な暗号

デジタル表現論・第4回

グラフの探索 JAVA での実装

プログラミング入門1

Microsoft PowerPoint - prog03.ppt

プログラミング入門1

基礎計算機演習 実習課題No6

Make the Future Java FY13 PPT Template

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

文字列操作と正規表現

PowerPoint プレゼンテーション

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

Prog2_9th

Microsoft Word - problem3.doc

Ruby演習テキスト1

PowerPoint Presentation

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

2

Microsoft PowerPoint - lec10.ppt

Program Design (プログラム設計)

Prog1_10th

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

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

gengo1-11

Spacewalkにおけるクロスサイトフォージェリ(CSRF)の脆弱性

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

Javaプログラマー早期育成ドリル ~コードリーディング編~ 解答

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft PowerPoint - chap10_OOP.ppt

メソッドのまとめ

Microsoft Word - problem5.doc

JavaプログラミングⅠ

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

PowerPoint プレゼンテーション

Oracle Java 標準ライブラリ AtomicReferenceArray クラスにおけるデシリアライズに関する脆弱性

5 継承とは クラス図 98 7 参照の自動型変換 参照の自動型変換 クラス図の見方 クラス図の書き方 継承 継承してクラスを作る インスタンスの初期化 継承の効果を確認する

プログラミング入門1

JavaプログラミングⅠ

PowerPoint プレゼンテーション

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

全商情報処理検定プログラミング部門 サンプル問題1級解説

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

プログラミングA

MySQL Connector/J における SQL インジェクションの脆弱性

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

Taro-cshプログラミングの応用.jt

プログラミング入門1

ex04_2012.ppt

Microsoft PowerPoint - prog08.ppt

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

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

Prog2_10th

コーディング基準.PDF

Java言語 第1回

JavaプログラミングⅠ

プログラミングA

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:35:58 +09'00' JEB Plugin 開発チュートリアル 第4回 JEB PluginからASTを扱う 一般社団法人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

AST とは 抽象構文木 Abstract Syntax Tree 言語 ( プログラム ) の意味に関係のないものを取り除きツリー構造で表したもの 2

JEB と AST JEB では DEX をデコンパイルして得られる Java コードが AST として内部的に管理されている JEB PluginからASTにアクセスするためのAPIが用意されている jeb.api.jebinstanc e getdecompiledclasstree(partial_sig) getinnterclasses() jeb.api.ast.class getdecompiledmethodtree(partial_sig) getfields() jeb.api.ast.field getmethods() jeb.api.ast.method getbody() jeb.api.ast.block Souce Code AST 3

AST の取得 JEB Plugin から AST を取得するには 事前に Java のコードにデコンパイルしておく必要がある JebUI.decompileClass() メソッドの取得 JebInstance.getDecompiledMethod(sig) jeb.api.ast.class.getmethods() Method のリストを取得 クラスの取得 JebInstance.getDecompiledClassTree(sig) 4

例題 1 AST クラス / メソッドを取得しよう jeb.api.ast.class の使い方を理解する 5

[ 例題 1] AST クラス / メソッドの取得 課題 Assembly View のキャレット位置のクラス (jeb.api.ast.class) を取得し 内包するフィールドとメソッドの一覧を表示する期待する出力結果 ヒント デコンパイルの実行 decompileclass() キャレット位置の Signature の取得 getcodeposition().getsignature() jeb.api.ast.class の取得 getdecompiledclasstree() メソッド / フィールド一覧の取得 6

例題 1 の解答例 DisplayAstClass.py 7

[ 解説 ] AST クラス / メソッドの取得 sig = view.getcodeposition().getsignature() print sig キャレット位置の Signature を取得する csig = re.sub(r'->.*$', '', sig) ui.decompileclass(csig, False) 取得した Signature を Class Signature に変換し クラスをデコンパイルする cls = jeb.getdecompiledclasstree(csig) print "target class: " + cls.gettype() print "[Method]" for m in cls.getmethods(): print " t" + m.getsignature() print "" print "[Field]" for f in cls.getfields(): print " t" + f.getsignature() Class Signature を使用して クラスを取得する メソッドを取得 フィールドを取得 8

AST のコードの取得 jeb.api.ast.method.getbody() このメソッドを使用するこ とで Block を取得できる jeb.api.jebinstance getdecompiledclasstree(partial_sig) getdecompiledmethodtree(partial_sig) jeb.api.ast.class getinnterclasses() getmethods() getfields() jeb.api.ast.method jeb.api.ast.field 階層図の中での getbody() の位置 getbody() jeb.api.ast.block メソッドのコード全体を Block として取得する 9

IElement すべての AST ノードのベースとなるインターフェイス IElement.getSubElements() AST の子ノードのリスト取得 IElement.replaceSubElements () AST の子ノードの置き換え <<interface>> IElement getsubelements() <<interface>> IElement <<interface>> IElement <<interface>> IElement 10

AST のクラス構造 <<interface>> IElement Statement NonStatement Assignment Break Call Compound Continue Block ForStm IfStm ArrayElt Constant Expression Identifier すべてのノードが Statement( 文ノード ) の NotStatement( 非文ノード ) のサブクラスで構成 Statement 文ノード Assignment: 値の代入 ( 例 str = abc ;) Call: メソッド呼び出し ( 例 str.startswiths( a ); ) NonStatement 非文ノード Expression: 式 ( 例 : a+b) 11

AST の要素を辿る IElement.getSubElements() では直下のノードしか取得できないが 再帰的に呼び出すことで すべてのノードを取得できる def traverse(elem): print elem. class. name for e in elem.getsubelements(): traverse(e) 12

例題 2 AST の traverse IElement.getSubElements() の使い方を理解する 13

[ 例題 2] AST の traverse 課題 Java View でキャレット位置のメソッドの AST を traverse する AST の各ノードのクラス名を表示する期待する出力結果 ヒント コードブロックの取得 : jeb.api.ast.method.getbody() IElement.getSubElements() element を受け取って 名前を表示するメソッドを作る def traverse(self, elem, depth=0): getsubelements() 再帰呼び出し 再帰呼び出しで depth を +1 する print( [%d] %s % (depth, class_name)) クラス名の取得 : obj. class. name 14

例題 2 の解答例 TraverseAst.py 15

[ 解説 ] AST の traverse sig = view.getcodeposition().getsignature() if sig in dex.getmethodsignatures(false): else: method = jeb.getdecompiledmethodtree(sig) self.traverse(method.getbody()) print "caret is not in method.: " + sig getsubelements() を再帰的に呼び出すメソッドに処理を投げる def traverse(self, elem, depth=0): print("%s[%d]%s" % (' '*depth, depth, elem. class. name )) for e in elem.getsubelements(): self.traverse(e, depth+1) getsubelements() は直下のノードしか取得できないので これを再帰的に呼び出すメソッドを作る 16

IElement を Traverse する限界 if 文 条件 true の時 false の時 IElement.getSubElements() で Traverse するだけでは限界がある 子ノードのリストが取得できるだけでそれぞれが何を表しているかまでは分からない 各クラスに実装されているメソッドで情報を取得する 17

ノード固有の情報へのアクセス方法 例 : IfStm(if 文 ) の場合 条件の取得 IfStm.getBranchPredicate(index) 条件一致した時の処理の取得 IfStm.getBranchBody(index) else 節の取得 IfStm.getDefaultBlock() 例 : Call( メソッド呼び出しの場合 ) 呼び出すメソッドの取得 Call.getMethod() 引数の取得 Call.getArguments() 条件は複数存在する可能性があるので index 指定する if(p) { b } else if(p1) { b1 } else { b2 } 18

例題 3 Method ノードの Signature の出力 jeb.api.ast.method.getsignature() の使い方を理解する 19

[ 例題 3] Method ノードの Signature の出力 課題 Java View でキャレット位置のメソッドの AST を traverse する AST の各ノードのクラス名を表示する 但し Traverse しているノードが Method の場合は [METHOD] Signature のように表示する期待する出力結果 ヒント Traverse 自体は先ほどと同じ オブジェクトのクラス判定 if isinstance(obj, jeb.api.ast.method): メソッドの Signature の取得 jeb.api.ast.method.getsignature() 20

例題 3 の解答例 TraverseAst2.py 21

[ 解説 ] Method ノードの Signature の出力 sig = view.getcodeposition().getsignature() if sig in dex.getmethodsignatures(false): else: method = jeb.getdecompiledmethodtree(sig) self.traverse(method.getbody()) print "caret is not in method.: " + sig def traverse(self, elem, depth=0): if isinstance(elem, jeb.api.ast.method): else: name = "[METHOD] %s" % elem.getsignature() name = elem. class. name print("%s[%d]%s" % (' '*depth, depth, name)) for e in elem.getsubelements(): self.traverse(e, depth+1) 取得したノードが jeb.api.ast.method のインスタンスかどうかチェックする 再帰的に呼び出す Method ノードの Signature を出力する 22

[ 参考 ] API リファレンス API のリファレンス http://www.android-decompiler.com/apidoc/ jeb.api Plugin から JEB にアクセスするためのクラスが含まれているパッケージ jeb.api.ast AST を使用するためのクラスが含まれているパッケージ jeb.api.dex JEB で開いた DEX ファイルを使用するためのクラスが含まれているパッケージ jeb.api.ui JEB の UI を操作するためのクラスが含まれているパッケージ 23

[ 参考 ] jeb.api.ast.statement 継承クラス Class Desc. Example Assignment 値の設定 str = abc ; Break ブレイク文 break; Call メソッド呼び出し str.equals( abc ); Compound Continue ブロック continue; Definition 変数定義 int a; Goto Label goto label; labelxx: Monitor syncronize monitor_enter(lock); monitor_exit(lock); New インスタンス生成 new Exception( aaa ); NewArray int[] a = {1,2,3}; Return return true; Throw 例外投入 throw e; 24

[ 参考 ] Compound (Statement) Class Example Block { } DoWhileStm do { } while(true); ForStm for(i=0; i<10; i++) { } IfStm if (xxx) { } else { } SwitchStm switch(xxx) { case 0:.. } TryStm try { } catch (Exception e) { } WhileStm while (true) { } 25

[ 参考 ] jeb.api.ast.nonstatement 継承クラス Class Desc. Example ArrayElt 配列要素へのアクセス array[index] Class Constant クラス 定数 Expression 式 a + 1 a * ((int)b foo()) Field Identifier InstanceField Method StaticField TypeReference フィールド 変数 インスタンスフィールド メソッド スタティックフィールド 型参照 ( オブジェクトのクラス確認 ) if (pet instanceof Dog) { } 26