0

TerminateProcess関数の呼び出しを傍受して迂回し、ソフトウェアが他のプログラムから直接強制終了されるのを防ぐことを約束するコードを見つけました。

しかし、このコードは機能せず、他のプログラムを介してプロセスを強制終了できます。

これは、このYouTubeビデオで見つけたコードを使用した最後の試みです:

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 ビットです。

前もって感謝します。

4

1 に答える 1

1

(コメントを書きたかったのですが、かなり長くなってしまいました…)

@AndrewMedico がコメントで述べているTerminateProcessように、タスク マネージャーが何も終了しないようにするには、タスク マネージャー プロセスをフックする必要があります。


次のアプローチをお勧めします。

  1. 簡単な DLL インジェクションを試す

    a/ にテキストを出力する DLL を作成しますDllMainprintf("I am here\n"); fflush(stdout);

    b/プロセス ハッカー[Miscellaneous] > [Inject DLL... ]を使用して、他のコマンド ライン プロセスに挿入してみてください。

    c/標準出力をチェックして、DLLがターゲットプロセス内で実行されたことを確認します

  2. 簡単な API フックを試してください。

    a/ キーを待ってから何らかの変種を使用して終了するコマンド ライン アプリケーションを作成しますTerminateProcess(GetCurrentProcess(), 1);。呼び出し後にテキストを出力するコードを追加しTerminateProcessます。

    b/ このアプリケーションを実行して、 を呼び出した後にテキストTerminateProcessが印刷されていないことを確認します。

    c/ mhookTerminateProcessなどを使用して、キーを待機する前にフックします。置換関数でテキストを出力してから返します。ここでオリジナルを呼び出さないでください。TerminateProcess

    d/ このアプリケーションを実行して、フック内のテキストが出力され、TerminateProcess呼び出し後のテキストも出力されることを確認します (つまり、プロセスの終了が抑制されたことを確認します)。

  3. 前のステップの結果を組み合わせて、目標を達成します。

    a/ ステップ 2 のフッキング コードをステップ 1 の DLL に入れる

    b/ キーを待機している間にステップ 2b のアプリケーション (つまり、フックのないアプリケーション) にそれを挿入し、TerminateProcess印刷後にテキストを検証します。

    c/楽しむ(またはデバッグ/私を責める)

幸運を!


編集>

わかりました、これが私たちがここに持っているものの私の見解です:

  1. 質問のコード:

    • (「2b」で提案したものと非常によく似たアプリケーションです)

    • をフックし、TerminateProcess代わりにメッセージ ボックスを表示します。

    • 実行時にメッセージボックスを表示する必要があります

    • (32ビットのみのバージョンのようです)

  2. YouTube ビデオ

    • 名前で指定されたプロセスを終了するアプリケーション「Terminate process.exe」を表示します

    • 「Injector.exe」が実行された後、アプリケーションはプロセスの終了を停止し、代わりにメッセージボックスを表示します(IMHO「Injector.exe」は実行中の「Terminate process.exe」に「DllFile.dll」を挿入します)

  3. YouTube コメントのインジェクターのソース コード

    • このコードは、見つかった「victim.exe」という名前の最初のプロセスに DLL「C:\DllRedirectAPI.dll」を挿入します。

    • (「Terminate process.exe」には挿入せず、「DllFile.dll」は使用しません)

  4. YouTube コメントの DLL のソース コード

    • MessageBoxAこのコードは、代わりに別のメッセージ ボックスを表示する関数をフックします。フック コード自体がMessageBoxA元の関数を呼び出し、フック中に行った変更を元に戻し、元の関数を呼び出してからフックを再適用するというアプローチを取ることに注意してください。

    • (「TerminateProcess」はまったくフックしません)

    • (32ビットのみのバージョンのようです)

  5. 64ビット版抜粋

    • の破壊的なフックMessageBoxA(つまり、元のコードをバックアップしません)

    • フックはMessageBoxExA(そのままの状態で) 代わりに別のメッセージ ボックスを表示するために使用します (つまり、上書きされた を使用しませんMessageBoxA) 。

    • (「TerminateProcess」はまったくフックしません)

    • (64ビット版です)

免責事項: 私はこのトピックに 100% 確信を持っているわけではありません。お気軽に訂正/明確化してください。


実際のフッキングについては、私のために働いたmhook ライブラリを使用することを個人的にお勧めします。そのドキュメントも読む価値があります。

いくつかの代替案については、たとえばこれを参照してください(私はそれらのいずれも試していません)...


編集>

これは、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;
}
于 2015-11-06T10:16:09.453 に答える