1. 回顾
在前 2 节我们已经实现了劫持原理, 函数指针等一些概念, 下面进行系统劫持
2. 工具
vs2017
Detours
3. Windows 如何创建一个进程?
(1) 创建进程函数
- CreateProcessW(
- LPCWSTR lpApplicationName, // 执行程序名称
- LPWSTR lpCommandLine, // 命令行
- LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安装
- LPSECURITY_ATTRIBUTES lpThreadAttributes, // 进程主线程安装
- BOOL bInheritHandles, // 附加参数
- DWORD dwCreationFlags, // 创建参数
- LPVOID lpEnvironment, // 环境变量指针
- LPCWSTR lpCurrentDirectory, // 进程当前路径
- LPSTARTUPINFOW lpStartupInfo, // 进程启动的附加信息
- LPPROCESS_INFORMATION lpProcessInformation // 进程标识符
- );
(2) 我们需要用到哪些参数?
wchar_t str[100]; 用来指定输入的命令比如 notepad mspaint... 对应第二个参数
STARTUPINFO si; 保存进程信息 也就是倒数第二个参数
PROCESS_INFORMATION pi; 进程标识符 也就是最后一个参数
其他都是 NULL
(3) 完整程序代码
- #include<Windows.h>
- #include<stdio.h>
- #include<stdlib.h>
- int main() {
- STARTUPINFO si = { sizeof(si) }; // 保存进程信息
- si.dwFlags = STARTF_USESHOWWINDOW;// 显示窗口
- si.wShowWindow = 1;// 显示窗口
- PROCESS_INFORMATION pi; // 进程信息
- wchar_t str[100] = L"notepad";
- CreateProcessW(NULL, str, NULL, NULL, 0, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
- return 0;
- }
(4) 原理解释
为什么是 wchar_t, 不是 char?
汉语占两个字节, 英语占一个字节, Windows 系统为了兼容函数, 创建了宽字符 wchar_t 可以直接输入汉语, 而不会出现乱码
4. 系统进程劫持
(1) 上次劫持原理回顾
- void (*pold)(参数) = system;
- void pnew(参数){
- ...
- }
- void hook(){
- ...
- }
(2) 这次函数由 system() 改为 CreateProcess
第一步: 创建函数指针
- BOOL(WINAPI *poldcreateprocess)(
- LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation
- ) = CreateProcessW;// 在中国使用宽字符更精准
第二步: 创建新函数
- BOOL NEWCreateProcessW(
- LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation
- )
- {
- MessageBoxA(0, "劫持系统", "点有用吗???", 0);
- return 0;// 执行失败
- }
第三步: 实现劫持
- void hook()
- {
- DetourRestoreAfterWith();// 恢复状态
- DetourTransactionBegin();// 开始
- DetourUpdateThread(GetCurrentThread());// 刷新当前线程
- DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);
- DetourTransactionCommit();// 立刻生效
- }
第四步: 编写 dll 函数
- _declspec(dllexport)void go()
- {
- hook();
- }
第五步: 改 Debug 模式 -> Rease 模式 -> 生成解决方案
完整源代码
- #include <stdio.h>
- #include <stdlib.h>
- #include <Windows.h>
- #include "detours.h"
- #pragma comment(lib,"detours.lib")
- BOOL(WINAPI *poldcreateprocess)(
- LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation
- ) = CreateProcessW;// 宽字符的创建进程
- BOOL NEWCreateProcessW(
- LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation
- )
- {
- MessageBoxA(0, "劫持系统", "点有用吗???", 0);
- return 0;// 执行失败
- }
- void hook()
- {
- DetourRestoreAfterWith();// 恢复状态
- DetourTransactionBegin();// 开始
- DetourUpdateThread(GetCurrentThread());// 刷新当前线程
- DetourAttach((void**)&poldcreateprocess, NEWCreateProcessW);
- DetourTransactionCommit();// 立刻生效
- }
- _declspec(dllexport)void go()
- {
- hook();
- }
4. dll 注入
打开 dll 注入工具, 登陆 qq 后刷新 dll 注入工具选择 qq
找到编写的 dll, 输入编写的函数 go() 点击注入, 在 qq 上打开 qq 空间
如果有 explorer.exe 的选择 explore.exe 注入后任何进程打开失败
来源: http://www.bubuko.com/infodetail-3265816.html