繁体   English   中英

可以进行C ++ / CLI注入吗?

[英]C++/CLI injection is possible?

所以我有自己的C ++ / CLI应用程序,可将自身注入目标进程。 但是,尽管注入似乎成功,但没有调用入口点。 这是我的注射器:

#include "stdafx.h"
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <stdlib.h>
#include <comdef.h>
#include "Hooking.h"
#include "HCommonEnsureCleanup.h"

VOID Hooking::HookProcess()
{
    DWORD firefox = Hooking::FindProcessId("firefox.exe");
    Inject(firefox);
}
BOOL Hooking::Inject(DWORD pID)
{
    const wchar_t* DLL_NAME = (const wchar_t*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(System::Windows::Forms::Application::ExecutablePath);
    HANDLE Proc;
    HMODULE hLib;
    char buf[50] = { 0 };
    LPVOID RemoteString, LoadLibAddy;
    if (!pID)
        return false;
    Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
    if (!Proc)
    {
        return false;
    }
    LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
    RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, (wcslen(DLL_NAME) + 1) * sizeof(wchar_t), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(Proc, (LPVOID)RemoteString, DLL_NAME, (wcslen(DLL_NAME) + 1) * sizeof(wchar_t), NULL);
    CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);
    CloseHandle(Proc);
    return true;
}
DWORD Hooking::FindProcessId(const char *processname)
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD result = NULL;
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hProcessSnap) return(FALSE);
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);
        return(NULL);
    }
    do
    {
        if (0 == strcmp(processname, _bstr_t(pe32.szExeFile)))
        {
            result = pe32.th32ProcessID;
            break;
        }
    } while (Process32Next(hProcessSnap, &pe32));
    CloseHandle(hProcessSnap);
    return result;
}

然后(因为我的程序是可执行的),我做了一个dll入口点:

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    Hooking::HookProcess();
    return 0;
}
BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
)
{
    MessageBoxA(NULL, "Injection OK", "Injection OK", NULL);
}

但是,我的两个入口点(Dll或exe)都没有被调用。 所以我在想这可能是因为该exe包含.Net代码,但是在更改它之前,我想在这里提出。

感谢您的时间

首先,将“((wcslen(DLL_NAME))+ 1)* sizeof(wchar_t)”更改为“ wcslen(DLL_NAME)”,就足够了。 确保也更新内存分配。

其次,您要将一个Unicode编码的缓冲区传递给LoadLibraryA。 那是行不通的,因为LoadLibraryA不接受unicode编码的缓冲区,它需要一个Ascii编码的缓冲区。 请改用LoadLibraryW。

第三,您不执行任何错误检查。 您不能仅仅假定两个虚拟内存操作和远程线程创建操作将成功,您需要检查每个操作的返回状态以确保成功,否则就停止执行注入例程。 这也将使您了解操作失败的原因。 您需要将调试器附加到目标进程,以确保在分配和写入内存后内存也应该是正确的。

最后但并非最不重要的一点是,确保您具有足够的特权来定位目标进程。 例如,如果您以标准权限运行,则无法定位提升权限的进程,也无法定位已启用自我保护功能的传统安全解决方案。 这里有很多不同的因素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM