gpt4 book ai didi

c++ - 在堆栈顶部搜索线程启动参数

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:52 25 4
gpt4 key购买 nike

我继承了一些在 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 的地址

最佳答案

奇怪。查看调试器,线程堆栈上的第一个非空值是参数的值,即 CreateThread 的第 4 个参数。当您像这样编写线程过程时,它会以银盘的形式交给您:

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

不确定这与“kernel32!CtrlRoutine”有何关系,除非这是服务中使用的线程。

关于c++ - 在堆栈顶部搜索线程启动参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com