簡體   English   中英

使用C#在Windows 10的記事本中注入C ++ DLL

[英]Injecting C++ DLLs into notepad on windows 10 using C#

bool bInject(uint pToBeInjected, string sDllPath)
    {
        IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected);

        if (hndProc == INTPTR_ZERO)
        {
            return false;
        }

        IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

        if (lpLLAddress == INTPTR_ZERO)
        {
            return false;
        }

        IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40);

        byte[] bytes = Encoding.ASCII.GetBytes(sDllPath);

        WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0);

        // This next one is the one that doesn't seem to work.
        CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null);
        CloseHandle(hndProc);

        return true;
    }

我在為x86編譯的.NET 4.6.1中使用C#(顯然)。 在上面的代碼中,我注釋了似乎無效的命令。 CreateRemoteThread調用。 沒有錯誤返回,受害進程(記事本)不顯示任何注入了以下DLL的跡象(我是從一個示例項目中拉出的,因為我很懶。)。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

extern "C" __declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam) {
  MessageBox(NULL, "Hello world!", "Hello World!", NULL);
  return 0;
}

extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved) {
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
      CreateThread(NULL, NULL, MessageBoxThread, NULL, NULL, NULL);
      break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}

記住,我使用的是Windows10。我想可能還有其他安全檢查,以防止我注入所說的DLL。 之后,我計划制作一個引導DLL來加載CLR和另一個C#DLL。

非常感謝您提供的任何幫助!

您應該將預處理器定義用作API調用的標志,這更加清楚。

我相信對於VirtualAllocEx您嘗試將PAGE_READWRITE作為標志傳遞,但是您改為傳遞0x40 ,它的定義為#define PAGE_READWRITE 0x04 因此,或者直接使用PAGE_READWRITE ,或者如果您想“酷”使用0x04

另外,我從未使用過字符串類,但是您應該執行sDllPath.Length + 1 ,因為它可能也不會將null終止符添加到您的路徑中!

為了更精確(在以后的問題中),您可以將錯誤代碼添加到問題中! 您可以使用:

CHAR Error[MAX_PATH]; // MAX_PATH is used for system paths, it's still big enough
wsprintfA(Error, "Error: %lu", GetLastError());
MessageBoxA(0, Error, 0, 0);

在您的CreateRemoteThread立即獲取系統錯誤代碼 -它可以隨時幫助您了解應用程序中的錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM