Народ не подскажите возможно ли вообше подключится к этому порту из Usermode делаю так Код (Text): int main(int argc, char* argv[]) { HANDLE PortSection,PortHandle; NTSTATUS Status; PORT_SECTION_WRITE ClientWr; PORT_SECTION_READ SerRead; PSID SysSid; SID_IDENTIFIER_AUTHORITY NtAuth = SECURITY_NT_AUTHORITY; ULONG ConnectDataLength; CSR_API_CONNECTINFO ConnectData; ULONG MaxMessageSize; UNICODE_STRING PortName; SECURITY_QUALITY_OF_SERVICE Qos; Qos.Length=sizeof(SECURITY_QUALITY_OF_SERVICE); Qos.ImpersonationLevel=SecurityImpersonation; Qos.ContextTrackingMode=SECURITY_DYNAMIC_TRACKING; Qos.EffectiveOnly=TRUE; LARGE_INTEGER SectionSize; SectionSize.HighPart=0; SectionSize.LowPart=0x10000; Status = NtCreateSection( &PortSection, SECTION_ALL_ACCESS, NULL, &SectionSize, PAGE_READWRITE, SEC_RESERVE, NULL ); if(!NT_SUCCESS(Status)) { return Status;} ClientWr.Length=sizeof(PORT_SECTION_WRITE); ClientWr.SectionHandle=PortSection; ClientWr.SectionOffset=0; ClientWr.ViewSize= SectionSize.LowPart; ClientWr.ViewBase=0; ClientWr.TargetViewBase=0; SerRead.Length=sizeof(PORT_SECTION_READ); SerRead.ViewSize=0; SerRead.ViewBase=0; SysSid=NULL; Status = RtlAllocateAndInitializeSid( &NtAuth, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SysSid ); if(!NT_SUCCESS(Status)) { return Status;} ConnectDataLength = sizeof(ConnectData); ConnectData.ExpectedVersion=0x000001; RtlInitUnicodeString(&PortName,L"\\Windows\\ApiPort"); Status=ZwSecureConnectPort( &PortHandle, &PortName, &Qos, &ClientWr, SysSid, &SerRead, &MaxMessageSize, (PVOID)&ConnectData, &ConnectDataLength ); if(!NT_SUCCESS(Status)) { printf( "CSRDLL: Server - Status == %X\n",Status); return Status;} RtlFreeSid(SysSid); NtClose(PortSection); return(STATUS_SUCCESS); printf( "CSRDLL: Server - Status == %X\n",Status); Возврашает C0000041 мож что не так делаю
Ошибка возвращается так как сервер отклоняет запрос, ибо процесс уже подключен к этому порту(на него подаются запросы из CsrClientCallServer(), коннект на стадии инициализации в CsrpConnectToServer(), хэндл в CsrPortHandle(деф. 0x18, ссылки в CsrNewThread() etc.), защищён от закрытия(чтобы разрешить закрытие закрыть установить ObjectHandleInformation.ProtectFromClose).
Кстати вам это чтоб свою секцию при коннекте указать ? Если это так, то багу эту уже давно пофиксили. Для других целей достаточно использовать CsrClientCallServer().
По совету Clerk (спасибо что выделил время) решил посмотреть в сторону CsrClientCallServer нашел исходник одно прожки которая выводит ConsoleTitle и возник такоя вапрос Код (Text): int main(int argc, char* argv[]) { NTSTATUS Status; CSR_API_MSG m; PCONSOLE_TITLE_MSG b=&m.u.ConsoleTitle; PCSR_CAPTURE_HEADER CaptureBuffer; RtlZeroMemory(&m, sizeof(m)); b->ConsoleHandle=GetConsoleHandle(); b->TitleLen=260; b->Unicode=0; CaptureBuffer=(PCSR_CAPTURE_HEADER)CsrAllocateCaptureBuffer(1, b->TitleLen); CsrCaptureMessageBuffer(CaptureBuffer, NULL, b->TitleLen, (PVOID *)&b->Title); Status=CsrClientCallServer((PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER(CONSRV_SERVERDLL_INDEX, CONSRV_FIRST_API_NUMBER+38), sizeof(m)); printf("ConsoleTitle is : %X\n",m.ApiNumber); if(!NT_SUCCESS(Status)) { printf("Error with CsrClientCallServer : 0x%X\n", Status); CsrFreeCaptureBuffer(CaptureBuffer); return 0; } printf("ConsoleTitle is : %s\n", m.u.ConsoleTitle.Title); CsrFreeCaptureBuffer(CaptureBuffer); return 0; } Так вод не понятно откуда это CONSRV_FIRST_API_NUMBER+38 почему именно 38 и как это определить для других функции В m.ApiNumber у меня 20226h т.е. по IDA смотрю модуль kernel32.dll Код (Text): .text:79469B07 push 10h .text:79469B09 push 20226h .text:79469B0E push ebx .text:79469B0F lea eax, [ebp+var_C0] .text:79469B15 push eax .text:79469B16 call ds:CsrClientCallServer т.е. все нормально но вот почему именно надо прибавить 38 если# define CONSRV_FIRST_API_NUMBER 512 это пока для меня загадка За ранее благодарен.
CONSRV_FIRST_API_NUMBER = 0x200 38 = 0x26 0x200 + 0x26 = 0x226, что ты и видишь в IDA. В общем случае определяется реверсом.