Я нашел код, который обещает перехватить и обойти звонки на 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 бита.
Заранее спасибо.
(Хотел написать комментарий, но это получилось довольно долго …)
Как говорит @AndrewMedico в комментарии: TerminateProcess
процесса диспетчера задач для предотвращения завершения работы диспетчера задач.
Я предлагаю вам следующий подход:
Попробуйте простую инъекцию DLL
a / Создайте DLL, которая печатает некоторый текст DllMain
например, printf("I am here\n"); fflush(stdout);
b / Попробуйте ввести его в какой-нибудь другой процесс командной строки, используя процесс хакер«s Разное> Вставить DLL …
c / Убедитесь, что ваша DLL была выполнена внутри целевого процесса, проверив ее стандартный вывод
Попробуйте простой API-хук:
a / Создайте приложение командной строки, которое ожидает ключ, а затем завершает себя, используя некоторый вариант TerminateProcess(GetCurrentProcess(), 1);
, Добавьте код для печати текста после TerminateProcess
вызов.
б / Запустите это приложение, чтобы проверить текст после вызова TerminateProcess
не печатается.
с / крюк TerminateProcess
перед ожиданием ключа с помощью, например, mhook. Напечатайте некоторый текст в функции замены и затем вернитесь. Не называйте оригинал TerminateProcess
Вот.
d / Запустите это приложение, чтобы убедиться, что текст внутри хука напечатан и текст после TerminateProcess
вызов также распечатывается (т. е. убедитесь, что завершение процесса было подавлено).
Объедините результаты предыдущих шагов, чтобы достичь своей цели:
a / Поместите код подключения из шага 2 в DLL из шага 1
b / Внедрить его в приложение с шага 2b (т.е. без хука), пока он ждет ключа, и проверить текст после TerminateProcess
печатается.
c / Наслаждайся (или отлаживать / обвинять меня)
Удачи!
EDIT>
Хорошо, вот мой взгляд на то, что мы имеем здесь:
Код в вопросе:
(Приложение очень похоже на то, что я предлагаю в «2b»)
Крючки TerminateProcess
и показывает окно сообщения вместо.
Должен отображать окно сообщения при выполнении
(Похоже, это 32-битная версия)
Показывает приложение «Terminate process.exe», которое завершает процесс, указанный по имени
После выполнения «Injector.exe» приложение перестает завершать процесс и вместо этого отображает окно сообщения (IMHO «Injector.exe» внедряет «DllFile.dll» в запущенный «Terminate process.exe»)
Исходный код инжектора в комментариях YouTube
Этот код внедряет DLL «C: \ DllRedirectAPI.dll» в первый процесс с именем «жертва.exe», который он находит
(Он не внедряется в «Terminate process.exe», он не использует «DllFile.dll»)
Исходный код для DLL в комментариях YouTube
Этот код перехватывает функцию MessageBoxA
что вместо этого отображается другое окно сообщения. Стоит отметить, что сам код хука вызывает оригинал MessageBoxA
и использует подход, который отменяет модификацию, которую он сделал во время перехвата, вызывает исходную функцию и затем повторно применяет перехват.
(Это не перехватывает ‘TerminateProcess’ вообще)
(Похоже, это 32-битная версия)
Разрушительный крючок 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;
}
Других решений пока нет …