Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
(시리즈 글이 4개 있습니다.)
디버깅 기술: 90. windbg의 lm 명령으로 보이지 않는 .NET 4.0 ClassLibrary를 명시적으로 로드하는 방법
; https://www.sysnet.pe.kr/2/0/11256

.NET Framework: 689. CLR 4.0 환경에서 DLL 모듈의 로드 주소(Base address) 알아내는 방법
; https://www.sysnet.pe.kr/2/0/11325

.NET Framework: 690. coreclr 소스코드로 알아보는 .NET 4.0의 모듈 로딩 함수
; https://www.sysnet.pe.kr/2/0/11326

디버깅 기술: 102. windbg - .NET 4.0 이상의 환경에서 DLL의 심벌 파일 로드 방법
; https://www.sysnet.pe.kr/2/0/11330




CLR 4.0 환경에서 DLL 모듈의 로드 주소(Base address) 알아내는 방법

(예전에도 잠깐 언급했지만) CLR 4부터, 그러니까 .NET Framework 4부터 DLL 로딩을 Win32 API의 LoadLibrary를 이용하지 않도록 바뀌었기 때문에 네이티브 모듈 열거에서는 .NET 모듈이 누락되는 문제가 있습니다.

가령 다음의 코드를,

// 이 코드를 실행하는 콘솔 프로그램은 ClassLibrary1.dll을 참조해 사용하고 있음

foreach (ProcessModule item in Process.GetCurrentProcess().Modules)
{
    Console.WriteLine(item.FileName + ": 0x" +  item.BaseAddress.ToString("x"));
}

.NET 2.0 ~ 3.5에서 실행하면 다음과 같이 ClassLibrary1.dll이 목록에 나오지만,

F:\ConsoleApp1\ConsoleApp1\bin\Debug\ConsoleApp1.exe: 0x630000
C:\Windows\SYSTEM32\ntdll.dll: 0x7ff97e420000
C:\Windows\SYSTEM32\MSCOREE.DLL: 0x7ff963510000
...[생략: native module]...
C:\Windows\System32\powrprof.dll: 0x7ff97a8b0000
C:\Windows\System32\profapi.dll: 0x7ff97a900000
C:\Windows\assembly\NativeImages_v2.0.50727_64\mscorlib\4e0bf2aed484475a500c73b16dd54e3a\mscorlib.ni.dll: 0x7ff95cd60000
C:\Windows\System32\ole32.dll: 0x7ff97c340000
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorjit.dll: 0x7ff95c5e0000
F:\ConsoleApp1\ConsoleApp1\bin\Debug\ClassLibrary1.dll: 0xfa0000
C:\Windows\assembly\NativeImages_v2.0.50727_64\System\4bf531fbd3a73bf62d20ff592522c30b\System.ni.dll: 0x7ff9310a0000
C:\Windows\System32\psapi.dll: 0x7ff97def0000

.NET 4.0 이상에서 실행하면 다음과 같이 ClassLibrary1.dll을 찾아볼 수 없습니다.

F:\ConsoleApp1\ConsoleApp1\bin\Debug\ConsoleApp1.exe: 0x1ebf8130000
C:\Windows\SYSTEM32\ntdll.dll: 0x7ff97e420000
C:\Windows\SYSTEM32\MSCOREE.DLL: 0x7ff963510000
...[생략: native module]...
C:\Windows\SYSTEM32\VERSION.dll: 0x7ff9754f0000
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll: 0x7ff9636b0000
C:\Windows\SYSTEM32\MSVCR120_CLR0400.dll: 0x7ff963410000
C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\9aaf4ea9ded0a99b899b7bf4c971092d\mscorlib.ni.dll: 0x7ff961df0000
C:\Windows\System32\ole32.dll: 0x7ff97c340000
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clrjit.dll: 0x7ff961cd0000
C:\Windows\assembly\NativeImages_v4.0.30319_64\System\b6563094687cd99e0db057bdda2a8b90\System.ni.dll: 0x7ff930460000
C:\Windows\System32\psapi.dll: 0x7ff97def0000

그래도 혹시 알 수 있는 방법이 있지 않을까요? 검색해 보니 다음과 같은 글이 나옵니다. ^^

Finding the correct baseaddress
; https://stackoverflow.com/questions/8263135/finding-the-correct-baseaddress

결국 managed module 목록은 AppDomain에서 구하고, 그 DLL들의 로딩 주소를 Marshal.GetHINSTANCE 메서드를 이용하면 됩니다.

foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
    Console.WriteLine("[" + asm.FullName + "]");
    {
        IntPtr ptr = Marshal.GetHINSTANCE(asm.ManifestModule);
        Console.WriteLine("0x" + ptr.ToInt64().ToString("x"));
    }

    Console.WriteLine();
}

다음은 이에 대한 출력 결과입니다.

[mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
0x1ac60000

[ConsoleApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
0x60000

[ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
0x690000

[System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
0x1b190000




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/14/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11515정성태5/9/201822623.NET Framework: 744. C# 6 - Expression bodied function [1]
11514정성태5/3/201820629오류 유형: 466. Bitvise - Error in component session/transport/kexHandler [2]
11513정성태5/3/201827480.NET Framework: 743. C# 언어의 공변성과 반공변성 [9]파일 다운로드2
11512정성태5/2/201819743개발 환경 구성: 375. Azure runbook 실행 시 "Errors", "All Logs"에 오류 메시지가 출력되는 경우
11511정성태5/2/201821447개발 환경 구성: 374. Azure - Runbook 기능 소개
11510정성태4/30/201822293.NET Framework: 742. windbg로 확인하는 Finalizer를 가진 객체의 GC 과정파일 다운로드1
11509정성태4/28/201820662.NET Framework: 741. windbg로 확인하는 객체의 GC 여부
11508정성태4/23/201822284개발 환경 구성: 373. MSBuild를 이용해 프로젝트 배포 후 결과물을 zip 파일로 압축하는 방법파일 다운로드1
11507정성태4/20/201822853개발 환경 구성: 372. MSBuild - 빌드 전/후, 배포 전/후 실행하고 싶은 Task 정의
11506정성태4/20/201827097.NET Framework: 740. C#에서 enum을 boxing 없이 int로 변환하기 - 두 번째 이야기 [7]파일 다운로드1
11505정성태4/19/201819956개발 환경 구성: 371. Azure Web App 확장 예제 - Simple WebSite Extension
11504정성태4/19/201821494오류 유형: 465. Azure Web App 확장 - Extplorer File manager 적용 시 오류
11503정성태4/19/201820570오류 유형: 464. PowerShell - Start-Service 명령 오류 (Service 'xxx' cannot be started)
11502정성태4/17/201822762개발 환경 구성: 370. Azure VM/App Services(Web Apps)에 Let's Encrypt 무료 인증서 적용 방법 [3]
11501정성태4/17/201819984개발 환경 구성: 369. New-AzureRmADServicePrincipal로 생성한 계정의 clientSecret, key 값을 구하는 방법파일 다운로드1
11500정성태4/17/201820949개발 환경 구성: 368. PowerShell로 접근하는 Azure의 Access control 보안과 Azure Active Directory의 계정 관리 서비스
11499정성태4/17/201819626개발 환경 구성: 367. Azure - New-AzureRmADServicePrincipal / New-AzureRmRoleAssignment 명령어
11498정성태4/17/201819682개발 환경 구성: 366. Azure Active Directory(Microsoft Enfra ID)의 사용자 유형 구분 - Guest/Member
11497정성태4/17/201817510개발 환경 구성: 365. Azure 리소스의 액세스 제어(Access control) 별로 사용자에게 권한을 할당하는 방법 [2]
11496정성태4/17/201818010개발 환경 구성: 364. Azure Portal에서 구독(Subscriptions) 메뉴가 보이지 않는 경우
11495정성태4/16/201819863개발 환경 구성: 363. Azure의 Access control 보안과 Azure Active Directory의 계정 관리 서비스
11494정성태4/16/201816194개발 환경 구성: 362. Azure Web Apps(App Services)에 사용자 DNS를 지정하는 방법
11493정성태4/16/201817989개발 환경 구성: 361. Azure Web App(App Service)의 HTTP/2 프로토콜 지원
11492정성태4/13/201815965개발 환경 구성: 360. Azure Active Directory의 사용자 도메인 지정 방법
11491정성태4/13/201819140개발 환경 구성: 359. Azure 가상 머신에 Web Application을 배포하는 방법
11490정성태4/12/201818124.NET Framework: 739. .NET Framework 4.7.1의 새 기능 - Configuration builders [1]파일 다운로드1
... 91  92  93  94  95  96  97  [98]  99  100  101  102  103  104  105  ...