RtlRemoteCall
Alex Ionescu nous fait découvrir sur son blog un jolie petite API, RtlRemoteCall, je cite :
« Basically, it hijacks any thread of your choice into any process that you have access to, and sends the thread to a new “CallSite” by updating its EIP there. It also allocates a new ESP, and pushes up to 4 parameters at most »
Mr Totoscu nous promet le code dans pas longtemps, par curiositée je lance mon IDA et jette un coup d’oeil rapide sur RtlRemoteCall.
Le prototype de la fonction est le suivant :
NTSTATUS
NTAPI
RtlRemoteCall(
IN HANDLE Process,
IN HANDLE Thread,
IN PVOID CallSite,
IN ULONG ArgumentCount,
IN PULONG Arguments,
IN BOOLEAN PassContext,
IN BOOLEAN AlreadySuspended
);
Le fonctionnement est assez intuitif :
1. Appel sur NtSuspendThread pour stoper le thread passé en param.
2. NtGetContextThread récupère une structure CONTEXT sur le thread, celle ci contient l’état de tout les registres du thread mit en pause.
3. Si PassContext est vrai, alors on copie (avec NtWriteVirtualMemory) dans la stack du thread distant son CONTEXT pour pouvoir l’utiliser en tant qu’argument.
4. Copie les arguments dans la pile à partir de ESP.
5. Redéfinit l’ESP et l’EIP de la structure CONTEXT puis met a jour le context avec NtSetContextThread.
6. Relance le thread avec NtResumeThread qui va continuer sur le nouvel EIP et sa nouvelle stack.
Par contre si après avoir lancé notre nouvelle fonction celle ci ne se débrouille pas pour reprendre l’exécution du thread ou il avait été stoppé, le programme plante. Avec le paramètre PassContext mit à vrai, on peu récup le CONTEXT du thread et demander à notre fonction de relancer l’exécution, sweet :}
Autrement aller voir sur mon blog le post « Thread Hijacking » vous trouverez la même chose faite à partir d’API documentées. Si j’avais su l’existence ce cette fonction je ne me serais pas fait chier à la recoder mais bon c’est la magie « windows » :]
Le post d’Alex : http://www.alex-ionescu.com/?p=28
Add comment février 14th, 2007