2010-11-02 2 views
2


Прежде всего, я хотел бы сказать, что я не пытаюсь взломать игру. Я фактически нанят компанией, чей процесс я пытаюсь ввести. :)
Я хотел бы знать, как вызвать функцию из уже введенной DLL.
Итак, я успешно ввел и загрузил свою DLL в цель с помощью CreateRemoteThread(). Ниже вы можете увидеть фрагмент инъекции:Вызовте функцию из впрыскиваемой 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 была загружена правильно.
My 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 к инжектору.
После инъекции в целевой процесс я не знаю, как вызвать ThreadFunc из вложенной DLL, поэтому он никогда не выполняется.
Я не могу использовать GetProcAddress(hLibModule,"ThreadFunc"), так как я вышел из процесса, поэтому ответ должен лежать в вызове CreateRemoteThread() как-то. Кроме того, я прочитал, что DllMain больше не разрешено для .NET DLL, поэтому я тоже не могу получить какое-либо бесплатное исполнение.
Кто-нибудь знает, как вызвать функцию из вложенной DLL?
Спасибо заранее.

ответ

2

Ну, у вас уже есть поток, проходящий внутри этого процесса. Вы заставляете его делать что-то скучное, оно загружает только DLL. Это работает совершенно случайно, LoadLibrary просто нуждается в исправлении сигнатуры функции.

Это может сделать гораздо больше. Тем не менее, лучше быть неуправляемым кодом, так же как LoadLibrary(), вы не можете рассчитывать на какой-либо управляемый код, работающий должным образом. Это требует больше работы heckofalot, вам нужно загрузить и инициализировать среду CLR и сказать ей загрузить и выполнить сборку, которую вы хотите запустить. И нет, вы не можете загрузить CLR в DllMain().

Ключевые слова для поиска: CorBindToRuntimeEx() и ICLRRuntimeHost :: ExecuteInAppDomain(). Это сложный материал, который нужно собирать, но я видел это. Требуются навыки COM и C++ и щедрая помощь.

+0

Я нашел ссылку, используя ключевое слово, которое вы мне дали . Это то, что мне нужно сделать? Он говорит, что мне нужно написать загрузочную DLL, которая затем вводится. Они также говорят, что любой метод инъекций будет работать. Если я вставляю библиотеку bootstrap с помощью вышеприведенной техники, как я могу запустить загрузку DLL для начальной загрузки? Спасибо за ответ. – prettyCode

+0

Да, это подход. Следуйте ссылке на его код инъекции. –