2010-10-26 3 views
1

J'ai hérité du code qui fonctionnait sous Windows 2000 en utilisant un petit morceau de code d'assemblage pour localiser l'adresse de base de la pile, puis il utilisait un décalage pour saisir la valeur du paramètre passé à la fonction de démarrage du thread.Recherche de paramètres de début de threads en haut de la pile

Toutefois, cela ne fonctionne pas dans Windows 2008 Server. Le décalage est évidemment différent. Après l'expérimentation, j'ai modifié le code pour rechercher la pile jusqu'à ce qu'elle trouve la première valeur non NULL. pirater

DWORD* pStack = pStackBase; 
do 
{ 
    pStack--; 
} 
while (*pStack == NULL); 

// Read the parameter off the stack 
g_dwCtrlRoutineAddr = *pStack; 

Ses œuvres! Mais je veux une solution 'correcte'.

Est-ce que quelqu'un connaît une solution plus sûre/meilleure pour obtenir le paramètre passé à la fonction de démarrage d'un thread sur Windows 2008 Server?

La fonction de démarrage de fil est ntdll! _RtlUserThreadStart

Et le premier paramètre que j'essaie de localiser l'adresse de la kernel32 fonction! CtrlRoutine

+0

Votre question réelle est « comment obtenir l'adresse de kernel32.CtrlRoutine » – Abyx

Répondre

0

Pour obtenir l'adresse de kernel32! CtrlRoutine vous pouvez l'obtenir par RVA, en utilisant une table avec toutes les paires (version kernel32, CtrlRoutine RVA). C'est le moyen le plus fiable.

+0

pourriez-vous expliquer un peu plus? – solidstore

+0

@solidstore Obtenez toutes les versions de kernel32, trouvez CtrlRoutine en eux, faites la table de leur RVA, puis utilisez cette table pour obtenir RVA de CtrlRoutine dans votre programme. – Abyx

1

Bizarre. En regardant avec le débogueur, la première valeur non nulle sur la pile du thread est la valeur de l'argument, le 4ème argument de CreateThread. Qui vous amène remis à un plateau d'argent lorsque vous écrivez la procédure de fil comme celui-ci:

DWORD WINAPI threadProc(void* arg) { 
    // arg is the value you are looking for 
    // etc.. 
} 

Je ne sais pas comment cela est lié à « kernel32 CtrlRoutine! » À moins que cela est un fil utilisé dans un service.

Questions connexes