вот код для инъекции дллки
работает отлично на Висте, и выполняется без ошибок на XP без SP
но инъекции никакой не происходит, в чем может быть дело?
BOOL WINAPI InjectLib(DWORD dwProcessId, const char *pszLibFile) {
BOOL fOk = FALSE; // Assume that the function fails
HANDLE hProcess = NULL, hThread = NULL;
char* pszLibFileRemote = NULL;
__try {
// Get a handle for the target process.
Message("5");
hProcess = TryOpenProcess(dwProcessId);
if (!hProcess)
{
::MessageBox(0, "you have not admin permissions, please try to open program in Admin mode", "error", MB_OK|MB_ICONERROR);
return false;
}
Message("6");
// Calculate the number of bytes needed for the DLL's pathname
int cch = 1 + strlen(pszLibFile);
int cb = cch * sizeof(char);
// Allocate space in the remote process for the pathname
pszLibFileRemote = (char*)
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL) __leave;
//MessageBox(0, "3", 0, 0);
// Copy the DLL's pathname to the remote process's address space
if (!WriteProcessMemory(hProcess, pszLibFileRemote,
(PVOID) pszLibFile, cb, NULL)) __leave;
//MessageBox(0, "4", 0, 0);
// Get the real address of LoadLibraryW in Kernel32.dll
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
if (pfnThreadRtn == NULL) __leave;
//MessageBox(0, "5", 0, 0);
// Create a remote thread that calls LoadLibraryW(DLLPathname)
hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, pszLibFileRemote, 0, NULL);
if (hThread == NULL) __leave;
//MessageBox(0, "6", 0, 0);
// Wait for the remote thread to terminate
WaitForSingleObject(hThread, INFINITE);
fOk = TRUE; // Everything executed successfully
Message("ok");
}
__finally { // Now, we can clean everthing up
if (fOk == FALSE)
MessageBox(0,"Inject Failed", 0, 0);
//MessageBox(0, "failed", 0, 0);
// Free the remote memory that contained the DLL's pathname
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
}
return(fOk);
}
HANDLE TryOpenProcess(DWORD dwProcessId)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, dwProcessId);
if (hProcess == NULL)
{
if (GetLastError() == ERROR_ACCESS_DENIED)
{
OSVERSIONINFO osvi;
// определяем версию операционной системы
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
// мы больше ничего не можем сделать, если это не Windows NT
if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
return SetLastError(ERROR_ACCESS_DENIED), FALSE;
// включим привилегию SE_DEBUG_NAME и попробуем еще раз
TOKEN_PRIVILEGES Priv, PrivOld;
DWORD cbPriv = sizeof(PrivOld);
HANDLE hToken;
// получаем токен текущего потока
if (!OpenThreadToken(GetCurrentThread(),
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
FALSE, &hToken))
{
if (GetLastError() != ERROR_NO_TOKEN)
return 0;
// используем токен процесса, если потоку не назначено
// никакого токена
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
&hToken))
return 0;
}
_ASSERTE(ANYSIZE_ARRAY > 0);
Priv.PrivilegeCount = 1;
Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);
// попробуем включить привилегию
if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv),
&PrivOld, &cbPriv))
{
DWORD dwError = GetLastError();
CloseHandle(hToken);
return SetLastError(dwError), FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
// привилегия SE_DEBUG_NAME отсутствует в токене
// вызывающего
CloseHandle(hToken);
return SetLastError(ERROR_ACCESS_DENIED), FALSE;
}
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, dwProcessId);
}
}
return hProcess;
}