Поиск параметров запуска потока на вершине стека - PullRequest
1 голос
/ 26 октября 2010

Я унаследовал некоторый код, который работал в Windows 2000, использующий небольшой фрагмент кода сборки для определения базового адреса стека, а затем он использует смещение для получения значения параметра, переданного функции запуска потока.

Однако это не работает в Windows 2008 Server.Смещение, очевидно, отличается.

#define TEB_OFFSET 4
    DWORD * pStackBase;
    __asm { mov eax,fs:[TEB_OFFSET]}
    __asm { mov pStackBase,eax}

    // Read the parameter off the stack
#define PARAM_0_OF_BASE_THEAD_START_OFFSET -3
    g_dwCtrlRoutineAddr = pStackBase[PARAM_0_OF_BASE_THEAD_START_OFFSET];

После экспериментов я изменил код для поиска в стеке, пока он не найдет первое значение, отличное от NULL. взломать

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

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

Это работает!Но я хочу 'правильное' решение.

Кто-нибудь знает более безопасное / лучшее решение для передачи параметра в функцию запуска потока в Windows 2008 Server?

Функция запуска потока - это ntdll! _RtlUserThreadStart

И первым параметром, который я пытаюсь найти, является адрес функции kernel32! CtrlRoutine

Ответы [ 3 ]

1 голос
/ 26 октября 2010

Bizarre. Если посмотреть в отладчике, первое ненулевое значение в стеке потока - это значение аргумента, 4-го аргумента для CreateThread. Который вручается вам на серебряном блюде, когда вы пишете процедуру потока следующим образом:

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

Не уверен, как это связано с "kernel32! CtrlRoutine", если только это не поток, используемый в сервисе.

0 голосов
/ 16 апреля 2012

Это тоже обсуждается http://www.latenighthacking.com/projects/2003/sendsignal/

0 голосов
/ 26 октября 2010

Чтобы получить адрес kernel32! CtrlRoutine, вы можете получить его по RVA, используя таблицу со всеми парами (версия kernel32, CtrlRoutine RVA).Это самый надежный способ.

...