HANDLE CreateRemoteThread( HANDLE hProcess, // handle to process to create thread in LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes DWORD dwStackSize, // initial thread stack size, in bytes LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // pointer to argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to returned thread identifier ); 如果用以上方法实现,要注意参数的正确兴,lpStartAddress应是LoadLibrary的地址,lpParameter是DLL的地址,而且该地址应该位于那个要注射的进程之内,所以要涉及到WriteProcessMemory的调用,另外有些进程需要有调试权限才能注射的
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // pointer to argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);
如果用以上方法实现,要注意参数的正确兴,lpStartAddress应是LoadLibrary的地址,lpParameter是DLL的地址,而且该地址应该位于那个要注射的进程之内,所以要涉及到WriteProcessMemory的调用,另外有些进程需要有调试权限才能注射的
http://nowcan.yeah.net找找。
BOOL CreateRemoteThreadLoadDll(LPCWSTR lpwLibFile, DWORD dwProcessId)
{
BOOL bRet = FALSE;
HANDLE hProcess = NULL, hThread = NULL;
PWSTR pszLibRemoteFile = NULL; __try
{
hProcess = OpenProcess(
PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION |
PROCESS_VM_WRITE,
FALSE, dwProcessId);
if (hProcess == NULL)
__leave; int cch = 1 + lstrlenW(lpwLibFile);
int cb = cch * sizeof(WCHAR); pszLibRemoteFile = (PWSTR)VirtualAllocEx(
hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if (pszLibRemoteFile == NULL)
__leave;
BOOL bw = WriteProcessMemory(hProcess, pszLibRemoteFile,
(PVOID)lpwLibFile, cb, NULL);
if (!bw)
__leave; PTHREAD_START_ROUTINE pfnThreadRnt = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
if (pfnThreadRnt == NULL)
__leave; hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRnt, pszLibRemoteFile, 0, NULL);
if (hThread == NULL)
__leave; WaitForSingleObject(hThread, INFINITE); bRet = TRUE;
}__finally
{
if (pszLibRemoteFile != NULL)
VirtualFreeEx(hProcess, pszLibRemoteFile, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread); if (hProcess != NULL)
CloseHandle(hProcess);
} return bRet;
}从指定的进程中卸掉dll
BOOL CreateRemoteThreadUnloadDll(LPCWSTR lpwLibFile, DWORD dwProcessId)
{
BOOL bRet = FALSE;
HANDLE hProcess = NULL, hThread = NULL;
HANDLE hSnapshot = NULL; __try
{
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
if (hSnapshot == NULL)
__leave;
MODULEENTRY32W me = {sizeof(MODULEENTRY32W)};
BOOL bFound = FALSE;
BOOL bMoreMods = Module32FirstW(hSnapshot, &me);
for (; bMoreMods; bMoreMods = Module32NextW(hSnapshot, &me))
{
bFound = (lstrcmpiW(me.szModule, lpwLibFile) == 0) ||
(lstrcmpiW(me.szExePath, lpwLibFile) == 0);
if (bFound)
break;
} if (!bFound)
__leave; hProcess = OpenProcess(
PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION,
FALSE, dwProcessId);
if (hProcess == NULL)
__leave; PTHREAD_START_ROUTINE pfnThreadRnt = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");
if (pfnThreadRnt == NULL)
__leave; hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRnt, me.modBaseAddr, 0, NULL);
if (hThread == NULL)
__leave; WaitForSingleObject(hThread, INFINITE); bRet = TRUE;
}__finally
{
if (hSnapshot != NULL)
CloseHandle(hSnapshot); if (hThread != NULL)
CloseHandle(hThread); if (hProcess != NULL)
CloseHandle(hProcess);
} return bRet;
}