【文章标题】: 打造属于自己的任务管理器
【文章作者】: SniperChan
【作者邮箱】: SniperChan@126.com
【编写语言】: VC
【使用工具】: VS.NET 2008 SP1
【操作平台】: XP SP3
【作者声明】: 软件可以任意修改和传播
HANDLE CreateRomoteThread(
HANDLE hProcess //目标进程句柄
PSECURITY_ATTRIBUTES psa, //指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。
DWORD dwStackSize, //线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
PTHREAD_START_ROUTINE pfnstartAddr, //指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。
PVOID pvParam, //向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
DWORD fdwCreate, //线程标志
PDWORD pdwThreadId //保存新线程的id。
);
HANDLE LoadLibrary(PCTSTR pszLibFile)
HANDLE hThreadd = CreateRemoteThread(hProcessRemote,NULL,0,LoadLibrary,"E:\\MyLib.dll",0,NULL);
PTHREAD_START_ROUTINE pfnThreadRtn =(PTHREAD_START_ROUTINE )GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibrary");
HANDLE hThread = CreateRemoteThread(hProcessRemote,NULL,0,pfnThreadRtn ,"E:\\MyLib.dll",0,NULL);
LPVOID VirtualAllocEx(
HANDLE hProcess, //申请内存所在的进程句柄。
LPVOID lpAddress, //保留页面的内存地址;一般用NULL自动分配 。
SIZE_T dwSize, //欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType, //可取下列值MEM_PHYSICAL ,MEM_RESERVE,MEM_RESET ,MEM_TOP_DOWN,MEM_WRITE_WATCH
DWORD flProtect //可取下列值PAGE_READONLY,PAGE_EXECUTE,PAGE_EXECUTE_READ ,PAGE_EXECUTE_READWRITE,PAGE_GUARD,PAGE_NOACCESS,PAGE_NOCACHE
);
BOOL VirtualFreeEx(
HANDLE hProcess, // 要释放内存所在进程的句柄
LPVOID lpAddress, // 区域地址
DWORD dwSize, // 区域大小,字节
DWORD dwFreeType //类型
);
BOOL ReadProcessMemory(
HANDLE hProcess,// 远程进程句柄
LPCVOID lpBaseAddress, //远程进程中内存地址
LPVOID lpBuffer, //本地进程中内存地址. 函数将读取的内容写入此处
DWORD nSize,// 要传送的字节数
LPDWORD lpNumberOfBytesRead //实际传送的字节数. 函数返回时报告实际写入多少
);
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPVOID lpBuffer,
DWORD nSize,
LPDWORD lpNumberOfBytesWritten
);
BOOL Inject(DWORD dwProcessId/*进程ID*/, PCWSTR pszLibFile/*DLL路径和名称*/)
{
BOOL bOk = FALSE;
HANDLE hProcess = NULL, hThread = NULL;
PWSTR pszLibFileRemote = NULL;
__try {
// 获取目标进程的句柄
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) __leave;
// 计算DLL路径的长度
int cch = 1 + lstrlenW(pszLibFile);
int cb = cch * sizeof(wchar_t);
//在远程进程为DLL的名字和路径分配内存
pszLibFileRemote = (PWSTR)
VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if (pszLibFileRemote == NULL) __leave;
//把路径复制的远程进程的内存中
if (!WriteProcessMemory(hProcess, pszLibFileRemote,
(PVOID) pszLibFile, cb, NULL)) __leave;
//获取LoadLibraryW 在Kernel32.dll中的实际内存地址
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
if (pfnThreadRtn == NULL) __leave;
//创建远程线程
hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, pszLibFileRemote, 0, NULL);
if (hThread == NULL) __leave;
// 等待线程结束
WaitForSingleObject(hThread, INFINITE);
bOk = TRUE;
}
__finally {
// 释放内存
if (pszLibFileRemote != NULL)
VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (hProcess != NULL)
CloseHandle(hProcess);
}
return(bOk);
}
BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
HWND hWndParent, //父窗口句柄
WNDENUMPROC lpEnumFunc, // 回调函数的地址
LPARAM lParam//你自已定义的参数
HANDLE hwndTaskManager = FindWindow( (LPCTSTR)32770, L"Windows 任务管理器");
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!