私はVistaマシン上のシステム所有プロセスにDLLを注入することに興味があります。 VirtualAllocEx、WriteProcessMemory、CreateRemoteThreadといった伝統的な方法を使ってこれについて説明します。ただし、これはSYSTEMプロセスで動作するため、ターゲットプロセスを開く前に、注入プロセスでSeDebugPivilegeを有効にします。SeDebugPrivilegeを有効にしてSYSTEMプロセスにWriteProcessMemoryを実行します。 (C、Vista)
int EnableDebugPriv(LPCTSTR name) {
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
if(!OpenProcessToken(GetCurrentProcess(),
/*TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY*/
TOKEN_ALL_ACCESS,
&hToken))
return 0;
if(!LookupPrivilegeValue(NULL,name,&luid))
return 0;
tkp.PrivilegeCount=1;
tkp.Privileges[0].Luid=luid;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hToken,false,&tkp,sizeof(tkp),NULL,NULL))
{
printf("!AdjustTokenPrivileges - %d\n",GetLastError());
return 0;
}
if(GetLastError()==ERROR_NOT_ALL_ASSIGNED)
{
return 0;
}
CloseHandle(hToken);
return 1;
}
ここで、SE_DEBUG_NAME
定数が名前として渡されます。
SeDebugPrivilegeを有効にした後、私は(道に沿ってすべての戻り値をチェック)、ターゲットプロセスを開くのLoadLibraryを配置、空間を割り当て、メモリにDLLのパスを書き込み、スレッドを作成するプロセスを経る:
if(NULL==(p=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)pid)))
...
if(NULL==(loadLib=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),
"LoadLibraryA")))
...
if(NULL==(dllBuff=(LPVOID)VirtualAllocEx(p,
NULL,
strlen(dllPath)+1,
MEM_RESERVE|MEM_COMMIT,
PAGE_READWRITE)))
...
if(NULL==WriteProcessMemory(p,
(LPVOID)dllBuff,
dllPath,
strlen(dllPath),
&written))
...
if(!CreateRemoteThread(p,
NULL,
NULL,
(LPTHREAD_START_ROUTINE)loadLib,
(LPVOID)dllBuff,
NULL,
NULL))
...
dllPath
はDLLのパスのchar *(明らかに)であり、pid
はターゲットプロセスのPIDです。これらの値は両方ともコマンドラインから取り込まれ、使用前に検証されます。
問題は、8(「不足しているストレージ」)を返すCreateRemoteThreadまで何もエラーを返さないということです。しかし、WriteProcessMemoryはプロセスにバイトを書き込んでいません。呼び出し後、書き込まれた変数は常に0です。書き込み中のバイトはありませんが、関数は失敗していません。なぜこれが起こっているのか分かりません。私はSeRestorePrivilegeのような他の特権を調べましたが、SeRestorePrivilegeはすべてのプロセスへの書き込みアクセスを約束していますが、何も動作しません。
私はこのプログラムを管理者権限で実行しています。
注:このWriteProcessMemoryおよびCreateRemoteThreadの問題は、上位の特権ユーザー(SYSTEM、LOCAL SERVICEなど)に対してこのプログラムを実行した場合にのみ発生します。それは私が所有するプログラム(同じ特権)に対して完全に動作します。
編集:ここにソース全体へのリンクがあります。 http://pastebin.com/m77110d8e基本的なエラーチェックのほかに他に多くのことはありませんが、おそらくそれが役に立ちますか?
スレッドを作成すると、ターゲットプロセスに暗黙的にスタックが割り当てられます。何故それが失敗したのかは分かりません。 –