代码注入(提升当前进程权限,创建远程线程)
2012-12-23 10:38
477 查看
#include <windows.h> #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "User32.lib") #define PATHNAME_LENGTH 256 void EnableDebugPriv() { HANDLE hToken; // 进程访问令牌的句柄 LUID luid; // 用于存储调试权对应的局local unique identifier TOKEN_PRIVILEGES tkp; // 要设置的权限 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); // 获取访问令牌 LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); // 获得调试权的luid tkp.PrivilegeCount = 1; // 设置调试权 tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL); // 使进程拥有调试权 CloseHandle(hToken); } int main(int argc, TCHAR* argv[], TCHAR* envp[]) { HWND hWnd = FindWindow(NULL, L"InjectDst"); // 查找目标进程 DWORD pid; GetWindowThreadProcessId(hWnd, &pid); EnableDebugPriv(); // 获得进程的调试权 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // 打开进程 char szLibName[PATHNAME_LENGTH] = "E://InjectedDll.dll"; // 要注入的dll void* pLibNameRemote = VirtualAllocEx(hProcess, NULL, PATHNAME_LENGTH, MEM_COMMIT, PAGE_READWRITE); // 在目标进程的地址空间分配内存 WriteProcessMemory(hProcess, pLibNameRemote, szLibName, PATHNAME_LENGTH, NULL); // 写入dll路径 HMODULE hKernel32 = GetModuleHandle(L"Kernel32"); // 获得kernel32.dll的句柄 FARPROC fp = GetProcAddress(hKernel32, "LoadLibraryA"); // 获得loadibrary的便宜地址 HANDLE hThread = CreateRemoteThread(hProcess, // 启动远程线程 NULL, 0, (LPTHREAD_START_ROUTINE)fp, // 要注入的代码写在dll的DllMain里 pLibNameRemote, 0, NULL); WaitForSingleObject(hThread, INFINITE); // 等待线程结束,也就是dllmain结束 DWORD hLibModule; GetExitCodeThread(hThread, &hLibModule); // 返回注入的dll的句柄 CloseHandle(hThread); VirtualFreeEx(hProcess, pLibNameRemote, PATHNAME_LENGTH, MEM_RELEASE); hThread = CreateRemoteThread(hProcess, // 释放注入的dll NULL, 0, (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernel32, "FreeLibrary"), (void*)hLibModule, 0, NULL ); WaitForSingleObject( hThread, INFINITE ); CloseHandle(hThread ); CloseHandle(hProcess); return 0; }
在调试的时候我们的进程本来就具有调试权。但是当程序独立运行时,就一定要手动获得调试权。
相关文章推荐
- 存在真正的“提升进程(线程)权限”程序吗?
- .NET中提升当前进程的UAC权限
- 远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败。请使用提升的权限运行远程桌面客户端
- 对当前进程进行提升权限
- 在挂起的进程中创建一个远程线程
- 对当前进程进行提升权限
- 对当前进程进行提升权限
- 提升Debug权限与创建结束JOB对象来结束进程
- 解决“远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败,请使用提升的权限运行远程桌面客户端”问题
- 子进程会继承父进程用户id,用户组id,用户信息,文件描述符,数据段,堆栈,当前工作目录,创建文件权限,信号处理方式,进程组号,会话期号。
- 进程注入DLL实现(APC和远程线程创建)
- .NET中提升当前进程的UAC权限
- 主进程中如何退出pthread_create创建的线程?
- 【总结】用户权限设置和进程权限提升
- Java时区bug,TimeZone.setDefault()只在当前线程和之后创建的子线程有效
- 一句代码提升进程权限
- EnableDebugPrivilge(CString lpName, BOOL fEnable) 函数源码,提升进程操作权限。
- VC 一句代码提升进程权限
- 无法在当前的 Active Directory 域中创建服务连接点。验证 SharePoint 容器是否存在于当前域中并验证您是否具有向其写入的权限。 Microsoft.SharePoint.SPException: 目录中不存在对象 LDAP://CN=Microsoft SharePoint
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器