真香定律:MiniHook+Remote DLL

windows的函数hook大致分为2类:指定进程Hook和系统全局(system-wide)Hook。指定进程的Hook常规思路是先编写一个hook指定函数的dll,然后使用dll注入打到指定进程。系统全局Hook一般采用AppInit DLLs方案,这大概是最简单做全局dll注入的方案了,很明显微软也意识到了这个弱点,在win10上面开始对AppInit DLLs进行限制,参考 AppInit_Dlls键值 和 微软官方文档 AppInit DLLs and Secure Boot。本文将使用MiniHook模块实现指定进程Hook。

代码背景:朋友从某个论坛买了一个教程,但是论坛给了指定播放器。导致每次播放时需要联网验证,而且检测到开启屏幕录像软件后就将其杀掉。首先使用API Logger对播放器进程进行函数调用跟踪,发现该播放器使用CreateToolhelp32Snapshot枚举进程,当发现是屏幕录像软件时则使用OpenProcess和TerminateProcess杀死进程。解决思路为Hook 播放器进程的OpenProcess函数,当尝试打开非当前进程时直接返回无效句柄。

  1. 使用MiniHook Hook OpenProcess函数
#include 
#include "MinHook.h"

typedef HANDLE (WINAPI *OpenProcessFunc)(DWORD ,BOOL ,DWORD );
OpenProcessFunc pfOpenProcess = NULL;

HANDLE WINAPI FuckOpenProcess(DWORD dwDesiredAccess,BOOL  bInheritHandle,DWORD dwProcessId)
{
    if (dwProcessId == GetCurrentProcessId())
    {
        return (pfOpenProcess)(dwDesiredAccess, bInheritHandle, dwProcessId);
    }
    else   // 当尝试打开其他进程时直接返回空句柄
    {
        SetLastError(ERROR_ACCESS_DENIED);
        return INVALID_HANDLE_VALUE;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD url_for_reason, LPVOID lpReserved)
{
    switch (url_for_reason)
    {
    case DLL_PROCESS_ATTACH:
        {
            MH_Initialize();
            MH_CreateHookApi(L"Kernel32", "OpenProcess", &FuckOpenProcess, (LPVOID*)&pfOpenProcess);
            MH_EnableHook(&OpenProcess);
            break;
        }
    case DLL_PROCESS_DETACH:
        {
            MH_DisableHook(&OpenProcess);
            MH_Uninitialize();
            break;
        }
    }
    return TRUE;
}
  1. 使用Remote DLL进行进程注入
    Remote DLL下载地址: https://securityxploded.com/remotedll.php
    使用截图如下:
    remote dll

你可能感兴趣的:(真香定律:MiniHook+Remote DLL)