C>В итоге чего значение Owner получается 0xcdcdcdcd что вроде не есть гуд.
А если бы дело было не с ntdll, а в ядре где нет дебажного CRT, как бы обнаружилась ошибка, если возвращаемый статус не проверяется?
Поскольку вопрос задан в этом подфоруме, то — написать обёртку по псевдокоду:
length = размер минимального объекта, или 0;
for ( ; ; )
{
char * ptr = new char[length];
NTSTATUS const s = ZwQueryStuff(ptr, length, &length); // Was the name of the original NT developer really Zimbanza Woobie!?if ( s == STATUS_SUCCESS )
break;
if ( s == STATUS_BUFFER_TOO_SMALL )
{
delete ptr;
continue;
}
else TBD
}
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: ZwQuerySecurityObject. Как грамотно пользоваться?
"The handle must either grant READ_CONTROL access to the object
or the caller must be the owner of the object.To access the system ACL of the object,
the handle must grant ACCESS_SYSTEM_SECURITY." (с) Gary Nebbett
А как получить хендл с соответствующими правами?
Re[5]: ZwQuerySecurityObject. Как грамотно пользоваться?
, тогда советую подучить язык C и затем обратить внимание на
PULONG ReturnL=0;
...
status = pZwQuerySecurityObject(directoryHandle,DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION,pSD,uLength,ReturnL);
Дело в том, что в эту функцию нельзя передавать NULL в качестве последнего параметра (т.к. об этом не сказано в документации). И действительно: ZwQuerySecurityObject пытается скопировать туда размер, который вернула ей security-процедура:
//
// Indicate the length needed for the security descriptor. This
// will be set even if the callback failed so the caller will know
// the number of bytes necessary
//try {
*LengthNeeded = Length;
} except(EXCEPTION_EXECUTE_HANDLER) {
ObDereferenceObject( Object );
return(GetExceptionCode());
}
и, конечно же, обламывается с исключением STATUS_ACCESS_VIOLATION. Правильно было бы так:
ULONG ReturnL=0;
...
status = pZwQuerySecurityObject(directoryHandle,DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|OWNER_SECURITY_INFORMATION,pSD,uLength,&ReturnL);
Re[10]: ZwQuerySecurityObject. Как грамотно пользоваться?
Здравствуйте, x64, Вы писали:
x64>Дело в том, что в эту функцию нельзя передавать NULL в качестве последнего параметра (т.к. об этом не сказано в документации).
Всё там сказано, причем явно:
Pointer to a caller-allocated variable that receives the number of bytes required to store the copied security descriptor
А совет, скорее — разобраться с дурацкими паскалевскими типами вроде PULONG и прочитать про аннотации IN, OUT и OPTIONAL.
x64>Правильно было бы так:
x64>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[11]: ZwQuerySecurityObject. Как грамотно пользоваться?
x64>>Дело в том, что в эту функцию нельзя передавать NULL в качестве последнего параметра (т.к. об этом не сказано в документации). GN>Всё там сказано, причем явно: GN>Pointer to a caller-allocated variable that receives the number of bytes required to store the copied security descriptor
Сумничал типа, да? Где здесь сказано, что NULL передавать можно/нельзя?
Re[12]: ZwQuerySecurityObject. Как грамотно пользоваться?
Здравствуйте, x64, Вы писали:
x64>Сумничал типа, да?
Ошибку исправил в твоём "правильно так"
x64> Где здесь сказано, что NULL передавать можно/нельзя?
caller-allocated
Аллоцируй по 0му адресу. Обломится, кстати, раньше — на ProbeForWriteUlong.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[12]: ZwQuerySecurityObject. Как грамотно пользоваться?
попадёт в бесконечный цикл при STATUS_BUFFER_TOO_SMALL, поскольку возвращаемый функцией требуемый размер буфера игнорируется. Работа кода возможна по случайности — выбран заведомо большой размер буфера (2Kb).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth