x64

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

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

SetThreadContextが変な動きをする

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

swapgs命令

x64で追加された命令のひとつにswapgs(Swap GS Base Register)がある。この命令は、 現在の GS ベースレジスタ値を、MSR アドレス C0000102H(MSR_KERNELGSbase)に格納された値と交換する。 ――インテル® エクステンデッド・メモリ 64 テクノロジ・ソフトウ…

ネタ

| | { ! _,, -ェェュ、 | ィ彡三ミヽ `ヽ ,ィハミミミミミミミミミヽ、| 彡'⌒ヾミヽ `ー /ililハilミilミliliミliliミ| ヾ、 /iiiiイ!ヾヾミ、ミニ=ー-ミ| _ `ー―' i!ハ:.:.\\_::::::::::::::/:.| このアドレスは 彡三ミミヽ i! ヽ:.:.:.:冫': : :::/,,∠| 彡' ヾ、 _ノ i!::: ̄二ー…

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 プログラミング ガイド

アセンブラめも(x64)

昨日の続き。今度はx64用にビルドしたものを追いかけてみる。スタックまわりがわからん。

TrayExpand 更新

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

64bit プロセス判定

IsWow64Process はWOW64か否かしか見ないため、次のような結果を返す。 OS 32 64 64 Process 32 32 64 結果 FALSE TRUE FALSE よって実行環境をGetNativeSystemInfo*1で調べて、64bitだった場合IsWow64Processを使う。 *1:GetSystemInfoはWOW64上ではx86を返…

Injection 実装メモ

32bit環境だけを想定した場合との違いについてメモ(例によって2008環境のことを書いているので、それ以外、特にXP/2003だと違う可能性あり)。32bitにおけるDLL注入は別のプロセスにコードを割り込ませる3つの方法の「2. CreateRemoteThread+LoadLibraryの…

64bit対応 HookInjection

別プロセスにDLLをロードさせたりアンロードさせたり、メッセージフック用のスレッドを立てたりするCUIツールです。よければどうぞー(HookInjection.cab / Readme)。

モジュールとかのメモ

#pragma comment(linker, "/subsystem:windows") extern "C" void __cdecl WinMainCRTStartup() { while (1); } こんなソースをビルドして実行する。APIをひとつもインポートしていないので、DLLはマッピングされない。わけがない。ntdll.dllがなかったらど…

64bit対応 TrayExpand

x64に対応したTrayExpandです。よければどうぞー(TrayExpand.cab - Readme)。 このアプリは本家TrayExpand ver1.12b1を改造したものです。Vista/Win2008で動作するようになっていますが、機能的な追加・削除はありません。 #2008/08/12追記 起動時に取得で…

Win2008のMUI

ひょんなことで2008もVistaと同様にMUI(多言語化)が可能であることがわかった。 Windows Server 2008 Multilingual User Interface Language Packsから必要な言語パック(isoファイル)をダウンロード ダウンロードしたisoをマウント コントロールパネルの…

Hyper-Vを使用したカーネルデバッグ環境の構築

Hyper-Vで仮想マシンを作成し、これをWinDbgによりカーネルデバッグするまでの手順。今回の例では以下の構成で話を進める。ホスト側における手順はすべて管理者権限で行う必要がある。 仮想マシン Win2003 R2 std 評価版(x64) デバッガ WinDbg(ネイティブ x6…

Win2008のサウンドカード

前回も書いたが購入したハードウェアにはサウンドカードが無い。したがって音が出ない。サーバならともかくパソコンとして使用する以上、やっぱりサウンドカードが欲しい。そこでパーツを買ったが、結論としては満足のいく音を得られていない。ノイズがひど…

Win2008の入れ物

端的にいうとDELLのサーバマシンSC1430を買った。購入前の絶対的な要件としてあげていたのは以下のとおり。 Quad Core x2(仮想マシン2つ以上並走してデバッグしたい) メモリが8GB以上(仮想マシン2つ以上並走してデバッグしたい) 仮想化支援機能を持つ(H…