タグ

ブックマーク / egggarden.hatenadiary.org (18)

  • やや温め納豆

    概要 OllyBonEはページテーブルを操作してメモリの属性を変更することで、ヒューリスティックにアンパックを行うプログラムです。ページテーブル操作によるアンパッキング技法の先駆けとして有名です。 ソースは以下からダウンロードできます。 http://www.joestewart.org/ollybone/ 続きを読む 今回は、仮想化技術で隠されたプロセスを検出する、という研究のお話をします。また、これについて試験的にWindows 7(x86)で動くものを実装してみましたので、その実装詳細と評価も交えていきます。実装はこちら。 続きを読む 期待に応えたいと考えたからだと思う。ただ自分の生活の中にこいつがどうやっていこんで行くのかは、正直見えてない。自分の中での価値をほとんど失ってしまっているので。 GetTickCount関数とtimeGetTime関数がどうやって実装されているか確認

    やや温め納豆
    odawara
    odawara 2010/02/01
  • ドライバにオレオレ署名を埋め込む - やや温め納豆

    x64 Windowsではデジタル署名されていないドライバはロードすることができないので、自分でビルドしたりその辺から拾ってきたドライバを読ませるときは適当な(オレオレの)署名をする必要がある。 んだけど、よくコマンドを忘れるのでドライバに署名を埋め込む手順をメモ。 ドライバのビルドプロンプトを起動して、 >makecert -r -pe -ss PrivateCertStore -n CN=<発行者名> test.cer Succeeded >certmgr /add test.cer /s /r localMachine PrivateCertStore CertMgr Succeeded >Signtool sign /v /s PrivateCertStore /n <発行者名> <ドライバファイル名> The following certificate was selected:

    ドライバにオレオレ署名を埋め込む - やや温め納豆
    odawara
    odawara 2010/01/11
  • Rootkitのようなデバイスドライバファイルを回収するツール - やや温め納豆

    デバイスドライバがカーネルにロードされたタイミングで、そのファイルをバックアップコピーするデバイスドライバを書いてみました(drvcopy.cab)。よければどうぞー。 マルウェアは、往々にしてデバイスドライバを使ってきます。デバイスドライバを動的に生成し、カーネル空間にロードさせます。有名なことですが、一度ロードされたドライバは、ディスク上から削除することができます。そして、デバイスドライバを使うマルウェアは、痕跡を消すためにかなりの割合で、自身が生成したデバイスドライバをディスク上から削除してしまいます。 削除されたドライバはProcess Explorerなどで確認すると一見してわかります。 デバイスドライバのファイルが削除される前に回収するには、デバッガで生成元にアタッチし、CreateServiceをブレークすることでディスク上にある状態で停止させることができます。 ただし、この

    Rootkitのようなデバイスドライバファイルを回収するツール - やや温め納豆
  • NT_ASSERTマクロ - やや温め納豆

    ドライバ開発の際には従来広くASSERTマクロが使われているが、最近のWDKではASSERT定義周辺に、NT_ASSERTというマクロが追加されている。このマクロは現時点では文書化されていないものの、ASSERT Yourself - The New NT_ASSERT Macro in the WDKにおいて、詳細に独自研究されている。 ここでは以下にこの文書の要約を示す。 ASSERTと同じ点 DBGが定義されていなければ(つまりFree Buildであるならば)完全に消去される。 渡した条件式がFALSEになるとカーネルデバッガにトラップされる。 その状況でカーネルデバッガが接続されていないとBSODになる。 ASSERTと異なる点 __annotation組み込み命令を使い、条件式中の文字列をPDB側に埋め込む(バイナリには埋め込まない)。 Vista以降でしかトラップ(ブレーク)

    NT_ASSERTマクロ - やや温め納豆
  • 堕落したWindowsプログラマのレベル -10 - やや温め納豆

    XPのタスクマネージャーで表示される「メモリ使用量」の意味を理解している。そのうえで、これを減らすためだけの技巧を凝らす。メモリ使用量が少なく見えれば、ユーザーの満足度は上がるさ! DLLインジェクション+APIフックが便利だ。フックする際は、IATフックが有効でない場面、インラインフックが危険な場面を理解しつつも、めんどくさいと思い気にしなくなった(クラッシュするのは僕のプログラムじゃないしね)。 Undocumentedな構造体やAPIも便利だと思えば使う。興味深い機能は逆アセンブルして実現しているAPIとその使い方を特定することがある。 ユーザーモードでは力不足と感じて、カーネルモードコードの開発も選択肢に含める。コードの量も少なくてすむし、スマートな方法だ。青画面になるかもしれないが、Readmeに一言書けばいいだろうと考える。 ユーザーモードプログラミングは面倒が多いのでカーネル

    堕落したWindowsプログラマのレベル -10 - やや温め納豆
  • ページをまたがる構造体とか - やや温め納豆

    うん、わかるよ、カーネルもカーネル、コアな構造体だからページアウトとか関係ないのはわかるよ。けどさ、 version size(hex byte) size(byte) 2000 SP4 x86 0x7e0 2016 XP SP3 x86 0xb30 2864 Vista SP2 x86 0x2008 8200 7 x86 0x3620 13856 どうかしてるだろ! これ! ちなみに以下は7 x86の場合の内容。 0: kd> dt nt!_KPRCB +0x000 MinorVersion : Uint2B +0x002 MajorVersion : Uint2B +0x004 CurrentThread : Ptr32 _KTHREAD +0x008 NextThread : Ptr32 _KTHREAD +0x00c IdleThread : Ptr32 _KTHREAD +0x0

    ページをまたがる構造体とか - やや温め納豆
  • ネタ - やや温め納豆

    | | {    !      _,, -ェェュ、   | ィ彡三ミヽ  `ヽ     ,ィハミミミミミミミミミヽ、| 彡'⌒ヾミヽ   `ー  /ililハilミilミliliミliliミ| ヾ、        /iiiiイ!ヾヾミ、ミニ=ー-ミ| _    `ー―' i!ハ:.:.\\_::::::::::::::/:.| このアドレスは 彡三ミミヽ        i! ヽ:.:.:.:冫': : :::/,,∠| 彡'   ヾ、    _ノ i!::: ̄二ー:: : ::::ソ ・ ,| PatchGuardに `ー '    {ヘラ' ・_>シ;テツ"''''"| ,ィ彡三ニミヽ  __ノ ヽヘ`" 彡' 〈     | 監視されて 彡'      ` ̄       `\   ー-=ェっ | _  __ ノ  {ミ;ヽ、   ⌒   | います ,ィ彡'   ̄        ヾミミ

    ネタ - やや温め納豆
  • IsBadXXXPtrを使うべきでないたった一つの理由 - やや温め納豆

    Windows Vista および Windows Server 2008 アプリケーション互換性解説書 以前のバージョンの Windows では、IsBadReadPtr および IsBadWritePtr 関数を使用してパラメータを検証していました。Windows Vista および Windows Server 2008 では、これらの関数は禁止されました。 なぜ? IsBadXXXPtr Function ... Important This function is obsolete and should not be used. Despite its name, it does not guarantee that the pointer is valid or that the memory pointed to is safe to use. For more inform

    IsBadXXXPtrを使うべきでないたった一つの理由 - やや温め納豆
  • WinDbgでコードパッチを簡単に検出する - やや温め納豆

    !chkimgコマンドを使うと、コードパッチを簡単に検出することができる。以下の実行例では、ntカーネル(ntoskrnl.exe)に10byteの改ざんがあること、それらが5byteの改ざん2つ(そして関数フック)であることを確認している。 C:\>livekd ... 0: kd> .exepath c:\windows\system32 Executable image search path is: c:\windows\system32 Expanded Executable image search path is: c:\windows\system32 0: kd> !chkimg nt 10 errors : nt (8332b2d0-8332b349) 0: kd> !chkimg -d nt 8332b2d0-8332b2d4 5 bytes - nt!InbvSol

    WinDbgでコードパッチを簡単に検出する - やや温め納豆
  • 細かいWinデバッグテクニックのメモ - やや温め納豆

    (12/05)追記したら記事の方向性がわかりやすくなったのでタイトルも変えた(笑 UserDebuggerHotKey GUIアプリケーションに対してデバッガがアタッチしているとき、このレジストリキーで設定されたキーを押すと、ブレークが発生しデバッグすることができようになる。環境によってはできないこともあるみたい? .ocommand (WinDbg) WinDbg上でプロセスにアタッチする .ocommand メタコマンドを実行する 以後 OutputDebugString のプレフィックスに がついているものは 以降がWinDbgコマンドとして解釈される 残念ながら、カーネルランドでは利用できない。 指定したプロセスの起動を置き換える(MSDN) HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution

    細かいWinデバッグテクニックのメモ - やや温め納豆
  • main が呼ばれる前に実行されるコードのコールスタック - やや温め納豆

    プログラムのエントリーポイントは、main関数ではなく、PE内に定義されたアドレスであることはよく知られているが、それより以前にコード実行できるTLS Callbacksという仕組みはあまり知られていない。 TLS CallbacksはPE内に適切にセクションとディレクトリテーブルを作り、そのテーブルにコールバック関数のアドレスを設定しておくと、イメージローダー(ntdll.dll)によるプロセス初期化処理中に、その関数が実行されるという仕組みである。 この関数の呼び出しをブレークするのは、PEを解析して手動でブレークを置いたり、対応しているデバッガ(OllyDbg 2.0)でブレークをかけたりなどの方法があるが、呼び出しのシーケンスを把握しておいた方が、いざというとき小回りが利くので調べてみた。 調査には、このコードを使用した。このソースには以下の関数呼び出しが含まれている。 C++グロ

    main が呼ばれる前に実行されるコードのコールスタック - やや温め納豆
  • WinDbgを再起動する - やや温め納豆

    目的としてはVMwareの仮想シリアルポートでも書かれているように「WinDbgの再起動が面倒くさいよね、なんとかしたいね」というところ。 再起動させるスクリプトでも書いてしまえば良さそうなのだけれど、例のごとくDLLで実装して、メッセージフックでシステムワイドに配信するようにしてみた。フックによりDLLをロードしたプロセスはウィンドウメニューが拡張され、再起動コマンドが利用できるようになる、というもの。 ……が、この欲張りさんな実装が失敗のもとらしい。アプローチとしては以下のスクリプトを生成し、第一引数にイメージパスや引数を与えて起動させる。 WScript.Sleep(100) WScript.CreateObject("WScript.Shell").Exec(WScript.Arguments.Item(0)) WScript.CreateObject("Scripting.Fil

    WinDbgを再起動する - やや温め納豆
  • なんとなくわかるO記法 - やや温め納豆

    私のように数字に弱い人でも、状況によってはスムーズにコミュニケーションをとるために理解しておかないといけないことがある。そういうときは、とりあえず、感覚だけでもこの辺を覚えておけば概ね困らない。 困らない、と思う(笑)。たぶん。 名称 記法 だいたいこんな感じ おおよその意味 (縦軸がコストの場合の例) 定数 O(1) 定数 対数 O(log n) 大丈夫そう 線形 O(n) だめかも、、、 二乗 やばい、これやばい! 指数 わろすっす すいません、正直この辺はいっぱいいっぱいです! 参考:ランダウの漸近記法

    なんとなくわかるO記法 - やや温め納豆
  • swapgs命令 - やや温め納豆

    x64で追加された命令のひとつにswapgs(Swap GS Base Register)がある。この命令は、 現在の GS ベースレジスタ値を、MSR アドレス C0000102H(MSR_KERNELGSbase)に格納された値と交換する。 ――インテル® エクステンデッド・メモリ 64 テクノロジ・ソフトウェア・デベロッパーズ・ガイド 第 2巻(全 2巻) 特権命令で、Windowsカーネルにおいてもよく利用されている。しかし、なぜこんなチープな命令が新設されたか疑問に思ったので調べてみると、どうやら、x86のsysenterに相当するx64のsyscall命令がRSPの値を更新しないため、なんらかの方法でRSPをカーネル用に設定する必要にせまられ、その対応としてできた命令らしい。 SWAPGSは、KernelGSbase MSRのCPL 0データポインタをGSベースレジスタと交換す

    swapgs命令 - やや温め納豆
  • WOW64からのシステムコール概要 - やや温め納豆

    もうちょっと実装よりに、Win7(RC)x64 で以下のコードを用いて違いを確認する。 int _tmain() { __debugbreak(); FlushProcessWriteBuffers(); return 0; } FlushProcessWriteBuffersは、引数なし戻り値なしのとても単純なAPIなので、処理の概要を理解するのに適している。 Visual StudioではWOW64を追いかけることができないため、デバッガにはWinDbgを使う。前にも書いたとおり、WOW64の仕組みは完全にユーザーモードで完結しているので、カーネルデバッグなどは特に必要ない。 x64(ネイティブ) x64としてビルドすると、FlushProcessWriteBuffersはntdll!NtFlushProcessWriteBuffersを指しており、直ちにsyscallを発行する。 n

    WOW64からのシステムコール概要 - やや温め納豆
  • 初心者のためのkgdbによるカーネルデバッグ環境構築めも - やや温め納豆

    Windows 7 RC(x64)をホストとしてVMware Workstation 6.5.2 で2台のUbuntu 9.04(x64)を作成し、一台をデバッグする側、もう一台をデバッグされる側とする。 OSの基的な準備 両方の仮想マシンで実施する。 Ubuntu 9.04(x64)のセットアップイメージを適当なサイトからダウンロードする。 次にVMwareでハードウェアを設定する。Linuxカーネル巨大なため、デバッグされる側のハードディスクは15GB以上が必須。デバッグする側は5GBもあればOK。また、Windows 7(RC)がホストの場合、ネットワークをブリッジ接続(物理ネットワーク接続の状態を復元する:任意)にしないと仮想マシンがネットワークに接続できないことに注意。 OSをインストールして、初回起動を完了するとUpdate Managerが更新をリストしてくるので、とりあえ

    初心者のためのkgdbによるカーネルデバッグ環境構築めも - やや温め納豆
    odawara
    odawara 2009/07/02
  • WOW64からのシステムコール概要 のまとめ - やや温め納豆

    要点をコードで。Win7(RC)x64でのみ動くので、あくまで例示ということで。 まとめ1:eaxにシステムコール番号、ecxにディスパッチ関数番号を入れて、call dword ptr fs:[0C0h] するとWOW64からシステムコールを発行できる このプログラムは、自分でWOW64のNtGetCurrentProcessorNumberを定義して実行する。 // call dword ptr fs:[0C0h] // add esp, 4 #define call_X86SwitchTo64BitMode \ __asm _emit 0x64 \ __asm _emit 0xff \ __asm _emit 0x15 \ __asm _emit 0xc0 \ __asm _emit 0x00 \ __asm _emit 0x00 \ __asm _emit 0x00 \ __asm

    WOW64からのシステムコール概要 のまとめ - やや温め納豆
  • DbgPrintとVistaのメモ - やや温め納豆

    Vista以降、DbgPrintを用いた出力が表示されないとちょっと前に書いた。なんでですのんと思い調べてみたら、書いてありました。 Reading and Filtering Debugging Messages いくらか端折りながら書くと、まずXP以降にはDbgPrintExという関数が追加されており、この関数の Level パラメータではメッセージの重要度を指定する。たとえば以下の定数が用意されている。 #define DPFLTR_ERROR_LEVEL 0 #define DPFLTR_WARNING_LEVEL 1 #define DPFLTR_TRACE_LEVEL 2 #define DPFLTR_INFO_LEVEL 3 数字が小さいほど重要度が高く、DPFLTR_ERROR_LEVELを渡すと常にデバッガに文字列が送信される。逆に言うとそれ以外は状況次第。マスクの値を調

    DbgPrintとVistaのメモ - やや温め納豆
  • 1