2010-11-02 6 views
2


Tout d'abord, je voudrais dire que je n'essaie pas de pirater un jeu. Je suis actuellement employé par l'entreprise dont j'essaie d'injecter le processus. :)
Je voudrais savoir comment appeler une fonction d'une DLL déjà injectée.
J'ai donc réussi à injecter et à charger ma DLL dans la cible en utilisant CreateRemoteThread(). Ci-dessous vous pouvez voir un extrait de l'injection:Appeler une fonction d'une DLL injectée

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; 
    } 

Note: La vérification des erreurs et libérant ainsi des ressources ont été supprimées par souci de concision, mais rassurez-vous je vérifie tous les pointeurs et libres mes ressources.
Après la sortie de la fonction ci-dessus, j'ai un handle de module non nul pour ma DLL renvoyée par LoadLibrary via hLibModule, ce qui signifie que la DLL a été chargée correctement.
Ma DLL est une bibliothèque de classe C# destinée à afficher une boîte de message (à tester). J'ai essayé de tester la fonction et la boîte de message apparaît. Il ressemble à ceci:

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); 

} 

Je le compile à partir de Visual Studio et la DLL apparaît dans le dossier Debug. Je passe ensuite le chemin complet de ma DLL à l'injecteur.
Après l'injection dans le processus cible, je ne sais pas comment appeler mon ThreadFunc à partir de la DLL injectée, donc il ne s'exécute jamais.
Je ne peux pas utiliser GetProcAddress(hLibModule,"ThreadFunc") étant donné que je suis en rupture de processus, la réponse doit donc être d'appeler CreateRemoteThread() en quelque sorte. En outre, j'ai lu que DllMain n'est plus autorisé pour les DLL .NET, donc je ne peux pas obtenir une exécution libre de cette façon non plus.
Est-ce que quelqu'un a une idée de comment appeler une fonction à partir d'une DLL injectée?
Merci d'avance.

Répondre

2

Eh bien, vous avez déjà un thread qui tourne à l'intérieur de ce processus. Vous le faites faire quelque chose d'ennuyeux, il ne charge qu'une DLL. Cela fonctionne complètement par accident, LoadLibrary vient d'avoir à corriger la signature de la fonction.

Il peut faire beaucoup plus. Quoi qu'il soit préférable d'être du code non géré, tout comme LoadLibrary(), vous ne pouvez pas compter sur un code managé fonctionnant correctement. Cela prend un peu plus de travail, vous devez charger et initialiser le CLR et lui dire de charger et d'exécuter l'assembly que vous voulez exécuter. Et non, vous ne pouvez pas charger le CLR dans DllMain().

Les mots-clés à rechercher sont CorBindToRuntimeEx() et ICLRRuntimeHost :: ExecuteInAppDomain(). Ce sont des choses difficiles à faire mais je l'ai vu faire. Compétences COM et C++ et généreuses actions de chance requises.

+0

J'ai trouvé un lien en utilisant le mot-clé que vous m'avez donné . Est-ce ce que je dois faire? Il dit que j'ai besoin d'écrire une DLL bootstrap qui est ensuite injectée. Ils disent aussi que toute technique d'injection fonctionnera. Si j'injecte la DLL d'amorçage en utilisant la technique ci-dessus, comment puis-je faire fonctionner la DLL d'amorçage? Merci de répondre. – prettyCode

+0

Oui, c'est l'approche. Suivez le lien vers son code d'injection. –