网站弹出窗口js,dw自我介绍网页制作步骤,网页设计版面划分,建设营销型网站服务Session是Windows系统的一个安全特性#xff0c;该特性引入了针对用户体验提高的安全机制#xff0c;即拆分Session 0和用户会话#xff0c;这种拆分Session 0和Session 1的机制对于提高安全性非常有用#xff0c;这是因为将桌面服务进程#xff0c;驱动程序以及其他系统级…Session是Windows系统的一个安全特性该特性引入了针对用户体验提高的安全机制即拆分Session 0和用户会话这种拆分Session 0和Session 1的机制对于提高安全性非常有用这是因为将桌面服务进程驱动程序以及其他系统级服务取消了与用户会话的关联从而限制了攻击者可用的攻击面。
由于DLL注入在Session 0中的注入机制不同于在用户会话中的注入机制因此需要特别的考虑和处理。如果需要执行DLL注入必须使用过度级别安全机制解决Session 0上下文问题并且在设计安全方案时必须考虑Session 0和Session 1之间的区别。
在之前的远程线程注入章节中我们通过使用CreateRemoteThread()这个函数来完成线程注入此方式可以注入普通的进程但却无法注入到系统进程中因为系统进程是处在SESSION0高权限级别的会话层由于CreateRemoteThread()底层会调用ZwCreateThreadEx()这个未公开的内核函数所以当我们调用该函数的底层函数时则可实现突破Session0的注入机制。
由于该内核函数并未被导出所以我们必须找到该函数的原型定义并通过GetProcAddress获取到ntdll.dll模块下的ZwCreateThreadEx的函数地址并通过ZwCreateThreadEx函数指针直接调用模块
#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);
#endif当拿到ZwCreateThreadEx函数指针时则接下来就可以调用了ZwCreateThreadEx 可以用于创建一个远程线程即在目标进程中创建一个线程并在这个线程中运行指定的代码。与CreateRemoteThread不同ZwCreateThreadEx可以用于创建一个在指定进程的上下文之外的线程即可以创建一个与指定进程无关的线程。
它的函数原型定义如下
NTSYSAPI NTSTATUS NTAPI ZwCreateThreadEx(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,HANDLE ProcessHandle,PVOID StartRoutine,PVOID Argument,ULONG CreateFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,PPS_ATTRIBUTE_LIST AttributeList);其参数说明如下
ThreadHandle 用于返回创建的线程句柄的指针。DesiredAccess 用于指定线程句柄的访问权限。ObjectAttributes 一个指向 OBJECT_ATTRIBUTES 结构的指针指定线程对象的对象名和安全性属性。ProcessHandle 目标进程的句柄即在哪个进程中创建新线程。StartRoutine 一个指向新线程的入口点的指针。Argument 第二个参数传递给新线程的指针。CreateFlags 指定创建线程的属性如堆栈大小、创建标志、线程属性等。ZeroBits 保留参数应该传递0。StackSize 线程堆栈大小。MaximumStackSize 线程堆栈的最大大小。AttributeList 指向结构 PS_ATTRIBUTE_LIST该结构可以用于在线程创建时指定各种属性。
具备了上述基本条件那么注入代码的事项将变得非常容易如下代码是这个注入程序的完整实现流程读者可自行测试注入效果
#include windows.h
#include iostream
#include TlHelp32.h
#include tchar.h// 传入进程名称返回该进程PID
DWORD FindProcessID(LPCTSTR szProcessName)
{DWORD dwPID 0xFFFFFFFF;HANDLE hSnapShot INVALID_HANDLE_VALUE;PROCESSENTRY32 pe;pe.dwSize sizeof(PROCESSENTRY32);hSnapShot CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);Process32First(hSnapShot, pe);do{if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile)){dwPID pe.th32ProcessID;break;}} while (Process32Next(hSnapShot, pe));CloseHandle(hSnapShot);return dwPID;
}// 强力注入
BOOL ZwCreateThreadExInjectDll(DWORD dwProcessId, char* pDllName)
{HANDLE hProcess NULL;SIZE_T dwSize 0;LPVOID pDllAddr NULL;FARPROC pFuncProcAddr NULL;HANDLE hRemoteThread NULL;DWORD dwStatus 0;// 打开注入进程hProcess OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);if (NULL hProcess){return FALSE;}// 在注入进程中申请内存dwSize sizeof(char) lstrlen(pDllName);pDllAddr VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);if (NULL pDllAddr){return FALSE;}// 向申请的内存中写入数据if (FALSE WriteProcessMemory(hProcess, pDllAddr, pDllName, dwSize, NULL)){return FALSE;}// 加载ntdll.dll模块HMODULE hNtdllDll LoadLibrary(ntdll.dll);if (NULL hNtdllDll){return FALSE;}// 获取LoadLibraryA函数地址pFuncProcAddr GetProcAddress(::GetModuleHandle(Kernel32.dll), LoadLibraryA);if (NULL pFuncProcAddr){return FALSE;}// 获取ZwCreateThread函数地址
#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);
#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);
#endiftypedef_ZwCreateThreadEx ZwCreateThreadEx (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdllDll, ZwCreateThreadEx);if (NULL ZwCreateThreadEx){return FALSE;}// 调用函数执行强力注入dwStatus ZwCreateThreadEx(hRemoteThread, PROCESS_ALL_ACCESS, NULL, hProcess,(LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, 0, 0, 0, NULL);if (NULL hRemoteThread){return FALSE;}// 关闭句柄CloseHandle(hProcess);FreeLibrary(hNtdllDll);return TRUE;
}int main(int argc, char *argv[])
{DWORD pid FindProcessID(lyshark.exe);std::cout 进程PID: pid std::endl;bool flag ZwCreateThreadExInjectDll(pid, (char *)d://hook.dll);std::cout 注入状态: flag std::endl;return 0;
}本文作者 王瑞 本文链接 https://www.lyshark.com/post/102cca99.html 版权声明 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处