Hooking sous nt avec createremotethread (vc++7, compilable ac le 6 aussi)

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 / Exemple :


// 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 :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.