【发布时间】:2015-04-24 09:45:42
【问题描述】:
我有一个 windows 7 callgate 函数,我用它来直接调用 NT 函数:
//Windows 7 syscall
__declspec(naked)
NTSTATUS __fastcall wow64 ( DWORD ecxId, char *edxArgs )
{
__asm
{
mov eax, ecx;
mov ecx, m_param;
call DWORD ptr fs:[0xc0];
add esp, 0x4;
retn;
};
}
NTSTATUS callGate ( DWORD id, ... )
{
va_list valist;
va_start(valist,id);
return wow64(id,valist);
}
//Example NTClose function
NTSTATUS closeHandle ( void *object )
{
m_param = 0;
return callGate ( 0xc, object );
}
我正在尝试为 Windows 8.1 做同样的事情。我已经更新了所有的函数调用索引;但是我注意到实际的 callgate 函数在 windows 8.1 上是完全不同的:
这是函数 ZwCreateThreadEx 的实际调用门(位于 ntdll.dll 中)的样子
mov eax, 0xA5 //the call index
xor ecx, ecx //(m_param)
lea edx, dword ptr ss:[esp + 0x4] //this causes an sp-analysis failure in IDA
call dword ptr fs:[0xC0]
add esp, 0x4
retn 0x2C
现在这里是 Windows 8.1 上完全相同的 NT 函数 (ZwCreateThreadEx)
mov eax, 0xB0 //the call index
call dword ptr fs:[0xC0]
retn 0x2C //2c/4 = 11 parameters
我一直在尝试各种方法以使其在 Windows 8.1 上运行,但无济于事。我无法解释问题是什么或出了什么问题,我只知道我在 Windows 7 上做得正确。
从 W8.1 功能的外观来看,我试图提出这个单一的功能(不起作用):
DWORD dwebp,dwret,dwparams; //for saving stuff
NTSTATUS __cdecl callGate ( DWORD id, DWORD numparams, ... )
{
_asm
{
pop dwebp; //save ebp off stack
pop dwret; //save return address
pop eax; //save id
pop dwparams; //save param count
push dwret; //push return addy back onto stack cuz thats how windows has it
JMP DWORD ptr fs:[0xc0]; //call with correct stackframe (i think)
mov ecx, numparams; //store num params
imul ecx, 4; //multiply numparams by sizeof(int)
add esp, ecx; //add to esp
ret;
};
}
任何帮助将不胜感激。
【问题讨论】:
-
为什么-哦-为什么要在不编写驱动程序的情况下这样做?