.NET Thread 인스턴스로부터 COM Apartment 유형 확인하는 방법
예전의 글에서는 x86 프로세스에 대해서 살펴보았는데요.
windbg - .NET Framework 스레드 개체의 COM Apartment 유형 확인하는 방법
; https://www.sysnet.pe.kr/2/0/1351
이번에 x64 프로세스에 대해서도 동일한 작업을 했는데, 이에 대한 기록을 남겨 봅니다.
지난 번에는 "attach to process"로 디버거 연결을 했지만, 이번에는 작업 관리자에서 프로세스 덤프를 뜬 파일을 windbg로 열어서 작업해 봤는데, 활성 프로세스는 아니었지만 결과가 정상적으로 출력되었습니다.
0:024> !teb
TEB at 000007ffffebe000
ExceptionList: 0000000000000000
StackBase: 0000000007aa0000
StackLimit: 0000000007a8f000
SubSystemTib: 0000000000000000
FiberData: 0000000000001e00
ArbitraryUserPointer: 0000000000000000
Self: 000007ffffebe000
EnvironmentPointer: 0000000000000000
ClientId: 0000000000001934 . 00000000000005fc
RpcHandle: 0000000000000000
Tls Storage: 000007ffffebe058
PEB Address: 000007fffffdf000
LastErrorValue: 0
LastStatusValue: 0
Count Owned Locks: 0
HardErrorMode: 0
0:024> dt _TEB 000007ffffebe000
ntdll!_TEB
+0x000 NtTib : _NT_TIB
+0x038 EnvironmentPointer : (null)
...[생략]...
+0x1750 ReservedForPerf : (null)
+0x1758 ReservedForOle : 0x00000000`026dea90 Void
+0x1760 WaitingOnLoaderLock : 0
...[생략]...
+0x1810 ResourceRetValue : 0x00000000`06c38ca0 Void
0:024> dt ole32!SOleTlsData 0x00000000`026dea90
+0x000 pvThreadBase : (null)
...[생략]...
+0x078 ContextId : 0xe
+0x080 pNativeApt : 0x00000000`026e6b00 CComApartment
+0x088 pCallContext : (null)
+0x090 pCtxCall : (null)
...[생략]...
+0x1b8 outgoingActivationData : tagOutgoingActivationData
+0x1c8 cReentrancyFromUserAPC : 0
0:024> dt CComApartment 0x00000000`026e6b00
ole32!CComApartment
+0x000 __VFN_table : 0x000007fe`fe3466f8
+0x008 _cRefs : 3
+0x00c _dwState : 3
+0x010 _AptKind : 4 ( APTKIND_APARTMENTTHREADED )
+0x014 _AptId : 0x5fc
+0x018 _pOXIDEntry : 0x00000000`04d5f9c8 OXIDEntry
+0x020 _pRemUnk : 0x00000000`06fbead0 CRemoteUnknown
+0x028 _cWaiters : 0n0
+0x030 _hEventOID : (null)
+0x038 _cPreRegOidsAvail : 0
+0x040 _arPreRegOids : [20] 0xfebf9af3`eb76af7f
+0x0e0 _cOidsReturn : 0
+0x0e8 _arOidsReturn : [20] 0x00630069`004d005c
+0x188 _arMessageParams : [8] CComApartment::MessageListHead
+0x208 _fInitializedCS : 0n1
+0x210 _csMessageParams : _RTL_CRITICAL_SECTION
_AptKind 필드의 값이 4인 것으로 해당 스레드는 APARTMENT_THREADED 임을 알 수 있습니다.
닷넷 코드로 이를 확인해 보려면 다음의 TEB 구하는 코드를 참조해서,
.NET x64 응용 프로그램에서 Teb 주소를 구하는 방법
; https://www.sysnet.pe.kr/2/0/1388
이렇게 만들 수 있습니다.
IntPtr reservedForOle = new IntPtr(teb.ToInt64() + 0x1758);
long ReservedForOle = Marshal.ReadInt64(reservedForOle); // TEB.ReservedForOle
Console.WriteLine("TEB.ReservedForOle: " + ReservedForOle.ToString("x"));
Console.WriteLine("dt ole32!SOleTlsData " + ReservedForOle.ToString("x"));
IntPtr pNativeApt = new IntPtr(ReservedForOle + 0x80);
long NativeApt = Marshal.ReadInt64(pNativeApt); // SOleTlsData.pNativeApt
Console.WriteLine("SOleTlsData.pNativeApt: " + NativeApt.ToString("x"));
Console.WriteLine("dt CComApartment " + NativeApt.ToString("x"));
IntPtr pAptKind = new IntPtr(NativeApt + 0x10);
int AptKind = Marshal.ReadInt32(pAptKind); // CComApartment._AptKind
Console.WriteLine("CComApartment._AptKind: " + AptKind.ToString("x"));
첨부한 파일은 "
.NET x64 응용 프로그램에서 Teb 주소를 구하는 방법" 예제에 위의 코드를 추가한 것입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]