最近在学习逆向,碰见有个程序,想要调用OpenThreadToken函数获得当前线程权限。
[ebp+0Ch] = GetCurrentThread()
.text:1002EC16 50 push eax ; TokenHandle
.text:1002EC17 33 F6 xor esi, esi
.text:1002EC19 46 inc esi
.text:1002EC1A 56 push esi ; OpenAsSelf
.text:1002EC1B 6A 08 push 8 ; DesiredAccess
.text:1002EC1D FF 75 0C push dword ptr [ebp+0Ch] ; ThreadHandle
.text:1002EC20 FF 15 14 50 05+ call ds:OpenThreadToken
返回值是0,调用GetlastError(),获得的错误码是 1008:试图引用不存在的令牌。
然后它一直想要通过这种方式获得当前线程的Token。
我很好奇为什么它一直不成功,就自己写程序试了一试。(请不要在意没有初始化变量
)
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread;
HANDLE hToken;
BOOL bSuccess;
DWORD ThreadID;
hThread = GetCurrentThread();
cout << "CurrentThread:"<<hThread << endl;
bSuccess = OpenThreadToken(hThread, TOKEN_QUERY, TRUE, &hToken);
cout << bSuccess << endl;
if (bSuccess)
{
cout << hToken << endl;
}
else
{
cout << GetLastError() << endl;
}
return 0;
}
返回值相同,也是同样的错误码,我调用OpenProcessToken(),是成功的。
那会不会是GetCurrentThread获得的伪句柄没有Query权限,所以不成功,于是我进行了下面的尝试(不要在意没有对返回值进行校验
):
DWORD WINAPI ThreadProc(LPVOID lpParam);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread;
HANDLE hToken;
BOOL bSuccess;
DWORD ThreadID;
HANDLE ThreadTemp;
ThreadTemp = CreateThread(NULL, 0, ThreadProc, 0, 0, &ThreadID);
Sleep(10);
hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, ThreadID);
cout << "CurrentThread:"<<hThread << endl;
bSuccess = OpenThreadToken(hThread, TOKEN_QUERY, TRUE, &hToken);
cout << bSuccess << endl;
if (bSuccess)
{
cout << hToken << endl;
}
else
{
cout << GetLastError() << endl;
}
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
cout << "dfdas" <<endl;
Sleep(10000000);
return 0;
}
结果还是一样,我有点蒙....有没有大牛过来指导一下...
环境是:windows xp(没有sp),windows sp2 windows 7 x32 windows 10 x64,windows7 windows10 的UAC都关了,不过应该是没关系的吧~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课