Bonjour à tous,
Je commence à développer un émulateur de dofus (j'utilise Poco) et je me suis heurté au probleme du cryptage des ip du serveur de connexion. Après une petite recherche dans le forum, j'ai trouvé ce post : https://cadernis.com/d/973-mise-à-jour-d.
Je me suis donc intéressé à la méthode de l'injection de la dll de Sorrow https://gist.github.com/LuaxY/775b94618a6bcba8c746.
Cette dll permet de forcer le client à transmettre en local sans avoir à modifier le fichier conf. (ce qui permet de passer par dessus les vérifications rsa du client).
J'ai cherché sur internet comment injecter cette petite dll dans mon client, j'ai trouvé ce tutoriel : http://xevia.webege.com/old/atoray/2010/06180.php.
J'ai donc développé mon injecteur qui permet d'injecter une dll au choix à un processus donc on indique l'id.
Cliquez pour révéler
Cliquez pour masquer
Pour trouver un Pid, sous windows il faut faire la commande : tasklist /FI "IMAGENAME eq NomApplication.exe"
source:
Cliquez pour révéler
Cliquez pour masquer
#include <iostream>
#include <string>
#include "windows.h"
bool Inject(DWORD pId, std::string dllName);
int main()
{
std::cout << "Bienvenue dans l'assistant d'injection de dll." << std::endl;
std::cout << "veuillez renseigner le chemin de la dll à injecter" << std::endl;
std::string dll_path = "";
std::getline(std::cin, dll_path);
std::cout << "veuillez renseigner le PID de l'application cible" << std::endl;
int pid;
std::cin >> pid;
std::cout << "lancement de l'injection..." << std::endl;
if (Inject(pid, dll_path))
{
std::cout << "injection finie" << std::endl;
}
else
{
std::cout << "erreur lors de l'injection" << std::endl;
}
return 0;
}
bool Inject(DWORD pId, std::string dllPath)
{
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
if (h)
{
void* pLoadLibrary = (void*)GetProcAddress(GetModuleHandle("kernel32"), "LoadLibraryA");
std::cout << "Allocation de la mémoire virtuelle ...\n";
void* pReservedSpace = VirtualAllocEx(h, NULL, strlen(dllPath.c_str()), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (!pReservedSpace)
{
std::cout << "Impossible d'allouer la mémoire virtuelle. GetLastError() = " << GetLastError();
return 0;
}
std::cout << "Ecriture dans la mémoire du processus ...\n";
if (!WriteProcessMemory(h, pReservedSpace, dllPath.c_str(), strlen(dllPath.c_str()), NULL))
{
std::cout << "Erreur pendant l'appel à WriteProcessMemory(). GetLastError() = " << GetLastError();
return 0;
}
std::cout << "Creating remote thread ...\n";
HANDLE hThread = CreateRemoteThread(h,
NULL,
0,
(LPTHREAD_START_ROUTINE)pLoadLibrary,
pReservedSpace,
0,
NULL);
if (!hThread)
{
std::cout << "Impossible de créer le thread. GetLastError() = " << GetLastError();
return 0;
}
std::cout << "Thread créé.\n";
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(h, pReservedSpace, strlen(dllPath.c_str()), MEM_COMMIT);
CloseHandle(hThread);
CloseHandle(h);
std::cout << "fini." << std::endl;
return true;
}
std::cout << "impossible de récupérer le HANDLE du processus indiqué." << std::endl;
return false;
}
A bientot!