2015-12-24 14 views
6

次のコードがあります。CのDLLインジェクションが動作しない

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 
using ClassLibrary1; 

namespace Injection 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //ClassLibrary1.Class1.Main(); 
      Program p = new Program(); 
      String strDLLName = "C:\\Users\\pente\\Documents\\Visual Studio 2015\\Projects\\Injection\\ClassLibrary1\\obj\\Debug\\ClassLibrary1.dll"; 
      String strProcessName = "notepad"; 

      Int32 ProcID = p.GetProcessId(strProcessName); 
      if (ProcID >= 0) 
      { 
       IntPtr hProcess = (IntPtr)OpenProcess(0x1F0FFF, 1, ProcID); 
       if (hProcess == null) 
       { 
        Console.WriteLine("OpenProcess() Failed!"); 
        return; 
       } 
       else 
        p.InjectDLL(hProcess, strDLLName); 
      } 
     } 

     public void InjectDLL(IntPtr hProcess, String strDLLName) 
     { 
      IntPtr bytesout; 

      // Length of string containing the DLL file name +1 byte padding 
      Int32 LenWrite = strDLLName.Length + 1; 
      // Allocate memory within the virtual address space of the target process 
      IntPtr AllocMem = (IntPtr)VirtualAllocEx(hProcess, (IntPtr)null, (uint)LenWrite, 0x1000, 0x40); //allocation pour WriteProcessMemory 

      // Write DLL file name to allocated memory in target process 
      WriteProcessMemory(hProcess, AllocMem, strDLLName, (UIntPtr)LenWrite, out bytesout); 
      // Function pointer "Injector" 
      UIntPtr Injector = (UIntPtr)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 

      if (Injector == null) 
      { 
       Console.WriteLine(" Injector Error! \\n "); 
       // return failed 
       return; 
      } 

      // Create thread in target process, and store handle in hThread 
      IntPtr hThread = (IntPtr)CreateRemoteThread(hProcess, (IntPtr)null, 0, Injector, AllocMem, 0, out bytesout); 
      // Make sure thread handle is valid 
      if (hThread == null) 
      { 
       //incorrect thread handle ... return failed 
       Console.WriteLine(" hThread [ 1 ] Error! \\n "); 
       return; 
      } 
      // Time-out is 10 seconds... 
      int Result = WaitForSingleObject(hThread, 10 * 1000); 
      // Check whether thread timed out... 
      if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF) 
      { 
       /* Thread timed out... */ 
       Console.WriteLine(" hThread [ 2 ] Error! \\n "); 
       // Make sure thread handle is valid before closing... prevents crashes. 
       if (hThread != null) 
       { 
        //Close thread in target process 
        CloseHandle(hThread); 
       } 
       return; 
      } 
      // Sleep thread for 1 second 
      Thread.Sleep(1000); 
      // Clear up allocated space (Allocmem) 
      VirtualFreeEx(hProcess, AllocMem, (UIntPtr)0, 0x8000); 
      // Make sure thread handle is valid before closing... prevents crashes. 
      if (hThread != null) 
      { 
       //Close thread in target process 
       CloseHandle(hThread); 
      } 
      // return succeeded 
      return; 
     } 
     [DllImport("kernel32")] 
     public static extern IntPtr CreateRemoteThread(
     IntPtr hProcess, 
     IntPtr lpThreadAttributes, 
     uint dwStackSize, 
     UIntPtr lpStartAddress, // raw Pointer into remote process 
     IntPtr lpParameter, 
     uint dwCreationFlags, 
     out IntPtr lpThreadId 
    ); 

     [DllImport("kernel32.dll")] 
     public static extern IntPtr OpenProcess(
      UInt32 dwDesiredAccess, 
      Int32 bInheritHandle, 
      Int32 dwProcessId 
      ); 

     [DllImport("kernel32.dll")] 
     public static extern Int32 CloseHandle(
     IntPtr hObject 
     ); 

     [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] 
     static extern bool VirtualFreeEx(
      IntPtr hProcess, 
      IntPtr lpAddress, 
      UIntPtr dwSize, 
      uint dwFreeType 
      ); 

     [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)] 
     public static extern UIntPtr GetProcAddress(
      IntPtr hModule, 
      string procName 
      ); 

     [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)] 
     static extern IntPtr VirtualAllocEx(
      IntPtr hProcess, 
      IntPtr lpAddress, 
      uint dwSize, 
      uint flAllocationType, 
      uint flProtect 
      ); 

     [DllImport("kernel32.dll")] 
     static extern bool WriteProcessMemory(
      IntPtr hProcess, 
      IntPtr lpBaseAddress, 
      string lpBuffer, 
      UIntPtr nSize, 
      out IntPtr lpNumberOfBytesWritten 
     ); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
     public static extern IntPtr GetModuleHandle(
      string lpModuleName 
      ); 

     [DllImport("kernel32", SetLastError = true, ExactSpelling = true)] 
     internal static extern Int32 WaitForSingleObject(
      IntPtr handle, 
      Int32 milliseconds 
      ); 

     public Int32 GetProcessId(String proc) 
     { 
      Process[] ProcList; 
      ProcList = Process.GetProcessesByName(proc); 
      return ProcList[0].Id; 
     } 
    } 
} 

上記のコードは、私のメインプログラムです。私はメモ帳に注入しようとしているコードを下に示しているdllを持っている。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Succeeded!!"); 
      Console.ReadLine(); 
     } 

    } 
} 

メインコードへのdll参照としてライブラリコードを追加しました。

コードは実行され、基本的に何もしません。私は何が欠けていますか?なぜそれは動作しません?

+2

あなたは()C#のDLLをロードするためにLoadLibrary関数を使用することはできませんが、唯一のCLRがアセンブリをロードする方法を知っています。 CLRを別のプロセスに注入すると、まったく不可能ではありませんが、確かに非常に悪い考えです。これは、「2つのプログラムがこれを行うとすればどうなるか」という問題から大きく苦しんでいます。あなたが想定するよりもはるかに多いですが、C#ではあまりにも多くのシェル拡張とCOMサーバーが書かれています。 –

+0

この記事を見てください http://www.codeproject.com/Articles/607352/Injecting-Net-Assemblies-Into-Unmanaged-Processes –

答えて

3

ネイティブライブラリを呼び出そうとしていますが、.NETライブラリにリンクしているため、.NETライブラリのメインが呼び出されることはありません。したがって、ネイティブライブラリ(C++など)を作成し、.Netフレームワークをホストプログラムにロードし、管理されたMain-Methodを実行することをお勧めします。

TL; DR:LoadLibrary関数などが唯一の負荷ネイティブライブラリ

+0

C#のコードをdllに挿入するC++コードへのリソースリンクがありますかプロセスがうまい?私はグーグルで見つけたので、仕事をしないコードサンプルが見つかりました – XWorm

+0

@XWorm EasyHookライブラリを見ることができます。彼らはあなたのネイティブの仕事をすべて取って、あなたはちょうどあなたの.NET DLLを注入するためにいくつかのC#を書く必要があります – DogeAmazed

関連する問題