窓が右に言及処理(C言語)

転載:https://www.jianshu.com/p/c0d48a675e55

問題

/エンド・システムのプロセスまたはオペレーティング・システム・サービス、権利の欠如や故障の事態が発生したを列挙すると、あなたはシステム権限にそのプロセスをアップグレードする必要があります

事前知識

各ユーザのログインシステムの窓の後、システムは、現在のアクセス許可に関連するユーザー情報は、ユーザーがログインした後に作成された各プロセスは、ユーザーのアクセストークンのコピーが含まれているアクセストークン(アクセストークン)を、生成されたときに実行しようとしているのプロセスいくつかは、アクセス保護されたカーネルオブジェクト、システムチェックアセスは、操作を許可するかどうかを決定するために、トークンという権利情報に実行したりするための特別な許可が必要です。グループ管理者のアクセストークンのメンバーは、このような、任意のプロセスを終了オフ/システムを再起動し、デバイス・ドライバのロードとシステム時刻を変更するなど、システムレベルの操作(権限)を実行するためにいくつかの権限が含まれていますが、これらの権限はデフォルトでは無効になっている、とするとき管理者グループのメンバーによって作成されたプロセスは、いくつかの操作が権限を必要と含まれている場合には、まず、自分の権限を昇格するために、これらの権限を無効にするプロセスを開く必要がありそうでないシステムは、演算処理を拒否します。プロセスは、以下の管理者グループのメンバーによって作成されたプロセスを参照して述べたように、非管理者グループのメンバーの創造のプロセスは、自分の権限を上げることができないことに注意してください。(コマンドラインは、特定のユーザー名を表示するために、ネットユーザーやネットユーザーを入力します)

Windowsは、このような「SeCreatePagefilePrivilege」などの文字列としてのシステム権限は、権限がページファイルを作成するために使用されていることを示していることを示し、「SeDebugPrivilegeは、」特権コード、マイクロソフトではこれらの文字列をデバッグするために使用し、参照を容易にするために、他のプロセスのメモリを変更することができることを示していますそのようなWINNT.Hでの#define SE_DEBUG_NAMEのTEXT(「SeDebugPrivilege」)のようなマクロのセットを定義します。権限の完全なリストは、セキュリティMSDN章にアクセスすることができます。WindowsがLUIDはローカル一意の識別子を表し、適切な権限を参照するための特権が、特権APIのクエリまたは変更LUIDニーズの文字列表現を使用していますが、それは現在のシステム内で一意である64ビットの値です。指定されたプロセスの特権への昇格権限のために、我々はまず、LookupPrivilegeValue関数を呼び出すには、この時間をLUIDに対応する権限を見つける必要があります。

簡単な紹介

限り、現在のプロセスがその上にSeDeDebug権限を持っているとして、OpenProcess上の書き込み操作(システムセキュリティプロセスやサービスプロセスを含む)任意のプロセスに関連付けられたアクセス権を指定します。管理者またはユーザーが適切な権限を与えられるのであれば、権限を有することができます。しかし、我々はOpenProcess(PROCESS_ALL_ACCESS、FALSE、dwProcessID)を実行するために、プロセス安全システムを持っている場合でも、管理者アカウントで会うか、エラーを「アクセスが拒否されました」。何がそれの原因は?デフォルトでは、元のプロセスにいくつかのアクセスでは(有効)有効になっていないので、私たちが最初に行うには、これらの権限を有効にすることです。

プロセス

1.トークン処理アクセス
権限LUID値取得2.
トークン値アクセス権限を調整3.

利用機能

OpenProcessToken();
LookupPrivilegeValue();
AdjustTokenPrivileges();

関数導入と一般的なプロセス

ハンドルは、最初のOpenProcessTokenプロトタイプ機能により得ることができるプロセスのアクセストークンを取得しなければならない、次のとおりです。

BOOL OpenProcessToken(

HANDLE ProcessHandle, //要修改访问权限的进程句柄

DWORD DesiredAccess, //要对令牌进行何种操作 PHANDLE TokenHandle //返回的访问令牌指针 ); 

最初のパラメータは、アクセスプロセスハンドルを変更することで、3番目のパラメータは、アクセストークンによって返されたポインタで、2番目のパラメータは、実行する操作の種類を指定し、そのような特権アクセス・トークンを変更するように、我々は、第二指定したいですパラメータTOKEN_ADJUST_PRIVILEGES。ハンドルこの機能により、我々は(それに最初のパラメータはGetCurrentProcess(の機能を指定する))現在のプロセスのアクセストークンを取得することができます。その後、我々は、変更するこのアクセストークンAdjustTokenPrivilegesを呼び出すことができます。
次のようにAdjustTokenPrivilegesプロトタイプは次のとおりです。

BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option PTOKEN_PRIVILEGES NewState, // privilege information DWORD BufferLength, // size of buffer PTOKEN_PRIVILEGES PreviousState, // original state buffer PDWORD ReturnLength // required buffer size ); 

最初のパラメータは、トークンハンドルアクセスである第二のパラメータは、決定された権限改変または損失(無効)すべての権利であり、3番目のパラメータは変更する権利は、構造が備えTOKEN_PRIVILEGES構造体を指すポインタであることを示しPreviousStateパラメータが空の場合、パラメータはNULLでなければならない、第四パラメータがバッファ構造PreviousStateポインタ点の大きさであり、配列の各エントリは、実行されるデータ・セットおよび権限操作の種類を示す第TOKEN_PRIVILEGESパラメータは、構造、変形前情報記憶アクセス、空であってもよいへのポインタである;最後のパラメータの実際のサイズはNewStateに構造権限が返されます。この機能を使用する前に、別の外観は、この設定をTOKEN_PRIVILEGES次の文を取ります:

typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; 

LUID_AND_ATTRIBUTES型配列に続いて、配列の要素の数PrivilegeCountを参照し、この構造LUID_AND_ATTRIBUTESの内容を見て、次のステートメント:

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; DWORD Attributes; } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES 

私たちがしたいアクションの種類を指定するための2番目のパラメータは、特権は次のように属性を一定にすることができる属性:

SE_PRIVILEGE_ENABLED //使特权有效
SE_PRIVILEGE_ENABLED_BY_DEFAULT //使特权默认有效
SE_PRIVILEGE_REMOVED //移除该特权
SE_PRIVILEGE_USED_FOR_ACCESS //取得对象或服务的访问权

SE_PRIVILEGE_ENABLEDの属性に指定された権限を使用します。最初のパラメータは権限の種類を指し、LUIDの値は、LUIDはLUID限り、それを保証するために、ローカルで一意の識別子(ローカルで一意の識別子)、私は、我々はGUIDに精通していると思うとGUID異なるがグローバルに固有の要件を指し、システムの動作中のすべての保証を意味し、部分的にしか、それにユニークです。加えて、また同じ事の64ビットのGUID、LUIDは、私たちはGUIDの長いリストの値ことを見てきたと信じて、私たちはLUID値を、対応する権限がどのくらいであることができる方法を知りたいですか?

プロトタイプは次のようである別のAPI関数LookupPrivilegevalue、この使用:

BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name PLUID lpLuid // locally unique identifier ); 

NULLができるように、それが指定されている場合、最初のパラメータは、システムの名前限り、ローカル・システムであり、第3のパラメータは、「SeDebugPrivilege」としてLUID返されたポインタ、その権限の第2のパラメータを指定名です。:WINNT.Hでもなど、マクロの一部の許可名を定義します

#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege") #define SE_DEBUG_NAME TEXT("SeDebugPrivilege") 

したがって、これらの3つの機能を呼び出すことによって、私たちは演奏の任意のプロセスへのハンドルを取得するOpenProcess(PROCESS_ALL_ACCESS、FALSE、dwProcessID)を使用して、すべてのアクセスを指定することができます

コードの実装

#include <stdio.h>
#include <windows.h> int main(void) { HANDLE token_handle; //打开访问令牌 if(!OpenProcessToken(GetCurrentProcess(), //要修改权限的进程句柄 TOKEN_ALL_ACCESS, //要对令牌进行何种操作 &token_handle //访问令牌 )) { printf("openProcessToken error"); } LUID luid; if(!LookupPrivilegeValue(NULL, //查看的系统,本地为NULL SE_DEBUG_NAME, //要查看的特权名称 &luid //用来接收标识符 )) { printf("lookupPrivilegevalue error"); } TOKEN_PRIVILEGES tkp; tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //调整访问令牌权限 if(!AdjustTokenPrivileges(token_handle, //令牌句柄 FALSE, //是否禁用权限 &tkp, //新的特权的权限信息 sizeof(tkp), //特权信息大小 NULL, //用来接收特权信息当前状态的buffer NULL //缓冲区大小 )) { printf("adjust error"); } printf("sucessful"); return 0; }

おすすめ

転載: www.cnblogs.com/jszyx/p/12521539.html