Я унаследовал некоторый код, который работал в 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