PE形式インポートライブラリ変換ツール
hacklib - PE Import Library Converter
概要
- これまでのあらすじ
- あれから三年――
- PEバイナリ小型化技術は新たなステージへ
- 特殊ライブラリを構築してインポートテーブルを駆逐せよ!
VC++2013の足を撃て
クラウなんとか? ……コレジャナイ!
友だの!! 愛だの!! ……コレジャナイ!
窓辺ななみは終わったコンテンツなのか――
スク水眼鏡が組み合わさりWindows 2000最強ピヨちゃんではなかったのか?(震え声)
駄目だ駄目だ!諦めちゃ駄目だ!藍澤姉妹コラボでテコ入れはよ
教授!! これは一体!?
インポートライブラリの変換ツールです。
SDKなどに付属する既存のインポートライブラリの内容を解析し、インポートテーブルの情報を極力省いた独自のインポートライブラリを構築します。
近年、デフォASLRの時代を迎えてますます不要になりつつあるインポートテーブル(インポートアドレステーブルと名前が似ていて紛らわしい)ですが、過去に
hackbinで領域の削除に果敢に挑んだものの、夢叶わず挫折。リンク後の実行ファイルの加工は難易度が高く、バイナリ師の匠の技が必要だったのです。
バイナリ小型化の最大の障壁であるこの領域は、インポートライブラリの情報をもとにリンク時に生成されます。
ならば!リンクする前の段階まで遡ってバイナリを書き換えてしまえばよろしい。
ライブラリの互換性が超絶に低下するなど瑣末な問題といえるでしょう。かまわん、やれ!
……てな感じで
hackbinとうまく組み合わせて最強の小型プログラム作成支援に使うべし!
使いかた
実行ファイルをパスの通ったフォルダに置くだけで使えます。レジストリ等は使っていないので不要になったらいつでも削除可能です。
何も指定せずに実行すると以下のように使い方が表示されます。
- PE Import Library Converter Version 0.01
- usage: HACKLIB [options] filename ...
- /D Dump
- /N No hint
- /O num Optimize
- example:
- hacklib --dump i386/GEAR.lib
- hacklib amd64/K10.lib arm/MARV.lib > danger.txt
- hacklib danger.txt
hacklib [-n] ライブラリ名1 ライブラリ名2... > ソースファイル名
- 指定したライブラリ内のインポート情報を解析し、再構築用のソースファイルを生成
hacklib [-o2] [-n] ソースファイル名
- ソースファイルの内容をもとにカレントディレクトリにインポートライブラリを構築
構築したインポートライブラリは、元のものと比べてごっそり情報量が減っている。間違って既存のファイルに上書きしちゃうと取り返しがつかないので注意な。
hacklib -d ライブラリ名
- 指定したライブラリの内容をダンプする
オプション指定
-O0 インポートテーブルをなるべく保存
-O1 インポートテーブルをなるべく削除 (デフォルト動作)
-O2 インポートテーブルを完全に削除
-n ヒント情報を強制的に削除 (圧縮率向上 / ロード速度低下)
-d ライブラリの情報を表示
技術情報
- 既存ライブラリとの比較
ImpLib SDK v1.8♺という同様の目的のライブラリ(変換ツール?)が既に存在する。既存ライブラリと比べた本ツールのメリットを書いておく。
- 64ビットバイナリ(x64)等に対応 (既存ライブラリは32ビット専用)
- 生成されるライブラリのサイズが小さい (オブジェクトデータは半分程度)
- ヒント情報を正しく保持できる (既存ライブラリのように削除することも可能)
- リンカの実行時最適化がうまくいかない現象に対処するため、複数の出力フォーマットを選べる (既存ライブラリと同程度の情報を持つフォーマットでも出力可能だが、既存ライブラリと同じ問題が発生する)
- MSのPEバイナリ仕様に書かれていない部分
Longnames Memberは内容を空にしても問題ない。そもそも存在しなくてもリンカでエラーは出ない。一応MS仕様には「必ず入れろ」とあるのでダミーのヘッダを入れてある。
各COFFオブジェクトは2バイト境界で配置。オブジェクト内およびオブジェクト間のパディングには$0Aを使用しているようだ。0でも問題なさげ。
ファイル末尾はパディング不要。
@comp.idとかイラネ
MSのライブラリアンの出力フォーマットにあわせる場合、第二ヘッダのメンバヘッダへのオフセットテーブルは単調増加するように並べるべき。しかし滅茶苦茶な順序でも動く。ちなみにImpLib付属のライブラリはこのテーブルの順序が揃ってない。その上中身が重複していたり、ヘッダとデータの領域が重なっていたりと、バイナリ弄り屋には不満が残る作り。hacklibならきっちり詰め込みますぜ。
- VC++との組み合わせ
-O2でインポートテーブルを完全に削除したライブラリをVC++と組み合わせた場合、たまにリンカの実行時最適化(LTO)がうまく働かない場合があるかも。LTOでIAT側を活用して(インポートライブラリで作られるジャンプ命令を使わずに)サイズを縮小するような最適化がうまく働かず、あげくの果てに変なインライン展開でサイズがごっそり増える現象がたまに発生する模様。その場合はデフォ設定(-O1)を使うべし。
- その他ネタ
xda-developpersの
dll-to-lib♺みたいな代物(dumpbin+lib)と組み合わせると便利カモ。
ちなみにARMのライブラリを食わせるとジャンプ命令が変なものが出ちゃうけど仕様。LTOがうまくいけばどうということはない。どうしてもって時はバイナリを手動で書き換えて使ってね。
改版履歴
- 2013.08.04 v0.01
夢と希望と出オチ感!
構想三年、制作二年の時を経てhacklib爆誕!……のはずだったんだけど、
hackbinの機能がポ○モン進化しすぎて不要になっちゃった。
co (Twitter♺)