【お知らせ】プログラミング記事の投稿はQiitaに移行しました。2012-06-19classファイルの解析JavaJavaでハローワールドをコンパイルしてclassファイルを解析してみました。仕様書を参照したため、リバースエンジニアリングではありません。HellohelloHello.classが生成されます。javapで解析JDKのツールで解析してみます。0e【追記】注釈つきのバイナリダンプを掲載しました。http://7shi.hateblo.jp/entry/2012/06/19/203632ClassFile仕様書を見ながらバイナリを読み取ります。attributes[attributes_count];}配列を読み飛ばして解析します。数値はビッグエンディアンです。配列部分のデータサイズは中身を見ないと分かりません。個数がゼロであればデータもありません。attributes[]次に配列の中身を見ていきます。実際に入っているデータは1個少ないです。これは仕様書に明記されています。constant_pool[constant_pool_count-1];なぜ1個少ないかですが、通常なら#0~#28で29個となりますが、#0は無効なデータを指すため欠番になっていて、データとして含まれないためのようです。javapの解析で出てきた#1~#28に該当します。個々のデータは以下の構造を持っています。info[];}infoの内容はtagの種類によって決まるため、まずtagを見ます。種類はP.85に列挙されています。データを1つずつ見ていきます。CONSTANT_Methodrefjavapの結果と種類が同じであることが確認できます。java/lang/Object."<init>":()VMethodrefの具体的な構造は以下の通りです。これとcp_infoの関係は、C言語で言う共用体に相当します。name_and_type_index;}このようにtagを見ながら構造を調べると以下のようになります。定数を具体的に追っていきます。name_and_type_indexclass_indexとname_and_type_indexは定数プールを指しています。#15該当する項目を見ていきます。name_indexname_indexの指す先は文字列です。"java/lang/Object"つまり、#6はクラスを表し、#22は名前を表しています。このように要素は小分けに格納されています。次にname_and_type_indexが指す#15を見てみます。descriptor_indexname_indexとdescriptor_indexは文字列を指しています。"()V"これはNameAndTypeという型の通り、名前が""、型が"()V"ということを表しています。これらを踏まえて#1を見ると、クラスが"java/lang/Object"、名前が""、型が"()V"というメソッドを表していることが分かります。この関係を図示します。"()V"今はこれ以上は追わないで、このような関係になっているということだけを把握するのに留めておくことにします。具体的にどう処理するのかは必要に応じて考えようと思います。info[attribute_length];}attribute_infoのinfoは後回しにしてダンプを読み取っていきます。先ほど後回しにしたメソッド属性を調べてみます。info[attribute_length]attribute_name_indexは属性名を示しています。"Code"Code属性のデータが含まれている、ということが分かります。Code属性の構造を示します。attributes[attributes_count];}これはattribute_infoと共用体の関係にあるため、attribute_name_indexとattribute_lengthは共通です。そのためinfoに該当するのはmax_stack以下となります。attribute_lengthcode[]はバイトコードです。解析は後回しにします。line_number_table[line_number_table_length];}デバッグ情報としてコード位置とソース行との対応関係を表しています。attribute_lengthCode属性です。attribute_lengthLineNumberTable属性です。line_numberバイトコード先ほど後回しにしたバイトコードを見ていきます。Java仮想マシンの命令コードです。P.566~568のオペコード表を参考に逆アセンブルします。returnバイトコードのインタプリタを作るには、ここを中心に見ていくと良さそうです。attributesクラスの属性です。メソッドに使われているのと同じ構造が使用されています。info[attribute_length]以上でファイル全体の構造解析は終了です。ようにソースを取得する機能がなかったた...2013-07-208086版V6のa.out8086版V6のa.outはマジックナンバーで識別することにしました。2事始め16bitのx86コードに触れたくなりました。2に目を付...2013-05-25ELFの動的リンク(1)これから2回に渡って、ELFの動的リンクについて見ていきます。(1)はてなブログをはじめよう!n7shiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。