Detours:通过其他软件防止任务终止我的软件

时间:2015-11-04 01:49:39

标签: c++ visual-c++ dll-injection detours api-hook

我找到了一个代码,它承诺拦截和绕开对TerminateProcess函数的调用,从而阻止我的软件直接从其他程序中被杀死。

但是这段代码无效,我仍然可以通过其他程序杀死我的进程。

以下是我在this YouTube video中找到的代码的最后一次尝试:

PS:victim.exe是杀手程序。

DLL

// DllRedirectAPI.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include <Windows.h>

BYTE MOV[10] = { 0x48, 0xB8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; 
BYTE JMP_RAX[2] = { 0xFF, 0xE0 }; 
#define BuffSizeX64 (sizeof(MOV) + sizeof(JMP_RAX))

BOOL Hook_Det_x64(char LibName[], char API_Name[], LPVOID NewFun) {
    DWORD OldProtect;
    DWORD64 OrgAddress = (DWORD64)GetProcAddress(LoadLibraryA(LibName), API_Name);
    if (OrgAddress == NULL) return 0;

    memcpy(&MOV[2], &NewFun, 8);
    VirtualProtect((LPVOID)OrgAddress, BuffSizeX64, PAGE_EXECUTE_READWRITE, &OldProtect);
    memcpy((LPVOID)OrgAddress, MOV, sizeof(MOV));
    memcpy((LPVOID)(OrgAddress + sizeof(MOV)), JMP_RAX, sizeof(JMP_RAX));
    VirtualProtect((LPVOID)OrgAddress, BuffSizeX64, OldProtect, &OldProtect);

    return 1;
}

int WINAPI MessageBoxAX(
    HWND hWnd,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType) {

    MessageBoxExA(0, "Hooked ...", "Mahmoud", 0, 0);
    return 999;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD Call_Reason, LPVOID lpReserved) {
    switch (Call_Reason) {
    case DLL_PROCESS_ATTACH:
        Hook_Det_x64("Kernel32.dll", "TerminateProcess", MessageBoxAX);
    }
    return 1;
}

注射器

// Injector.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#include <conio.h>
#include <stdio.h>
#include <comdef.h>

#define WIN32_LEAN_AND_MEAN
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)


BOOL Inject(DWORD pID, const char * DLL_NAME);
DWORD GetTargetThreadIDFromProcName(const char * ProcName);

int main(int argc, char * argv[])
{
    //###############  CHANGE HERE ONLY   ###################
    char *Target_Process = "victim.exe"; //###
    //#######################################################



    char *buf;
    DWORD pID = GetTargetThreadIDFromProcName(Target_Process);
    buf = "DllRedirectAPI.dll";

    if (!Inject(pID, buf))
    {

        printf("DLL Not Loaded!");
    }
    else{
        printf("DLL is Injected in torget Process");
    }

    _getch();
    return 0;
}

BOOL Inject(DWORD pID, const char * DLL_NAME)
{
    HANDLE Proc;
    char buf[50] = { 0 };
    LPVOID RemoteString, LoadLibAddy;

    if (!pID)
        return false;

    Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    if (!Proc)
    {
        sprintf_s(buf, "OpenProcess() failed: %d", GetLastError());
        printf(buf);
        return false;
    }

    LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryA");

    RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

    WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME, strlen(DLL_NAME), NULL);

    CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);

    CloseHandle(Proc);
    return true;
}

DWORD GetTargetThreadIDFromProcName(const char * ProcName)
{
    PROCESSENTRY32 pe;
    HANDLE thSnapShot;
    BOOL retval, ProcFound = false;

    thSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (thSnapShot == INVALID_HANDLE_VALUE)
    {
        printf("Error: Unable create toolhelp snapshot!");
        return false;
    }

    pe.dwSize = sizeof(PROCESSENTRY32);

    retval = Process32First(thSnapShot, &pe);
    while (retval)
    {
        if (_bstr_t(pe.szExeFile) == _bstr_t(ProcName))
        {
            return pe.th32ProcessID;
        }
        retval = Process32Next(thSnapShot, &pe);
    }
    return 0;
}

有人可以帮助我,告诉我哪里出错了吗?

我的系统是Windows 7 Ultimate 64位。

提前致谢。

1 个答案:

答案 0 :(得分:1)

(想写一个评论,但它已经很长了......)

正如@AndrewMedico在评论中所说:你需要挂钩任务管理器进程的TerminateProcess以防止任务管理器终止任何事情。

我建议您采用以下方法:

  1. 尝试简单的DLL注入

    a /制作一个DLL,在其DllMain中打印一些文本,例如printf("I am here\n"); fflush(stdout);

    b /尝试使用process hacker 杂项&gt;注入DLL ...

    将其注入其他命令行流程

    c /通过检查其标准输出验证您的DLL是否已在目标进程内执行

  2. 尝试一个简单的API钩子:

    a /创建一个等待密钥的命令行应用程序,然后使用TerminateProcess(GetCurrentProcess(), 1);的某个变体终止自身。添加代码以在TerminateProcess调用后打印一些文本。

    b /运行此应用程序以在调用TerminateProcess后未验证文本。

    c /在等待密钥使用之前挂钩TerminateProcess,例如mhook。在替换功能中打印一些文本然后返回。请勿在此处拨打原始TerminateProcess

    d /运行此应用程序以验证钩子内的文本是否已打印,同时打印TerminateProcess调用后的文本(即验证过程​​终止是否已被抑制)。

  3. 结合之前步骤的结果来实现目标:

    a /将步骤2中的挂钩代码放入步骤1的DLL中

    b /在等待密钥并在TerminateProcess打印后验证文本时,将其从步骤2b中注入应用程序(即没有挂钩的应用程序)。

    c /享受(或调试/责怪我)

  4. 祝你好运!

    编辑&gt;

    好的,这是我对这里的看法:

    1. 问题中的代码:

      • (申请与我在#34; 2b&#34;中的建议非常相似)

      • 挂钩TerminateProcess并显示一个消息框。

      • 执行时应显示消息框

      • (看起来它只是一个32位版本)

    2. YouTube video

      • 显示应用程序&#34;终止process.exe&#34;它终止了由名称

      • 给出的过程
      • &#34; Injector.exe&#34;执行后,应用程序停止终止进程并显示一个消息框(恕我直言,#34; Injector.exe&#34;注入&#34; DllFile.dll&#34;进入正在运行的&#34;终止进程。 exe文件&#34)

    3. Source code for the injector in the YouTube comments

      • 此代码注入DLL&#34; C:\ DllRedirectAPI.dll&#34;进入名为&#34; victim.exe&#34;的第一个进程它找到了

      • (它不会注入&#34;终止process.exe&#34;它不会使用&#34; DllFile.dll&#34;)

    4. Source code for the DLL in the YouTube comments

      • 此代码挂钩函数MessageBoxA,它显示的是另一个消息框。值得注意的是,钩子代码本身调用了原始的MessageBoxA,并采取了恢复它在钩子期间所做的修改的方法,调用原始函数然后重新应用钩子。

      • (它没有挂钩&#39; TerminateProcess&#39;)

      • (看起来它只是一个32位版本)

    5. 64-bit version excerpts

      • MessageBoxA的破坏性挂钩(即不备份原始代码)

      • 钩子使用MessageBoxExA(完好无损)来显示不同的消息框(即它不使用被覆盖的MessageBoxA

      • (它没有挂钩&#39; TerminateProcess&#39;)

      • (这是一个64位版本)

    6. 免责声明:我不是那么精通这个话题,要100%肯定,随时纠正/澄清我。

      对于实际的挂钩,我个人建议使用适用于我的mhook library。它的文档也值得一读。

      参见例如this对于某些替代方案(我没有尝试过任何替代方案)......

      编辑&gt;

      这个适用于VirtualBox内部的Win XP:

      #include <windows.h>
      #include <stdio.h>
      #include <mhook.h>
      
      static BOOL WINAPI
      (*_TerminateProcess)(
        _In_ HANDLE hProcess,
        _In_ UINT   uExitCode
      ) = NULL;
      
      BOOL WINAPI
      TerminateProcessImpl(
        _In_ HANDLE hProcess,
        _In_ UINT   uExitCode) {
      
          printf("\nBlocked\n"); fflush(stdout);
          return 0;
      }
      
      BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) {
          if(Reason==DLL_PROCESS_ATTACH) {
              printf("\nDLL attached!\n"); fflush(stdout);
              HMODULE h = LoadLibrary("Kernel32");
              if(h!=NULL) {
                  printf("\nGot Kernel32!\n"); fflush(stdout);
                  _TerminateProcess=(void*)GetProcAddress(h,"TerminateProcess");
                  if(_TerminateProcess!=NULL) {
                      printf("\nAbout to hook...\n"); fflush(stdout);
                      if(Mhook_SetHook((void*)&_TerminateProcess, &TerminateProcessImpl)) {
                          printf("\nHooked OK!\n"); fflush(stdout);
                      } else {
                          printf("\nHook failed!\n"); fflush(stdout);
                      }
                  }
              }
          }
          return TRUE;
      }