タグ

ブックマーク / eternalwindows.jp (8)

  • EternalWindows

    C言語によるWindowsプログラミングの解説サイトです。 書籍Windows Internalsの解説はこちらをご確認ください。

  • コンテナオブジェクト

    フォルダやレジストリキーのような階層を持つオブジェクトは、コンテナオブジェクトと呼ばれることがあります。 コンテナオブジェクトに設定されているACEは、その下位に存在するコンテナオブジェクトとリーフオブジェクトに継承させることができるため、 コンテナオブジェクトとリーフオブジェクトのセキュリティは基的に矛盾しません。 つまり、フォルダを読み取り専用にした場合は、その下位に作成したファイルも通常は読み取り専用になります。 ここで言うデフォルトとは、セキュリティ記述子を指定せずにファイルを作成することであり、 ACEが継承ACEであるかどうかは、次のコードで確認することができます。 GetAce(pDacl, i, (LPVOID *)&pAce); if (pAce->Header.AceFlags & INHERITED_ACE) { // ACEが継承ACEのときに実行される } He

  • プロセスの昇格

    プロセスのセキュリティコンテキストを昇格させるという行為は、慎重に行われるべきといえます。 たとえば、UACであれば昇格時にダイアログを表示するようにし、 実際に昇格を許可するかどうかの判断をユーザーに任せています。 これは当然といえば当然の話であり、プロセスが自動でセキュリティコンテキストを 昇格させることができるのであれば、何のために制限ユーザーとして実行しているのか分かりません。 しかしながら、プロセスが既に管理者として動作している場合は、 プロセスのセキュリティコンテキストをより強力なSYSTEMに昇格させることができます。 この方法を理解しておけば、たとえばWindows XPでSE_TCB_NAME特権が必要になった場合、 それをAdministratorsに割り当てて一度ログオフする必要はありません。 プロセスをSYSTEMとして実行することにより、SE_TCB_NAME特権

    sankaseki
    sankaseki 2009/03/02
    プロセスの昇格
  • 偽装とログオン

    通信相手とコネクションを確立して相手のトークンを偽装する。 通信に使用したAPIが名前付きパイプならImpersonateNamedPipeClient、 SSPIならImpersonateSecurityContextになる。 上記の表の最初2つの方法は、特定のユーザーを偽装します。 よって、特定のユーザーとしてコードを実行したい場合は、これらの方法を利用することになります。 3つ目の方法は、既存のユーザーに特定の制限を加えて動作させたい場合に利用します。 アプリケーションがユーザーをログオンさせるというのは、 少し不思議に思えるところがあるかもしれません。 ログオンというのはPCを起動して、これからユーザーがWindowsを利用するときのみに 必要となるものではないでしょうか。 確かにこれはログオンの代表的な例ですが、実際のところログオンはいつでも行ってよいのです。 ユーザー名とパスワ

    sankaseki
    sankaseki 2009/03/02
    偽装とログオン
  • DACLの設定

    sankaseki
    sankaseki 2009/03/02
    アクセス権
  • サービスのクライアント

    今回は、前節のサーバーのクライアントを作成します。 クライアントは名前付きパイプでサーバーに接続し、 サーバーがパイプに書き込んだ値を受信します。 #include <windows.h> int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { TCHAR szData[256]; DWORD dwResult; HANDLE hPipe; hPipe = CreateFile(TEXT("\\\\.\\pipe\\GetComputer"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hPipe == INVALID_HANDLE_VALUE) { if (GetLastError() == ERRO

    sankaseki
    sankaseki 2009/02/25
    サービスのクライアント
  • SIDの作成

    たとえば、タスクマネージャを起動してみるとこれらのアカウントで 動作するプログラムが存在することが確認できます。 上記したSIDの取得方法は既に説明済みです。 たとえば、AdministratorsのSIDを取得したいのであれば、 LookupAccountNameの第2引数に"Administrators"と指定すればよいだけです。 しかし、AllocateAndInitializeSidを使えばより簡単にSIDを作成できます。 BOOL AllocateAndInitializeSid( PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD dwSubAuthority0, DWORD dwSubAuthority1, DWORD dwSubAuthority2, DWORD dwS

    sankaseki
    sankaseki 2009/02/25
    SIDの作成
  • モード切替え

    通常のウインドウの状態から任意のタイミングでフルスクリーンに切り替えるようなとき、 ウインドウの状態のことをウインドウモードと呼び、 フルスクリーンの状態のことをフルスクリーンモードと呼びます。 前節で説明したように、これらの切り替えはChangeDisplaySettingsを呼ぶことによって可能ですが、 モードの切り替えというのは単純に解像度を変更するだけではありません。 ウインドウスタイルの変更も必要ですし、ウインドウの位置も変更しなければなりません。 それらの処理を1つの関数に実装すると、恐らく以下のような感じになると思われます。 void ChangeMode(HWND hwnd) { DEVMODE dv; g_bWindowMode = !g_bWindowMode; ShowCursor(g_bWindowMode); if (g_bWindowMode) { Change

    sankaseki
    sankaseki 2008/05/14
    プロセス間通信
  • 1