Обходы: Предотвратить уничтожение моего программного обеспечения с помощью другого программного обеспечения

Я нашел код, который обещает перехватить и обойти звонки на TerminateProcess функционировать и, таким образом, предотвращать уничтожение моего программного обеспечения непосредственно из другой программы.

Но этот код не работает, и я все еще могу убить свой процесс с помощью другой программы.

Вот последняя моя попытка с кодом, который я нашел в это видео на YouTube:

PS: жертва.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 бита.

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

0

Решение

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

Как говорит @AndrewMedico в комментарии: TerminateProcess процесса диспетчера задач для предотвращения завершения работы диспетчера задач.


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

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

    a / Создайте DLL, которая печатает некоторый текст DllMainнапример, printf("I am here\n"); fflush(stdout);

    b / Попробуйте ввести его в какой-нибудь другой процесс командной строки, используя процесс хакер«s Разное> Вставить DLL …

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

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

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

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

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

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

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

    a / Поместите код подключения из шага 2 в DLL из шага 1

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

    c / Наслаждайся (или отлаживать / обвинять меня)

Удачи!


EDIT>

Хорошо, вот мой взгляд на то, что мы имеем здесь:

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

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

    • Крючки TerminateProcess и показывает окно сообщения вместо.

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

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

  2. YouTube видео

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

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

  3. Исходный код инжектора в комментариях YouTube

    • Этот код внедряет DLL «C: \ DllRedirectAPI.dll» в первый процесс с именем «жертва.exe», который он находит

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

  4. Исходный код для DLL в комментариях YouTube

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

    • (Это не перехватывает ‘TerminateProcess’ вообще)

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

  5. Выдержки из 64-битной версии

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

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

    • (Это не перехватывает ‘TerminateProcess’ вообще)

    • (Это 64-битная версия)

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


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

Смотрите, например этот для некоторых альтернатив (я не пробовал ни одну из них) …


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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]