gpt4 book ai didi

c++ - 绕行:防止通过其他软件杀死我的软件

转载 作者:行者123 更新时间:2023-11-28 05:59:44 29 4
gpt4 key购买 nike

我发现了一个代码,该代码可以拦截和绕过对TerminateProcess函数的调用,从而防止我的软件直接被其他程序杀死。

但是此代码无法正常工作,我仍然可以通过其他程序终止进程。

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

PS:受害者.exe是杀手级程序。

动态链接库

// 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 /尝试使用process hacker的Miscellaneous> Inject DLL将其注入到其他命令行过程中...

c /通过检查其标准输出来验证DLL是否在目标进程中执行
尝试一个简单的API挂钩:

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

b /调用TerminateProcess后,运行此应用程序以验证文本是否未打印。

c /在使用例如mhook。在替换功能中打印一些文本,然后返回。不要在此处调用原始的TerminateProcess

d /运行此应用程序以验证钩子中的文本是否已打印并且TerminateProcess调用之后的文本也已打印(即,验证是否禁止进程终止)。
结合先前步骤的结果来实现您的目标:

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

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

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


祝好运!



编辑>

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


问题中的代码:


(该应用程序与我在“ 2b”中建议的非常相似)
挂钩TerminateProcess并显示一个消息框。
执行时应显示一个消息框
(看起来它是仅32位版本)

YouTube video


显示一个应用程序“ Terminate process.exe”,该应用程序终止按名称指定的进程
执行“ Injector.exe”后,应用程序停止终止进程并显示一个消息框(恕我直言,“ Injector.exe”将“ DllFile.dll”注入到正在运行的“ Terminate process.exe”中)

Source code for the injector in the YouTube comments


此代码将DLL“ C:\ DllRedirectAPI.dll”注入名称为“ victim.exe”的第一个进程中
(它不会注入“ Terminate process.exe”中,也不使用“ DllFile.dll”)

Source code for the DLL in the YouTube comments


此代码挂钩函数TerminateProcess,它显示一个不同的消息框。值得注意的是,挂钩代码本身会调用原始的MessageBoxA,并采用以下方法:还原在挂钩过程中所做的修改,调用原始函数,然后重新应用该挂钩。
(它根本不钩住“ TerminateProcess”)
(看起来它是仅32位版本)

64-bit version excerpts


MessageBoxA的破坏性钩子(即不备份原始代码)
挂钩使用MessageBoxA(完整无缺)来显示其他消息框(即,它不使用覆盖的MessageBoxExA
(它根本不钩住“ TerminateProcess”)
(它是64位版本)



免责声明:我不太熟悉该主题,不能100%确定,请随时纠正/阐明我。



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

参见例如this一些替代方案(我没有尝试过)...



编辑>

这对我在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;
}

关于c++ - 绕行:防止通过其他软件杀死我的软件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512361/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com