Win32

GetTickCountとtimeGetTime

GetTickCount関数とtimeGetTime関数がどうやって実装されているか確認し、分解能の違いが実現できている理由を読み解きます。[NTKRNL]のタグがついている時点でアレなわけですが「どっちを使うべき」的な情報がほしい方は回れ右。特に明示しない場合、x86 XP…

バイナリアン御用達(?) CryptBinaryToString

CryptBinaryToString というAPIを使うと、バイナリ列を文字列に変換できる。 BOOL WINAPI CryptBinaryToString( __in const BYTE *pbBinary, // バイナリ列 __in DWORD cbBinary, // バイナリ列のサイズ __in DWORD dwFlags, // 変換書式のフラグ __out_opt …

例外がユーザー空間に落ちてくるまで

しばらくカーネル空間で例外ハンドラをいじって遊んでいたのだけど、ユーザー空間でも似たような遊びができる気がしたので下調べのメモ。常に以下のフローをたどるわけではなく、あくまで発生した例外がユーザー空間に伝播するときのフロー。x86はWindows XP…

(削除済)ジャンクションが脅威となるケース

勘違いだったので削除しました。すみません。 ここで書いていたジャンクションを利用したケースではファイルを開けないので、論点としたかった問題は起こりません。 名無しさんありがとうございます。 以下内容。 低い権限のユーザーが作成したジャンクショ…

main が呼ばれる前に実行されるコードのコールスタック

プログラムのエントリーポイントは、main関数ではなく、PE内に定義されたアドレスであることはよく知られているが、それより以前にコード実行できるTLS Callbacksという仕組みはあまり知られていない。TLS CallbacksはPE内に適切にセクションとディレクトリ…

SetThreadContextが変な動きをする

64bitプロセスがSetThreadContextをCONTEXT_CONTROLフラグなしで行うと、対象になったスレッドのCSがなぜか勝手に0x23になる場合がある。64bitプロセスのCSは本来0x33で、0x23はWOW64(32bitプロセス)のための値である。この異常な変更が行われると、そのス…

ハードウェアブレークポイントを使う

コードを実際に書いたことがなかったので書いてみた。デバッグレジスタは本来特権レベルでなければ操作できないが、Windowsの場合はSetThreadContext系APIを使って設定することができる。 ハードウェアブレークポイントはソフトウェアブレーク(int 3)ほど…

IsBadXXXPtrを使うべきでないたった一つの理由

Windows Vista および Windows Server 2008 アプリケーション互換性解説書 以前のバージョンの Windows では、IsBadReadPtr および IsBadWritePtr 関数を使用してパラメータを検証していました。Windows Vista および Windows Server 2008 では、これらの関…

興味深いソースがあるサイト

Collaborative RCE Tool Library!というサイトを見つけた。 ここにあるツール、結構面白いものが多く、たとえばDream of every reverserは Engine used to perfrom stealth memory trace of a target. なツールでソースコードが付いている。ソースもPoCのよ…

Windows 7でのAppInit_DLLsの変更

AppInit_DLLsとはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\以下にあるレジストリーキー群で、 AppInit_DLLs インフラストラクチャにより、アプリケーションは任意の DLL をすべてのユーザー モード プロセスに読み込むこと…

WOW64にコストがかからないなんてのは幻想

Instead of using the x86 system-service call sequence, 32-bit binaries that make system calls are rebuilt to use a custom calling sequence. This calling sequence is inexpensive for WOW64 to intercept because it remains entirely in user mod…

WOW64サービステーブルをWinDbgでみる

WOW64サービステーブルというのは、wow64.dllのなかに実装された関数テーブル。WOW64プロセスがシステムコールを発行したときに、x64システムコールへの変換を行うため透過的に呼び出される。前回までの調査でこいつのシンボル名はwow64!ServiceTablesである…

WOW64からのシステムコール概要

もうちょっと実装よりに、Win7(RC)x64 で以下のコードを用いて違いを確認する。 int _tmain() { __debugbreak(); FlushProcessWriteBuffers(); return 0; } FlushProcessWriteBuffersは、引数なし戻り値なしのとても単純なAPIなので、処理の概要を理解するの…

WOW64からのシステムコール概要 のまとめ

要点をコードで。Win7(RC)x64でのみ動くので、あくまで例示ということで。 まとめ1:eaxにシステムコール番号、ecxにディスパッチ関数番号を入れて、call dword ptr fs:[0C0h] するとWOW64からシステムコールを発行できる このプログラムは、自分でWOW64のN…

WOW64で和訳の練習

WOW64 Implementation Details Best Practices for WOW64 Registry Reflection in Windows あたりを読んでめぼしい情報をメモ。さすがに全部和訳するのはだるい。 (追記)日本語のドキュメントが公開されました! 64 ビット Windows プログラミング ガイド

積ん読

なぜか変換できる@Ubuntu 9.04。 ここ1ヶ月ぐらいで技術書だけでもかなり溜まってきた。あと2冊ぐらい増える雰囲気なのでどう考えても赤字;) それにしてもこの冷やし中華、ノリノリである。

Windows 7でのリファクタリング

Microsoft Partoner Program - Windows 7にある「Windows 7 アプリケーション品質(互換性 信頼性 パフォーマンス)を高めるための開発者ガイド」には、Windows 7へ移行するにあたっての開発者向け変更点が記述されている。Windowsプラットフォームの開発者は…

DllMainとデッドロックに関するクイズで和訳の練習

The Old New ThingからDllMainとデッドロックに関するクイズA process shutdown puzzleで和訳の練習。やっぱり口語的な文は訳しづらい。

DllMainとデッドロックで和訳の練習

DllMainでCreateThreadは動作するでコメントをいただいたAnother reason not to do anything scary in your DllMain: Inadvertent deadlockを使って和訳の練習。 DllMainでおこり得るデッドロックの例について。訳はのっけから怪しい感じだ。その辺の論文よ…

少しキモイドライバのロード方法

Trojan.Ascessoのテクニカルレポートに初めて見るドライバのロード技法が使われていた。 Trojan.Ascesso は、実行されると、最初にカーネルメモリー内に自身のドライバをロードしようと試みます。 (中略) スタートアップ時に実行され、また現在カーネルメ…

Windowsダンプの極意

金額に比して内容がないような。と批判的に書く前に、自力でデッドロックのひとつも調査してから言ってやろうと、NtQueryObjectがデッドロックする問題をWinDbgで調査した。が、よくわからんかった^^; 著者にはぜひ、WinDbgのコマンドや出力の詳細について掘…

%wZ書式指定子はCRTで

UNICODE_STRING型のポインタを渡すことで構造体内部に持つ文字列を出力することができる。UNICODE_STRINGのバッファはNULL終端ではないため、正しく処理するにはこの%wZ書式指定子を使用すべきである。%wZ書式指定子はWin32のprintf系APIに渡すと、Windowsの…

NtOpen系のハンドルもCloseしなければならない

ドキュメントを参照する(たとえばNtOpenSymbolicLinkObject) ドキュメントに従って使用する ドキュメントに指示がないのでハンドルはCloseしない ここまでは正しい姿勢だ。 ただし追加で注意も必要。上記例は、明らかにハンドルリークする。Closeする方法…

名前付きカーネルオブジェクトの一覧を取得

任意のプロセスが使用している名前付きカーネルオブジェクトの一覧を取得したいのですが。 それ、Win32でできるよ! ということで書いてみた*1。よければどうぞー(named_kernel_object.cab)。 動作確認は 2008x64 のみだけど、適当に修正すれば大抵の環境…

ユーザーモードからシステムコール番号調べられる

ジャン☆ と思ったので書いてみた(sdt_dump2.cab)。2000以降のx86/x64両方で動作する見込み。コマンドラインにシンボルを参照するパスを指定することができる。以下のように指定すればカレントディレクトリにシンボルをダウンロードしてくれる。コマンドラ…

DllMainでCreateThreadは動作する

以前にDllMainでCreateThreadを呼び出すことはWindowsのマナーに反する、という指摘をもらったことについて、その理屈がわからんという趣旨の記事を書いた。今日知ったのだがBest Practices for Creating DLLsに拠れば、これは条件付きで正しく動作する。こ…

BSOD Properties NT公開

ブルースクリーン(Blue Screen Of Death = BSOD)の色を変更するGUIツールです。よければどうぞー(BSOD_Properties_NT.cab / Readme)。

DNSとかのキャッシュのメモ

Windowsのネットワーク関連のメモリキャッシュに関連して、いくつか気づいたところをひとまずメモ。やりたいことが一杯あって、このネタで掘り下げられそうも無いのが残念。 種類 >arp -a MACアドレスとIPアドレスの対応表 >route print ルーティングテーブ…

TrayExpand 更新

x64に対応したTrayExpandです。今回の更新はバグ取り。よければどうぞー(TrayExpand.cab - Readme)。 あと、Win2000でte.exe終了時にexplorer.exeが死ぬ問題をいくらか改善。何が原因か簡単にメモすると、

コンソールの共有

別セッションにCreateProcessする、psexecもどきを実装したところまではよかったのだけど、はて、サービスとして起動されたプロセスの標準出力を、既存のCUIプロセスのコンソールウィンドウに出力させるにはどうすればいいんだろう。 サービスプロセス内での…