2015-11-04 5 views
0

Я нашел код, который обещает перехватывать и обходить вызовы функции 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

// 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 Bits.

Заранее спасибо.

+0

Вы уверены TaskManager даже использует 'TerminateProcess()'? Многие функции, встроенные в Windows, не используют kernel32, но используют собственный API напрямую (в этом случае это будет 'NtTerminateProcess()'). – MrEricSir

+1

AFAIK: В Windows вы не можете запретить закрывать приложение, если оно будучи убитым – Tas

+0

@Tas, и почему антивирусные продукты, например, не могут быть убиты? [см.] (http://i.imgur.com/i7aHuxs.png) –

ответ

1

(Хотел написать комментарий, но он получил довольно долго ...)

Как @AndrewMedico говорит в комментарии: Вы должны зацепить TerminateProcess процесса Диспетчер задач, чтобы предотвратить Task Manager от завершения что-нибудь.


Я предлагаю вам следующий подход:

  1. Попробуйте простой инъекции DLL

    а/Сделать DLL, которая печатает текст в его DllMain, например, printf("I am here\n"); fflush(stdout);

    б/Попробуйте вводить его в какой-нибудь другой процесс командной строки, используя process hacker «ы Разное> Inject DLL ...

    с/Убедитесь, ваша DLL была выполнена внутри целевого процесса, проверив это стандарт выход

  2. Попробуйте простой API крюк:

    а/Сделать заявку командной строки, которая ждет ключа, а затем завершает себя с помощью какого-то варианта TerminateProcess(GetCurrentProcess(), 1);. Добавьте код для печати текста после вызова TerminateProcess.

    b/Запустить это приложение для проверки текста после вызова TerminateProcess не распечатывается.

    c/Захват TerminateProcess перед тем, как ждать ключа, используя, например. mhook. Распечатайте некоторый текст в функции замены, а затем верните. Не вызывайте оригинал TerminateProcess здесь.

    d/Запустить это приложение, чтобы проверить, что текст внутри крючка напечатан, а также текст после вызова TerminateProcess (т. Е. Проверка завершения процесса прекращена).

  3. Объединить результаты предыдущих шагов, чтобы достичь своей цели:

    а/Поместите код крепежную из из шага 2 в DLL с шага 1

    б/Вводят его в приложение со стадии 2b (т. е. тот, у кого нет крючка), пока он ждет ключа и проверяет текст после печати TerminateProcess.

    с/Enjoy (или отлаживать/винить меня)

Удачи!


EDIT>

ОК, вот мое мнение о том, что мы имеем здесь:

  1. код в вопросе:

    • (это приложение очень похоже к чему я предлагаю в «2b»)

    • Захватывает TerminateProcess и вместо этого отображает окно сообщения.

    • Если отобразить окно сообщения при выполнении

    • (Похоже, это 32-разрядная версия)

  2. YouTube video

    • Показывает приложение «Прервать process.exe ", который завершает процесс, указанный по названию

    • После выполнения «Injector.exe» приложение перестает завершать процесс и отображает вместо него поле сообщения (IMHO «Injector.exe» вставляет «DllFile.dll» в запущенный «Terminate process.exe»)

  3. Source code for the injector in the YouTube comments

    • Этот код впрыскивает DLL "C: \ DllRedirectAPI.dll" в первый процесс с именем "victim.exe" он находит

    • (Это не введите «Terminate process.exe», он не использует «DllFile».длл ")

  4. Source code for the DLL in the YouTube comments

    • Этот код крючки функционируют MessageBoxA, что она показывает другое окно сообщения вместо этого. Стоит отметить, что код крюк сам вызывает оригинальный MessageBoxA и принимает подход что он восстанавливает модификацию, которую он сделал во время перехвата, вызывает исходную функцию, а затем снова применяет крючок.

    • (Он вообще не зацепит «TerminateProcess»)

    • (Похоже, что это только 32-разрядная версия)

  5. 64-bit version excerpts

    • Разрушительное крючок MessageBoxA (т.е. не подпорка исходный код)

    • Крюк использует MessageBoxExA (который не используется) для отображения другого окна сообщения вместо (т.е. он не использует перезаписаны MessageBoxA)

    • (Это не зацепить «TerminateProcess 'у всех)

    • (это 64-разрядная версия)

диск laimer: Я не настолько разбираюсь в этой теме, чтобы быть на 100% уверенным, не стесняйтесь исправлять/разъяснять меня.


Для фактического подсекать я лично рекомендую использовать mhook library, который работал для меня. Также стоит прочитать документацию.

См., Например, this для некоторых вариантов (я не пробовал ни один из них) ...


EDIT>

Это один работает для меня на Win XP в VirtualBox:

#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; 
} 
+0

@vip, ОК. О видео Youtube выше того, что я оставил ссылку, инъекция, сделанная для Autor, находится только в 'TaskMgr.exe' или на обоих процессах (« calc.exe »и' TaskMgr.exe')? Я этого не понимаю. –

+0

@ Cloud.NET Я бы сказал, что он находится в 'Terminate Process.exe'. Исходный код _probably_ отличается от того, который используется для видео. (И BTW _probably_ не для 64-битной системы, учитывая 32-разрядный указатель). – vlp

+0

@vip, Да, код, который я оставил выше, не то же самое видео, это другое, что я захватил на другом сайте. Но автор этого видео также оставил код x64 в комментариях, возможно, вы видели. Я также тестировал код x64, но без успеха. Когда вы можете, вы также можете проверить и рассказать мне результат теста? Вероятно, я сделал какой-то шаг неправильно. –

Смежные вопросы