データ解析 Mach-Oのオブジェクトファイルの関数を呼び出す いわゆるBinary Hacksにあった、「オブジェクトファイルを自力でロードする」のMach-O版をやってみました。MacではオブジェクトファイルもまたMach-O形式で出力されています。 今までの記事の内容で多くのことがわかってきました。特に関数フックが実現出来るようになった今、形式が同じであるオブジェクトファイルのロード&実行はそんなに難易度の高いもの... 2014.06.28 データ解析プログラミング
データ解析 Mach-Oでの関数フック ようやくここまでたどり着きました。以前 elfバイナリでやったことのMach-O版です。 実行体は外部.soの何かの関数を呼び出しているとして、その関数への参照をフックしたいという要求に応えてみたいと思います。 フックした後の関数は実行体内部に存在するとします。 これらの関係を図示すると以下のようになります(図は以前の使い回しです…)。 今までに調査してわか... 2014.06.22 データ解析プログラミング
データ解析 Mach-O編 Import関数の列挙 前回の最後で dysymの undef extsymbolのほうがImport関数の情報として正しそうと感じていましたが、どうやらそれは間違っていたようです。正しくはIndirectテーブルから求めていくのが正解のようです。 このIndirectテーブルは struct dysymtab_command の indirectsymoff で示される場所に配置... 2014.06.15 データ解析プログラミング
データ解析 セグメント&セクションの補足と外部関数への依存について mach-o編もずいぶんと進んできたので、PEの時にやったように依存するライブラリ情報だけでなく、関数名を表示したいを思って色々を調べてみました。その結果、条件限定かもしれませんがうまく表示できるようになりました。今回はその内容をメモとして公開しようと思います。正しい方法とか指摘してくれると幸いです。 セクションについて 今までのセクション情報で表示できてい... 2014.06.09 データ解析プログラミング
データ解析 mach-oの外部関数解決の仕組みを追う(__stubs, __nl_symbol_ptr, __la_symbol_ptrセクション) C/C++ミックスの実行体を使うようにしたら、実は __la_symbol_ptr セクションは存在しつつ、 __got セクションが出現しました。__la_symbol_ptrセクションが示す先が PLT.GOT相当の領域っぽいなぁと思っていただけに、そのものズバリなセクションが出現して驚きでした。この__gotセクションも他の同種セクションのように扱うだ... 2014.06.05 データ解析プログラミング
データ解析 Mach-OのFatバイナリ(Universal Binary) について Universal Binaryというものがあります。これは1つのバイナリの中に2つ以上の実行体が格納されたものです。32bit版と64bit版のバイナリを1つのファイルで配布することも出来るようになるので便利なシロモノです。Windowsもこういったものを採用してほしかったと思います。 この形式の場合次のようなヘッダがファイル先頭に付きます。 struct... 2014.06.04 データ解析プログラミング
データ解析 Mach-O セグメントとセクション補足 dysymtab_commandの中身を調べていたのですが、よくわからない感じだったので後回しにすることにしました。今回はセグメントやセクションの中身の方を調べていきたいとおもいます。 現在すでにわかっているセグメント&セクションの情報はこんな感じでした。 : LC_SEGMENT_64 __PAGEZERO vmaddr=0x000000000000000... 2014.05.31 データ解析プログラミング
データ解析 Mach-O 実行体のロードコマンドの情報を表示してみる 前回は概要とセクション情報表示程度だったので、今回はもうすこしロードコマンドの表示をすすめて見ようと思います。 ロードコマンドの種別によって、そのコマンドのサイズと型が決まります。 あとはこれに応じてメンバの表示を行ってみたものが下記の結果です。 ロードコマンドの型の準備と表示が面倒なだけなので、プログラムコードは割愛します。 Mach-O 64bit CP... 2014.05.28 データ解析プログラミング
データ解析 Mach-O形式の調査~導入編~ PEフォーマットは以前調査したので、今度はApple製品で採用されているMach-O(マークオー)形式の調査をしてみたいと思います。まずは最小サンプルの実行体を用意して既存ツールでちょっと確認してみます。 #include int main() { printf( "Hello,world\n" ); return 0; } #include int mai... 2014.05.26 データ解析プログラミング