|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
HOOKING SOUS NT AVEC CREATEREMOTETHREAD (VC++7, COMPILABLE AC LE 6 AUSSI)
Information sur la source
Description
bin ... ya pas grand chose a dire ...
l'executable copie une partie de son code dans la mémoire du process 'cible', et l'execute
Source
- // code compilé avec vc++7
- // c compilable aussi sur le 6, mais a vous de jouer avec les options du compilo pour que ca marche
- #include <windows.h>
-
- typedef HMODULE (WINAPI* fnLoadLibrary)(LPCTSTR LibName);
- typedef FARPROC (WINAPI* fnGetProcAddress)(HMODULE hLib, LPCTSTR FuncName);
- typedef int (WINAPI* fnMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
- typedef BOOL (WINAPI* fnFreeLibrary)(HMODULE hLib);
- typedef void (WINAPI* fnExitThread)(DWORD dwxitCode);
-
- typedef struct InJack
- {
- fnLoadLibrary pLoadLibrary;
- fnGetProcAddress pGetProcAddress;
- } InJack, *pInJack;
-
- static DWORD WINAPI RemoteEntry(pInJack Data)
- {
- // vc++ (6 et 7) alloue la mémoire ds le code avec cette méthode, ainsi on a pas de lien vers le segment de données (qui n'est pas copié)
- char szUser[] = {'u','s','e','r','3','2',0};
- char szMsgBox[] = {'M','e','s','s','a','g','e','B','o','x','A',0};
- char szKernel[] = {'k','e','r','n','e','l','3','2',0};
- char szFreeLib[] = {'F','r','e','e','L','i','b','r','a','r','y',0};
- char szExitThread[] = {'E','x','i','t','T','h','r','e','a','d',0};
-
- HMODULE hKern = Data->pLoadLibrary(szKernel);
- fnFreeLibrary pFreeLibrary = (fnFreeLibrary)Data->pGetProcAddress(hKern, szFreeLib);
- fnExitThread pExitThread = (fnExitThread)Data->pGetProcAddress(hKern, szExitThread);
- pFreeLibrary(hKern);
-
- HMODULE hUser = Data->pLoadLibrary(szUser);
- fnMessageBox pMessageBox = (fnMessageBox)Data->pGetProcAddress(hUser, szMsgBox);
-
- pMessageBox(NULL, szUser, szMsgBox, NULL);
-
- pFreeLibrary(hUser);
-
- pExitThread(0);
- // apparement sinon il aime pas le return 0, il fait une violation mémoire
- // il me semble que le compilo ne l'ait pas pris en compte ...
- return 0;
- }
-
- static void EndRemoteEntry() {}
-
- void Main()
- {
- BOOL k;
-
- // on ouvre le processus
- HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1356); // pid du process ... (ds le gestionnaire des tâches)
- int cbCodeSize = ((LPBYTE) EndRemoteEntry - (LPBYTE) RemoteEntry);
-
- // on copie le code
- LPVOID CodeMem = VirtualAllocEx(hProc, NULL, cbCodeSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
- k = WriteProcessMemory(hProc, CodeMem, &RemoteEntry, cbCodeSize, 0);
-
- // on remplit les données
- InJack Data;
- HMODULE hKern = LoadLibrary("kernel32");
- Data.pGetProcAddress = (fnGetProcAddress)GetProcAddress(hKern, "GetProcAddress");
- Data.pLoadLibrary = (fnLoadLibrary)GetProcAddress(hKern, "LoadLibraryA");
- FreeLibrary(hKern);
-
- LPVOID DataMem = VirtualAllocEx(hProc, NULL, sizeof(Data), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
- k = WriteProcessMemory(hProc, DataMem, &Data, sizeof(Data), 0);
-
- DWORD ThreadID;
- HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)CodeMem, DataMem, 0, &ThreadID);
- CloseHandle(hThread);
- }
// code compilé avec vc++7
// c compilable aussi sur le 6, mais a vous de jouer avec les options du compilo pour que ca marche
#include <windows.h>
typedef HMODULE (WINAPI* fnLoadLibrary)(LPCTSTR LibName);
typedef FARPROC (WINAPI* fnGetProcAddress)(HMODULE hLib, LPCTSTR FuncName);
typedef int (WINAPI* fnMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
typedef BOOL (WINAPI* fnFreeLibrary)(HMODULE hLib);
typedef void (WINAPI* fnExitThread)(DWORD dwxitCode);
typedef struct InJack
{
fnLoadLibrary pLoadLibrary;
fnGetProcAddress pGetProcAddress;
} InJack, *pInJack;
static DWORD WINAPI RemoteEntry(pInJack Data)
{
// vc++ (6 et 7) alloue la mémoire ds le code avec cette méthode, ainsi on a pas de lien vers le segment de données (qui n'est pas copié)
char szUser[] = {'u','s','e','r','3','2',0};
char szMsgBox[] = {'M','e','s','s','a','g','e','B','o','x','A',0};
char szKernel[] = {'k','e','r','n','e','l','3','2',0};
char szFreeLib[] = {'F','r','e','e','L','i','b','r','a','r','y',0};
char szExitThread[] = {'E','x','i','t','T','h','r','e','a','d',0};
HMODULE hKern = Data->pLoadLibrary(szKernel);
fnFreeLibrary pFreeLibrary = (fnFreeLibrary)Data->pGetProcAddress(hKern, szFreeLib);
fnExitThread pExitThread = (fnExitThread)Data->pGetProcAddress(hKern, szExitThread);
pFreeLibrary(hKern);
HMODULE hUser = Data->pLoadLibrary(szUser);
fnMessageBox pMessageBox = (fnMessageBox)Data->pGetProcAddress(hUser, szMsgBox);
pMessageBox(NULL, szUser, szMsgBox, NULL);
pFreeLibrary(hUser);
pExitThread(0);
// apparement sinon il aime pas le return 0, il fait une violation mémoire
// il me semble que le compilo ne l'ait pas pris en compte ...
return 0;
}
static void EndRemoteEntry() {}
void Main()
{
BOOL k;
// on ouvre le processus
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1356); // pid du process ... (ds le gestionnaire des tâches)
int cbCodeSize = ((LPBYTE) EndRemoteEntry - (LPBYTE) RemoteEntry);
// on copie le code
LPVOID CodeMem = VirtualAllocEx(hProc, NULL, cbCodeSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
k = WriteProcessMemory(hProc, CodeMem, &RemoteEntry, cbCodeSize, 0);
// on remplit les données
InJack Data;
HMODULE hKern = LoadLibrary("kernel32");
Data.pGetProcAddress = (fnGetProcAddress)GetProcAddress(hKern, "GetProcAddress");
Data.pLoadLibrary = (fnLoadLibrary)GetProcAddress(hKern, "LoadLibraryA");
FreeLibrary(hKern);
LPVOID DataMem = VirtualAllocEx(hProc, NULL, sizeof(Data), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
k = WriteProcessMemory(hProc, DataMem, &Data, sizeof(Data), 0);
DWORD ThreadID;
HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)CodeMem, DataMem, 0, &ThreadID);
CloseHandle(hThread);
}
Conclusion
Dites moi si vous avez d'autres méthodes / des améliorations :)
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
|