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

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

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

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

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

Himawari の異常な暗号

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

デジタル表現論・第4回

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

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

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

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

ログを活用したActive Directoryに対する攻撃の検知と対策

削除済みVSSスナップショットの復元

ex04_2012.ppt

Prog1_6th

メソッドのまとめ

Microsoft PowerPoint - CproNt02.ppt [互換モード]

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

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

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

スライド 1

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

Prog1_10th

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

Apache Tomcatにおけるクロスサイトリクエストフォージェリ(CSRF)保護メカニズム回避の脆弱性

Prog1_15th

Prog1_10th

Microsoft PowerPoint - prog03.ppt

デジタル表現論・第6回

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

Prog2_9th

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

スライド 1

ToDo: 今回のタイトル

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

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

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

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

PowerPoint プレゼンテーション

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

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

Java知識テスト問題

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - prog09.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog09.ppt

Javaプログラムの実行手順

はじめての暗号化メール(Thunderbird編)

基本情報STEP UP演習Java対策

文字列操作と正規表現

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

Blojsom におけるクロスサイトスクリプティングの脆弱性

Microsoft PowerPoint - 5Chap15.ppt

JAVA入門

プログラミング入門1

slide5.pptx

NFC ucode タグのメモリフォーマット規定

Microsoft Word - no15.docx

設問 println はそこで指定されている内容を出力して改行するものである. 一方,print は内容を出力して改行しないものである. 下記のプログラムそれぞれについて出力結果がどうなるか回答せよ. 下記のプログラム - を実行すると, fms という文字列が 回表示される. プログラム - vo

Microsoft PowerPoint ppt

Microsoft Word - NonGenTree.doc

Prog2_10th

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

NTTannual2015.indd

ポインタ変数

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

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

ポインタ変数

intra-mart Accel Platform

Microsoft Word - ECALSDS01_Vr1_5_080305_ja.doc

Apache Axis2 におけるXML署名検証不備

情報システム設計論II ユーザインタフェース(1)

Prog1_2nd

Program Design (プログラム設計)

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Microsoft PowerPoint - ruby_instruction.ppt

UID S307-NDEF

JavaプログラミングⅠ

Microsoft Word - problem3.doc

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

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

プログラミング入門1

JavaScript 演習 2 1

PowerPoint プレゼンテーション

C言語講座 ~ファイル入出力編~

制御システムのセキュリティリスク軽減対策~EMET のご紹介~

JavaプログラミングⅠ

DVIOUT-exer

FW ファイルアップロード ダウンロード機能利用ガイド Version 年 9 月 21 日富士通株式会社 i All Right Reserved, Copyright FUJITSU LIMITED

プログラミング入門1

Microsoft PowerPoint - lec10.ppt

基礎プログラミング2015

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

PowerPoint Presentation

EEM コンテキスト ライブラリのコマンド拡張

プログラミング入門1

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

PowerPoint プレゼンテーション

メソッドのまとめ

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:06 +09'00' JEB Plugin 開発チュートリアル 第3回 バイトコードについての理解 JEB Pluginからバイトコードを扱う方法 を修得する 一般社団法人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. CODEITEM 2

DexCodeItem DEX の code_item にはメソッド定義が入っている JEB では DexCodeItem クラスが担当している DexCodeItem クラスで使用できる主なメソッド getdebuginfo() メソッドのデバッグ情報を取得 getexceptionitems() メソッドの Exception Item を取得 getinstructions() パースされたバイトコード命令列を取得 DexDalvikInstruction を取得できる Count 系 getinputargumentcount() getinstructioncount() getoutputargumentcount() getregistercount() 3

DexDalvikInstruction バイトコード命令が含まれている getmnemonic() オプコードを文字列化したもの getcode() バイナリデータ getoffset () method の先頭からのバイト数 getparameters() オペランドの取得 ( 配列 ) その他 getswitchdata() packed-switch, sparse-switch getarraydata() fill-array-data switch, array 系の命令の時に使われる 4

例題 1 メソッド内のオプコードを表示しよう DexCodeItem クラスと DexDalvikInstruction クラスの使い方を理解する 5

[ 例題 1] メソッド内のオプコードの表示 課題 Assembly View でフォーカスしているメソッドのオフセットとオプコードの一覧を表示する Plugin を作成する期待する出力結果 ヒント フォーカス位置の Signature の取得 View CodePosition getsignature() 命令列の取得 CodeItem.getInstructions() offset とオプコードの取得 DexDalvikInstruction.getOffset() DexDalvikInstruction.getMnemonic() 6

例題 1 の解答例 Opcode.py 7

[ 解説 ] メソッド内のオプコードの表示 view = self.ui.getview(view.type.assembly) sig = view.getcodeposition().getsignature() 1. md = self.dex.getmethoddata(sig) if md is None: print "method data is not found." return 2. code_item = md.getcodeitem() if code_item is None: print "code item is not found." return print "[%s] assembly" % sig 4. for inst in code_item.getinstructions(): print "%#08x: %s" % (inst.getoffset(), inst.getmnemonic()) 3. 5. 8

[ 解説 ] メソッド内のオプコードの表示 1. フォーカス位置の Signature を取得する sig = view.getcodeposition().getsignature() 1. Signature を使用して method_data を取得する md = self.dex.getmethoddata(sig) 2. method_data から code_item を取得する code_item = md.getcodeitem() 3. code_item からバイトコード命令列を取得し for inst in code_item.getinstructions(): 4. offset とオプコードを出力する print "%#08x: %s" % (inst.getoffset(), inst.getmnemonic()) 9

DexDalvikInstruction.Parameter Dalvik インストラクションのパラメータを扱うクラス gettype() パラメータ種別を取得する TYPE_REG (0) register レジスタ番号 TYPE_IMM (1) immediate value 即値 TYPE_IDX (2) Index (method id, field id, class id ) TYPE_BRA (3) branch target goto 相対アドレス TYPE_RGR (4) register range レジスタの範囲 getvalue() パラメータ値を取得する 型と命令に合わせて変換が必要 そのままは使えない Index だったら どの List を参照する命令かによって参照するものが違ってくる特定の命令だけを参照する場合は 決め打ちで対応できる invoke-xxx 必ずメソッド ID の参照どの命令がどのような引数を取るかは仕様を参照 http://www.android-decompiler.com/help/dalvik-bytecode.html#op_nop 10

DexDalvikInstructions DexDalvikInstructions クラスの各メソッドの関連図 CodeItem getinstructions() 返り値 : OpCode (String) getmnemonic() offset 0x0000 0x0004 0x0006 0x000a getparameters() gettype() 返り値 : Int 返り値 : Long getvalue() 返り値 : DexDalvikInstruction.Parameter[] 返り値 : List<DexDalvikInstruction> 11

例題 2 メソッド内のメソッド呼出一覧を表示しよう DexDalvikInstruction クラスをもっと理解する 12

[ 例題 2] メソッド内のメソッド呼出一覧の表示 課題 Assembly View でフォーカスしているメソッドの命令の中でメソッド呼び出ししているもの一覧をコンソールに表示する期待する出力結果 ヒント CodeItem DexDalvikInstructions の取得 DexDalvikInstruction. getmnemonic() で命令を取得 invoke-xxx だったらメソッド呼び出し パラメータの取得 DexDalvikInstruction.getParameters() メソッド呼び出しの場合はパラメータ値はメソッド Index 対応するメソッド名を表示する Dex.getMethodSignatures() 13

例題 2 の解答例 InvokedMethod.py 14

[ 解説 ] メソッド内のメソッド呼出一覧の表示 view = self.ui.getview(view.type.assembly) sig = view.getcodeposition().getsignature() md = self.dex.getmethoddata(sig) if md is None: print "method data is not found." return 1. code_item = md.getcodeitem() if code_item is None: print "code item is not found." return 2. print "[%s]" % sig print "invoked method" method_ids = [] for inst in code_item.getinstructions(): if inst.getmnemonic().startswith('invoke-'): 3. mid = inst.getparameters()[0].getvalue() if mid not in method_ids: method_ids.append(mid) msigs = self.dex.getmethodsignatures(false) for mname in map(lambda x: msigs[x], method_ids): print " t" + mname 4. 5. 15

[ 解説 ] メソッド内のメソッド呼出一覧の表示 1. フォーカス位置の Signature を取得し method_data を取得する 2. method_data から code_item を取得する 3. code_item からバイトコード命令列を取得する 4. DexDalvikInstruction.getMnemonic() でバイトコード命令を取得する バイトコード命令が invoke- から始まるものであれば メソッド呼び出しなのでその値を取得する メソッド呼び出しの時のパラメータ値はメソッド Index になる 5. Dex.getMethodSignatures() で Signature 一覧を取得し メソッド Index に対応するメソッド名 (Signature) を表示する 16

例題 3 メソッド内のオプコードを表示しようその 2 DexDalvikInstruction.getParameters() 17

[ 例題 3] メソッド内のオプコードの表示その 2 課題 演習 2 で作成したメソッドのオフセットとオプコードの一覧を表示する Plugin を次のとおり拡張する全てのオペランドの種別と値の表示を追加する種別は Long から文字列に変換する 文字列 REG, IMM, IDX, BRA, RGR 期待する出力結果 ヒント オペランド ( パラメータ ) の取得 DexDalvikInstruction.getParameters() 種別 : DexDalvikInstruction.Parameter.getType() 値 : DexDalvikInstruction.Parameter.getValue() 18

例題 3 の解答例 Opcode2.py 19

[ 解説 ] メソッド内のオプコードの表示その 2 param_type = [ 'REG', 'IMM', 'IDX', 'BRA', 'RGR', ] 種別を配列に入れておく for inst in code_item.getinstructions(): print "%#08x: %s params:%d" % (inst.getoffset(), inst.getmnemonic(), len(inst.getparameters())) for p in inst.getparameters(): print " t%s: %d(%#x)" % (param_type[p.gettype()], p.getvalue(), p.getvalue()) gettype() の返り値を添字として指定すれば 目的の文字列を取得できる 20