2017-09-01 22 views
0

アンマネージドdllを使用してマネージdllファイルの関数を呼び出す方法を特定できませんでした。アンマネージdllファイル(実行中のプロセスに注入されている)からマネージdllを呼び出す

現在、以下のように管理対象DLLを実行中のプロセスに注入し、管理対象DLLを呼び出すことができました(主に私は初心者ですが、C++への初心者です)。

#include "stdafx.h" 
#include <Windows.h> 
#include "dllmain.h" 

BOOL APIENTRY DllMain(HMODULE hModule, 
        DWORD ul_reason_for_call, 
        LPVOID lpReserved ) 
{ 
switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
    { 
    LoadManagedProject(L"C:\\Users\\nagaganesh.kurcheti\\Desktop\\ExampleProject.dll"); 
    DisplayPid(); 
    break; 
    } 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
    break; 
} 
return TRUE; 
} 

void DisplayPid() 
{ 
DWORD pid = GetCurrentProcessId(); 
wchar_t buf[64]; 
wsprintf(buf, L"Hey, it worked! Pid is %d", pid); 
MessageBox(NULL, buf, L"Injected NEW MessageBox", NULL); 
} 

AND DLL mainから私のように見える注入プロセスを処理する関数CALLING AM: - Iは、試行回数後にこのプロセスを注入することができなかった

DllExport void LoadManagedProject(const wchar_t * managedDllLocation) 
{ 
HRESULT hr; 
ICLRMetaHost* pClrMetaHost = NULL; 
ICLRRuntimeInfo* pClrRuntimeInfo = NULL; 
ICLRRuntimeHost* pClrRuntimeHost = NULL; 
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pClrMetaHost); 
if (hr == S_OK) 
{ 


    hr = pClrMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pClrRuntimeInfo)); 
    if (hr == S_OK) 
    {   
     BOOL fLoadable; 
     hr = pClrRuntimeInfo->IsLoadable(&fLoadable); 
     if ((hr == S_OK) && fLoadable) 
     {     
      hr = pClrRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, 
       IID_PPV_ARGS(&pClrRuntimeHost)); 
      if (hr == S_OK) 
      { 
       hr = pClrRuntimeHost->Start(); 
       if (hr == S_OK) 
       { 
        MessageBox(NULL, L"HR=SOK45STTIME", L"Injected MessageBox", NULL); 

        DWORD result; 
        hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(
         managedDllLocation, 
         L"ExampleProject.Example", 
         L"EntryPoint", 
         L"Argument", 
         &result); 
        if (hr == S_OK) 
        { 
         MessageBox(NULL, L"HR=SOK6STTIME", L"Injected MessageBox", NULL); 
        } 

       } 
      } 
     } 
    } 
} 
} 

を。 実行中のプロセスに注入されたアンマネージドDLLを使用して、管理対象のDLL(C#)を呼び出す方法を間違えたり、より良いアプローチを提案したりすることはできますか?前もって感謝します。

UPDATE:

それはこのようできない場合は、実行中のプロセスにマネージDLLを注入する任意の最善のアプローチを提案することができます。あなたは

+0

グーグル「のDllMainローダーロック」への詳細を見つけることができますなぜこれがうまくいかないのかを調べる。 –

+0

詳細を教えてください。私はこの状況の初心者です。 –

答えて

1

あなたがここにEasyHook を使用して管理されていないプロセスにマネージDLLを注入することによって、これを達成することができ感謝してサンプルコードです:

#include <easyhook.h> 
#include <string> 
#include <iostream> 
#include <Windows.h> 

DWORD gFreqOffset = 0; 
BOOL WINAPI myBeepHook(DWORD dwFreq, DWORD dwDuration) 
{ 
    std::cout << "\n BeepHook: ****All your beeps belong to us!\n\n"; 
    return Beep(dwFreq + gFreqOffset, dwDuration); 
} 

// EasyHook will be looking for this export to support DLL injection. If not found then 
// DLL injection will fail. 
extern "C" void __declspec(dllexport) __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* inRemoteInfo); 

void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* inRemoteInfo) 
{ 
    std::cout << "\n\nNativeInjectionEntryPointt(REMOTE_ENTRY_INFO* inRemoteInfo)\n\n" << 
     "IIIII   jjj    tt    dd !!! \n" 
     " III nn nnn   eee cccc tt  eee  dd !!! \n" 
     " III nnn nn jjj ee e cc  tttt ee e dddddd !!! \n" 
     " III nn nn jjj eeeee cc  tt eeeee dd dd  \n" 
     "IIIII nn nn jjj eeeee ccccc tttt eeeee dddddd !!! \n" 
     "    jjjj           \n\n"; 

    std::cout << "Injected by process Id: " << inRemoteInfo->HostPID << "\n"; 
    std::cout << "Passed in data size: " << inRemoteInfo->UserDataSize << "\n"; 
    if (inRemoteInfo->UserDataSize == sizeof(DWORD)) 
    { 
     gFreqOffset = *reinterpret_cast<DWORD *>(inRemoteInfo->UserData); 
     std::cout << "Adjusting Beep frequency by: " << gFreqOffset << "\n"; 
    } 

    // Perform hooking 
    HOOK_TRACE_INFO hHook = { NULL }; // keep track of our hook 

    std::cout << "\n"; 
    std::cout << "Win32 Beep found at address: " << GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep") << "\n"; 

    // Install the hook 
    NTSTATUS result = LhInstallHook(
     GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Beep"), 
     myBeepHook, 
     NULL, 
     &hHook); 
    if (FAILED(result)) 
    { 
     std::wstring s(RtlGetLastErrorString()); 
     std::wcout << "Failed to install hook: "; 
     std::wcout << s; 
    } 
    else 
    { 
     std::cout << "Hook 'myBeepHook installed successfully."; 
    } 

    // If the threadId in the ACL is set to 0, 
    // then internally EasyHook uses GetCurrentThreadId() 
    ULONG ACLEntries[1] = { 0 }; 

    // Disable the hook for the provided threadIds, enable for all others 
    LhSetExclusiveACL(ACLEntries, 1, &hHook); 

    return; 
} 

それとも、original source

関連する問題