2010-11-02 124 views
2


首先我想说的是,我并不想破解游戏。我实际上是由我尝试注入的公司雇用的。 :)
我想知道如何从一个已经注入的DLL中调用一个函数。
因此,我使用CreateRemoteThread()成功注入并加载了我的DLL。下面你可以看到注射的一个片段:从注入的DLL中调用函数

private static bool Inject(Process pToBeInjected, string sDllPath,out string sError, out IntPtr hwnd, out IntPtr hLibModule) 
    { 
     IntPtr zeroPtr = (IntPtr)0; 
     hLibModule = zeroPtr; 

     IntPtr hProcess = NativeUtils.OpenProcess(
      (0x2 | 0x8 | 0x10 | 0x20 | 0x400), //create thread, query info, operation ,write, and read 
      1, 
      (uint)pToBeInjected.Id); 

     hwnd = hProcess; 
     IntPtr loadLibH = NativeUtils.GetProcAddress(NativeUtils.GetModuleHandle("kernel32.dll"),"LoadLibraryA"); 

     IntPtr dllAddress = NativeUtils.VirtualAllocEx(
      hProcess, 
      (IntPtr)null, 
      (IntPtr)sDllPath.Length, //520 bytes should be enough 
      (uint)NativeUtils.AllocationType.Commit | 
      (uint)NativeUtils.AllocationType.Reserve, 
      (uint)NativeUtils.MemoryProtection.ExecuteReadWrite); 

    byte[] bytes = CalcBytes(sDllPath); 
     IntPtr ipTmp = IntPtr.Zero; 

     NativeUtils.WriteProcessMemory(
      hProcess, 
      dllAddress, 
      bytes, 
      (uint)bytes.Length, 
      out ipTmp); 


     IntPtr hThread = NativeUtils.CreateRemoteThread(
      hProcess, 
      (IntPtr)null, 
      (IntPtr)0, 
      loadLibH, //handle to LoabLibrary function 
      dllAddress,//Address of the dll in remote process 
      0, 
      (IntPtr)null); 

     uint retV= NativeUtils.WaitForSingleObject(hThread, NativeUtils.INFINITE_WAIT); 
     bool exitR = NativeUtils.GetExitCodeThread(hThread, out hLibModule); 
     return true; 
    } 

注:错误检查和简洁取出释放资源,但是请放心,我检查所有的指针和自由我的资源。
上面的函数退出后,我有一个非零的模块句柄到我的DLL由LoadLibrary通过hLibModule返回,这意味着DLL正确加载。
我的DLL是一个C#类库,旨在显示一个消息框(用于测试)。我已经尝试过测试该功能,并弹出消息框。它看起来像这样:

public class Class1 
    { 
     public static void ThreadFunc(IntPtr param) 
     {  
     IntPtr libPtr = LoadLibrary("user32.dll"); 

      MessageBox(IntPtr.Zero, "I'm ALIVE!!!!", "InjectedDll", 0); 

     } 
     [DllImport("kernel32", SetLastError = true)] 
     public static extern IntPtr LoadLibrary(string lpFileName); 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     static extern int MessageBox(IntPtr hWnd, String text, String caption, int options); 

} 

我从Visual Studio编译它,DLL出现在Debug文件夹中。然后我将DLL的完整路径传递给注入器。
注入到目标进程后,我不知道如何从注入的DLL中调用我的ThreadFunc,因此它永远不会执行。
我不能使用GetProcAddress(hLibModule,"ThreadFunc"),因为我没有进程,所以答案肯定在于调用CreateRemoteThread()。另外,我已经读过DllMain不再允许使用.NET DLL,所以我也无法获得任何自由执行。
有没有人有任何想法如何从注入的DLL调用函数?
预先感谢您。

回答

2

那么,你已经有一个线程运行在这个过程中。你让它做一些无聊的事,它只加载一个DLL。这完全是偶然的,LoadLibrary恰好需要纠正函数签名。

它可以做更多。无论如何,最好是非托管代码,就像LoadLibrary()一样,不能指望任何托管代码正常运行。这需要更多的工作,你必须加载并初始化CLR,并告诉它加载并执行你想运行的程序集。不,你不能在DllMain()中加载CLR。

要查找的关键字是CorBindToRuntimeEx()和ICLRRuntimeHost :: ExecuteInAppDomain()。这是坚韧不拔的东西,但我已经看到它完成。 COM和C++技能和慷慨的运气需求。

+0

我找到了一个链接,使用您给我的关键字。这是我需要做的吗?它说我需要编写一个引导DLL,然后注入。他们还表示,任何注射技术都可以发挥作用。如果我使用上述技术注入引导DLL,那么我将如何获得引导DLL运行?谢谢回答。 – prettyCode 2010-11-03 06:46:15

+0

是的,这就是方法。按照他的注射代码链接。 – 2010-11-03 10:22:00