성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>ionescu007/lxss github repo에 공개된 lxssmanager.dll의 CLSID_LxssUserSession/IID_ILxssSession 사용법</h1> <p> 아래의 글을 쓸 때까지만 해도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Wslhub.Sdk 사용으로 알아보는 CoInitializeSecurity 사용 제약 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12665'>https://www.sysnet.pe.kr/2/0/12665</a> </pre> <br /> lxssmanager.dll에서 제공하는 CLSID_LxssUserSession/IID_ILxssSession COM 개체가 공개된 건 줄 알았습니다. ^^; 하지만, 비공개였고 그나마 찾은 자료는 github의 개인 repo였습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ionescu007/lxss ; <a target='tab' href='https://github.com/ionescu007/lxss'>https://github.com/ionescu007/lxss</a> lxss/inc/lxssmanager.h ; <a target='tab' href='https://github.com/ionescu007/lxss/blob/master/inc/lxssmanager.h'>https://github.com/ionescu007/lxss/blob/master/inc/lxssmanager.h</a> lxss/lxlaunch/lxlaunch.cpp ; <a target='tab' href='https://github.com/ionescu007/lxss/blob/master/lxlaunch/lxlaunch.cpp'>https://github.com/ionescu007/lxss/blob/master/lxlaunch/lxlaunch.cpp</a> </pre> <br /> 저 repo의 저작자는 나름의 역공학을 통해 그 결과를 공유해 주고 있는데요, 해당 자료를 COM 방식으로 정리하면 다음과 같이 요약될 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #pragma once #include <initguid.h> <a target='tab' href='https://www.sysnet.pe.kr/2/0/12674'>DEFINE_GUID</a>(CLSID_LxssManager, 0x4F476546, 0xB412, 0x4579, 0xB6, 0x4C, 0x12, 0x3D, 0xF3, 0x31, 0xE3, 0xD6); typedef struct _LXSS_STD_HANDLE { ULONG Handle; BOOLEAN Pipe; } LXSS_STD_HANDLE, * PLXSS_STD_HANDLE; typedef struct _LXSS_CONSOLE_DATA_V2 { ULONG ConsoleHandle; } LXSS_CONSOLE_DATA_V2, * PLXSS_CONSOLE_DATA_V2; typedef struct _LXSS_CONSOLE_DATA { ULONG InputHandle; ULONG OutputHandle; ULONG ControlHandle; USHORT Width; USHORT Height; } LXSS_CONSOLE_DATA, * PLXSS_CONSOLE_DATA; typedef struct _LXSS_STD_HANDLES { LXSS_STD_HANDLE StdIn; LXSS_STD_HANDLE StdOut; LXSS_STD_HANDLE StdErr; } LXSS_STD_HANDLES, * PLXSS_STD_HANDLES; interface ILxInstance; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11925'>MIDL_INTERFACE</a>("536A6BCF-FE04-41D9-B978-DCACA9A9B5B9") ILxssSession : IUnknown { <span style='color: blue; font-weight: bold'>STDMETHOD(GetCurrentInstance)(ILxInstance** pInstanceOut); STDMETHOD(StartDefaultInstance)(_In_ const IID& InstanceIid, _Out_ PVOID* InstanceOut);</span> STDMETHOD(SetState)(/* unknown */); STDMETHOD(QueryState)(/* unknown */); STDMETHOD(InitializeFileSystem)(/* unknown */); STDMETHOD(Destroy)(/* unknown */); }; MIDL_INTERFACE("8f9e8123-58d4-484a-ac25-7ef7d5f7448f") ILxInstance : IUnknown { STDMETHOD(GetConfiguration)(/* unknown */); STDMETHOD(GetId)(/* unknown */); STDMETHOD(QueryState)(/* unknown */); STDMETHOD(SetState)(/* unknown */); <span style='color: blue; font-weight: bold'>STDMETHOD(CreateLxProcess)(_In_ PCCH CommandLine, _In_ ULONG ArgumentCount, _In_ PCCH* Arguments, _In_ ULONG EnvironmentCount, _In_ PCCH* Environment, _In_ PCCH CurrentDirectory, _In_ ULONG Flags, _In_ PLXSS_STD_HANDLES StdHandles, _In_ PLXSS_CONSOLE_DATA ConsoleData, _In_ ULONG Uid, _Out_ PULONG ProcessHandle); STDMETHOD(RegisterAdssBusServer)(_In_ PCCH ServerName, _Out_ PULONG ServerHandle);</span> STDMETHOD(ConnectAdssBusServer)(/* unknown */); STDMETHOD(Destroy)(/* unknown */); STDMETHOD(GetState)(/* unknown */); STDMETHOD(StartSelf)(/* unknown */); STDMETHOD(StopSelf)(/* unknown */); STDMETHOD(GetSuspendState)(/* unknown */); }; </pre> <br /> 보는 바와 같이 저작자도 ILxssSession의 GetCurrentInstance, StartDefaultInstance 2개 함수와 ILxInstance의 CreateLxProcess, RegisterAdssBusServer 2개 함수에 대해서만 그 signature를 파악해낸 정도입니다.<br /> <br /> 어쨌든 이 정도만을 바탕으로 다음과 같이 테스트를 해볼 수 있는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <Windows.h> #include <stdio.h> #include "lxssmanager.h" HRESULT OleMain(); int main() { HRESULT hr = CoInitializeEx(nullptr, 0); if (hr != S_OK) { return 1; } hr = OleMain(); CoUninitialize(); return hr; } HRESULT OleMain() { HRESULT hr = S_FALSE; hr = <a target='tab' href='https://www.sysnet.pe.kr/2/0/12665'>CoInitializeSecurity</a>(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_STATIC_CLOAKING, nullptr); if (hr != S_OK) { return hr; } ILxssSession* pSession = nullptr; ILxInsanace* pInstance = nullptr; do { hr = <span style='color: blue; font-weight: bold'>CoCreateInstance(CLSID_LxssManager, nullptr, CLSCTX_LOCAL_SERVER, __uuidof(ILxssSession), (PVOID*)&pSession);</span> if (hr != S_OK) { break; } printf("pSession == %p\n", pSession); hr = <span style='color: blue; font-weight: bold'>pSession->GetCurrentInstance(&pInstance);</span> printf("GetCurrentInstance hr == %d(0x%x)\n", hr, hr); // -2147024891 == 0x80070005 E_ACCESSDENIED (Access is denied.) // -2147024894 == 0x80070002 (The system cannot find the file specified.) // -2147024809 == 0x80070057 (The parameter is incorrect.) // -2147220734 == 0x80040302 hr = <span style='color: blue; font-weight: bold'>pSession->StartDefaultInstance(__uuidof(ILxInstance), (PVOID *)&pInstance);</span> printf("StartDefaultInstance hr == %d(0x%x)\n", hr, hr); if (hr != S_OK) { break; } } while (false); if (pSession != nullptr) { pSession->Release(); } if (pInstance != nullptr) { pInstance->Release(); } return hr; } </pre> <br /> 그런데 실제로 실행을 해보면 GetCurrentInstance는 0x80070057(E_INVALIDARG)을 반환하고, StartDefaultInstance 호출은 Get으로 받아온 인스턴스가 유효하지 않은 탓도 있겠지만 아예 crash가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Faulting application name: ConsoleApplication1.exe, version: 0.0.0.0, time stamp: 0x60c9fe1d Faulting module name: ntdll.dll, version: 10.0.19041.1023, time stamp: 0x7977b9de Exception code: 0xc0000005 Fault offset: 0x00000000000a3ef0 Faulting process id: 0x4300 Faulting application start time: 0x01d762b478547e8a Faulting application path: C:\temp\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll Report Id: 7e85962d-3fa7-4bea-bd46-992aeee231e9 Faulting package full name: Faulting package-relative application ID: </pre> <br /> 아마도 그때 당시에는 잘 동작했을지 모르겠지만 지금의 Windows 10에서는 오류가 발생하고 있습니다. 아쉽군요. ^^<br /> <br /> (2023-10-20 업데이트) 해당 github의 저자가 작성한 코드도 참고해 보세요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > lxss/lxlaunch/lxlaunch.cpp ; <a target='tab' href='https://github.com/ionescu007/lxss/blob/master/lxlaunch/lxlaunch.cpp'>https://github.com/ionescu007/lxss/blob/master/lxlaunch/lxlaunch.cpp</a> </pre> <br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1802&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이걸 테스트하면서 알게 된 사실이 하나 있는데요, 전에 CoInitializeSecurity가 다른 DLL을 로드하면서 자동 호출이 된다고 했었는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 별도 DLL에 포함된 타입을 STAThread Main 메서드에서 사용하는 경우 CoInitializeSecurity 자동 호출 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12666'>https://www.sysnet.pe.kr/2/0/12666</a> </pre> <br /> 이와 유사하게 C++ 프로그램에서도 CoInitializeSecurity가 자동 호출되는 경우가 있었습니다. 재현은 다음과 같이 할 수 있는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HRESULT hr = CoInitializeEx(nullptr, 0); PVOID* pVoid; hr = <span style='color: blue; font-weight: bold'>CoCreateInstance(CLSID_ShellDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pVoid);</span> if (hr != S_OK) { return; } hr = CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_STATIC_CLOAKING, nullptr); // hr == 0x80010119 : Security must be initialized before any interfaces are marshalled or unmarshalled. It cannot be changed once initialized. // RPC_E_TOO_LATE (-2147417831) </pre> <br /> 확실하게 파고들지는 않았지만, 아마도 CoCreateInstance 내부에서 호출이 되는 것 같습니다. 즉, CoInitializeEx를 호출했다고 하면 COM을 사용하겠다는 의도이고 그럼 당연히 개체 생성을 했을 것이므로 CoCreateInstance를 호출했을 것입니다.<br /> <br /> 결국 COM Apartment 초기화가 된 스레드를 사용한 응용 프로그램이 있다면 높은 확률로 CoInitializeSecurity API가 호출되었을 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - CoCreateInstance 관련 Inteop 오류 정리 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12678'>https://www.sysnet.pe.kr/2/0/12678</a> Wslhub.Sdk 사용으로 알아보는 CoInitializeSecurity 사용 제약 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12665'>https://www.sysnet.pe.kr/2/0/12665</a> 별도 DLL에 포함된 타입을 STAThread Main 메서드에서 사용하는 경우 CoInitializeSecurity 자동 호출 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12666'>https://www.sysnet.pe.kr/2/0/12666</a> COM+ 서버 응용 프로그램을 이용해 CoInitializeSecurity 제약 해결 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12667'>https://www.sysnet.pe.kr/2/0/12667</a> ionescu007/lxss github repo에 공개된 lxssmanager.dll의 CLSID_LxssUserSession/IID_ILxssSession 사용법 ; https://www.sysnet.pe.kr/2/0/12676 역공학을 통한 lxssmanager.dll의 ILxssSession 사용법 분석 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12677'>https://www.sysnet.pe.kr/2/0/12677</a> C# - DLL Surrogate를 이용한 Out-of-process COM 개체 제작 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12668'>https://www.sysnet.pe.kr/2/0/12668</a> DLL Surrogate를 이용한 Out-of-process COM 개체에서의 CoInitializeSecurity 문제 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12670'>https://www.sysnet.pe.kr/2/0/12670</a> CoInitializeSecurity의 전역 설정을 재정의하는 CoSetProxyBlanket 함수 사용법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12679'>https://www.sysnet.pe.kr/2/0/12679</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9718
(왼쪽의 숫자를 입력해야 합니다.)