タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2010/07/03/"ソースコードリーディングから学ぶJavaの設計と実装"読書メモ | msakamoto-sf | 2010-07-03 12:32:08 |
日記/2010/07/02/"Working Effectively with Legacy Code"読書メモ | msakamoto-sf | 2010-07-02 09:55:59 |
日記/2010/07/01/cheap2el-1.1.1 リリース | msakamoto-sf | 2010-07-01 19:50:38 |
日記/2010/06/30/SetWindowsHookEx()の実験その2 | msakamoto-sf | 2010-06-30 17:46:13 |
日記/2010/06/30/SetWindowsHookEx()の実験その1 | msakamoto-sf | 2010-06-30 17:45:57 |
日記/2010/06/30/cheap2elで遊ぶ。 | msakamoto-sf | 2010-06-30 00:49:27 |
日記/2010/06/28/普通自動車免許取得した。 | msakamoto-sf | 2010-06-28 15:07:49 |
日記/2010/06/25/PEフォーマットで遊ぶためのミニライブラリ, "cheap2el" | msakamoto-sf | 2010-06-25 14:25:18 |
日記/2010/06/18/Pythonに慣れてきたな、と思う時。 | msakamoto-sf | 2010-06-18 10:55:35 |
日記/2010/06/16/VirtualAlloc(), VirtualProtect()のメモ2 | msakamoto-sf | 2010-06-16 17:42:31 |
購入してから4年近く、本棚で埃をかぶっていた本。・・・いままでごめんなさい、ようやく読み終えることが出来ました。読感についてはamazonのレビューと大差ないのでそちらを参照して下さい。
取りあげられているソフトウェアのバージョンは2006年当時のものです。しかし、本書はソフトウェアの使い方の説明ではなく、ソースコードで使われているデザインパターンやライブラリを活用した実装技法について書かれています。そうした技法はたかだか4年が経過したくらいで有用性が下がることはありません。2010年現在でも充分楽しめる内容になっています。
本書で取りあげられているソフトウェアと、そこで何を学べるかの対応表:
ようやく読み終えました。日本語訳が出る前に購入してしまっていたので、折角なので原著のまま読破しようと挑戦したのですが、暇を見てダラダラ読んでいた為時間が掛かってしまいました。読書会で読み切った人達マジパネェっす。
ということで、読書感想文を「やるやらコンビ」でお送りします。
インポートアドレスの書き換えによるAPIのHOOKに成功し、readmeファイルなども整理出来ましたので、cheap2el-1.1.1をリリースします。
インポートアドレスの書き換えサンプルは、SetWindowsHookEx()によりDLLをInjectするのと、直接LoadLibrary()をCreateRemoteThread()で叩いてDLLをInjectする二種類を作例としてUPしています。
前回( 日記/2010/06/30/SetWindowsHookEx()の実験その1 )に引き続きWindowsでの"HOOK"の実験です。
前回は同じデスクトップ上の全てのスレッドでHOOKが発動してしまいました。今回は任意のプロセスにのみHOOKできるようにしてみます。といっても、SetWindowsHookEx()APIにはそこまでの柔軟性はありません。global-hookを使う以上は、どうしても全てのプロセスでHOOK-DLLがロードされてしまいますし、HOOK本体も実行されてしまいます。
そこで、HOOK対象となるプロセスIDをDLLの共有メモリ機能を使って予め登録しておき、HOOK本体の中で現在のプロセスIDがHOOK対象と同じ場合にのみ、HOOK処理を実行するような分岐を組み込みます。他のプロセス内で発動した場合は、分岐により何もせずSKIPするようになります。
IAT書き換えの絡みでHOOKを使いますが、その前にHOOKってどうやって使うのかサッパリだったのでMSDNで軽く調べ、サンプルを作って遊んでみました。
HOOKにはglobal hook(同じデスクトップで動作する全てのスレッドに対してHOOK)と、thread-specific hook(特定のスレッドに対してのみHOOK)がありますが、今回はglobal hookのみ取りあげます。
参考MSDNは、2010/6月末時点で以下の階層になります。
簡単にcheap2elで遊べるサンプルを紹介。
バイナリ解析の記事でよく見かけるインポート関数のHookについても、近日中にcheap2elを使った作例をUPしたいと思います。
こういう機会でも無いと取れないだろうからと、2月中頃から教習所に通い始め、3月は学生さんの混雑がすごかったので中休み、4,5,6とダラダラ通い、無事取得出来ました。
実家が千葉の田舎の方で、何かあった時に運転出来ないといろいろ面倒なんです。あと、TSUTAYA等の会員証の手続き周りで、一般的に受け付けてくれる住所証明書が欲しかったんです。
以下金額概算:
教習所代金 : 287,020円 免許センター試験・交付手数料 : 4,200円 --------------------------------------- 合計 : 291,220円
大凡30万円、というところ。教習所は、技能教習で3時間ほどオーバーしてるのでその分上乗せされている。
これで一息つけます。
今までPythonで弄っていたのを、C言語で組み直してみました。("C++"ではありません)
Cheap(安物)なPEフォーマットのLibraryということで、
cheap pe library → cheap2el
GoogleCode上にソースをUPしてます。
とりあえずCUnitのテストケースで、疑似ロードまでは動きます。お遊び用サンプルが出揃ったら、GoogleCodeのサイトの説明やWiki、バイナリダウンロード用のリリースファイルの準備などしてみます。
"アレ用の何か"( http://hp.vector.co.jp/authors/VA050396/index.html )でもサンプルコードがあるのですが、C++です。ちょっとC++を今すぐ弄るには復習が大変なので、とりあえずC言語レベルで弄れるのが欲しいなと思い作り始めました。まぁ良くある車輪の再発明ですが、勉強用の習作なのでご勘弁。
でもまぁ、どこかに目鼻立ち整えてUPっておけば、後々誰かしら(主に自分)が便利だろうな、ということでGoogleCodeの方にUPることにします。
例:
void foobar(int a, int b): ^ アチャー
Pythonだと
def foobar(a, b):
になるので。
WinXP SP3 で、実際にEXEやDLLがロードされたアドレスがどうなっているか:
アドレス値は左から順にMEMORY_BASIC_INFORMATIONの
BaseAddress, RegionSize, AllocationBase
... # ここからexe本体 # PE Header 0x00400000, 0x00001000, 0x00400000 commit,ReadOnly # ".text" 0x00401000, 0x00009000, 0x00400000 commit,ExecutableReadOnly # ".rdata" 0x0040a000, 0x00002000, 0x00400000 commit,ReadOnly " ".data" 0x0040c000, 0x00003000, 0x00400000 commit,ReadWrite # ここまでexe本体 0x0040f000, 0x7c3f1000, 0x00000000 free,Hidden # ここからkernel32.dll # PE Header 0x7c800000, 0x00001000, 0x7c800000 commit,ReadOnly # ".text" 0x7c801000, 0x00084000, 0x7c800000 commit,ExecutableReadOnly # ".data" 0x7c885000, 0x00003000, 0x7c800000 commit,ReadWrite 0x7c888000, 0x00002000, 0x7c800000 commit,CopyOnWrite # ".rsrc" + ".reloc" 0x7c88a000, 0x000a9000, 0x7c800000 commit,ReadOnly 0x7c933000, 0x0000d000, 0x00000000 free,Hidden ...
という具合に、モジュール毎に"AllocationBase"が一緒。つまり、VirtualAlloc()した後に、各セクション領域に応じてVirtualProtect()で保護モードを変更したのと同じ状態になっているようだ。