Mam funkcji Windows 7 callgate że używam wywołać funkcje NT bezpośrednio:Próbując stworzyć Windows 8 syscall funkcji callgate
//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);
}
staram się zrobić to samo dla Windows 8.1. Zaktualizowałem wszystkie indeksy wywołania funkcji; Zauważyłem jednak rzeczywista funkcja callgate jest zupełnie inny w systemie Windows 8.1:
Oto co rzeczywiste brama wywołanie wygląda (znajduje się w Ntdll.dll) dla funkcji ZwCreateThreadEx
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
Teraz tutaj jest dokładny ta sama funkcja NT (ZwCreateThreadEx) na Windows 8.1
mov eax, 0xB0 //the call index
call dword ptr fs:[0xC0]
retn 0x2C //2c/4 = 11 parameters
staram wszelkiego rodzaju rzeczy, aby uzyskać ten działa na Windows 8.1, ale nie miałem bezskutecznie. Nie potrafię wyjaśnić, co to jest, ani co się dzieje, tylko wiem, że robię to poprawnie w Windows 7.
Z wyglądu funkcji W8.1 próbowałem wymyślić tę jedną funkcję (Nie działa):
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;
};
}
Każda pomoc zostanie doceniona bardzo.
Dlaczego ... och - dlaczego chcesz to zrobić bez pisania sterownika? –