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.
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
Oui, c'est l'approche. Suivez le lien vers son code d'injection. –