Programing

'모든 CPU'.NET 어셈블리에서 x86 CLR 강제 실행

lottogame 2020. 12. 31. 07:51
반응형

'모든 CPU'.NET 어셈블리에서 x86 CLR 강제 실행


.NET에서 '플랫폼 대상 : 모든 CPU'컴파일러 옵션을 사용하면 .NET 어셈블리를 x64 컴퓨터에서 64 비트로, x86 컴퓨터에서 32 비트로 실행할 수 있습니다. '플랫폼 대상 : x86'컴파일러 옵션을 사용하여 x64 컴퓨터에서 어셈블리를 x86으로 강제 실행하는 것도 가능합니다.

'Any CPU'플래그를 사용하여 어셈블리를 실행할 수 있지만 x86 또는 x64 CLR에서 실행해야하는지 여부를 결정합니까? 일반적으로이 결정은 기본 시스템의 비트를 기반으로 CLR / OS 로더 (내 이해대로)에 의해 이루어집니다.

다른 실행중인 프로세스와 상호 작용 (읽기 : 코드 삽입) 할 수있는 C # .NET 응용 프로그램을 작성하려고합니다. x64 프로세스는 다른 x64 프로세스에만 삽입 할 수 있으며 x86과 동일합니다. 이상적으로는 JIT 컴파일과 모든 CPU 옵션을 활용하여 단일 응용 프로그램을 x64 또는 x86 프로세스 (x64 시스템에서)에 주입하는 데 사용할 수 있습니다.

아이디어는 응용 프로그램이 모든 CPU 로 컴파일된다는 것 입니다. x64 컴퓨터에서는 x64로 실행됩니다. 대상 프로세스가 x86이면 자체를 다시 시작하여 CLR이 x86으로 실행되도록해야합니다. 이것이 가능한가?


CorFlags 응용 프로그램을 사용하여 응용 프로그램이 어떻게 실행되고 정적으로 변경되는지 확인할 수 있습니다 . 애플리케이션이 어떻게 실행되는지 알아 보려면 다음을 사용하십시오.

corflags <PathToExe>

애플리케이션 실행 방법을 변경하려면 다음을 사용하십시오.

corflags /32bit+  <PathToExe>

이렇게하면 EXE 파일이 32 비트 프로세스로 실행됩니다. 어셈블리 실행 방법에 대한 정보는 PE 헤더에 저장됩니다. 스택 오버플로 질문 네이티브 DLL 파일이 x64 또는 x86으로 컴파일되었는지 확인하는 방법을 참조하십시오 . .

런타임에 코드를 삽입하려면 C ++ / COM 에서 .NET 프로파일 러 를 작성해야합니다 . 자세한 내용은 .NET 내부 : 프로파일 링 API프로파일 링 (관리되지 않는 API 참조) 을 참조하세요.

JitCompilationStarted 콜백을 구현하고 거기에서 작업을 수행해야합니다. 이 방향으로 가면 삽입 DLL 파일을 x86 및 x64로 빌드해야합니다. 다음 환경 변수가 설정되면 네이티브 DLL 파일이 CLR에 의해로드됩니다 .

Cor_Enable_Profiling=0x1
COR_PROFILER={CLSID-of-your-native-DLL-file}

올바르게 설정 한 경우 64 비트 버전은 64 비트 프로세스를 '볼'것이고 32 비트 버전은 32 비트 프로세스를 '볼'것입니다.


이것을 시도한 지 오래되었지만 어셈블리를 호출하는 프로세스의 비트가 x86 또는 x64로 JIT 될 것인지 여부를 결정한다고 믿습니다.

따라서 작은 콘솔 응용 프로그램을 작성하고 x86으로 빌드하고 다른 하나는 x64로 빌드하는 경우 둘 중 하나를 실행하면 프로세스에로드 된 다른 어셈블리가 32 비트 또는 64 비트로 실행됩니다. 물론 이것은 64 비트 머신에서 실행 중이라고 가정합니다.


이걸 도와 드릴 수 있을지 모르겠네요. 그러나 이것은 내 경험입니다.

호스트 응용 프로그램 A.exe(x86으로 컴파일 됨) 이 있고 호스트 응용 프로그램에서 클라이언트 응용 프로그램 B.exe(으로 컴파일 됨 ANY CPU)이 있습니다. 그리고 나는 시작 B.exe부터 A.exe사용 System.Diagnostic.Process의 클래스를.

이제 문제는 두 가지를 x64 컴퓨터에 넣으면 A.exex86으로 실행되는 반면 B.exex64로 실행되는 것 입니다.

그러나 A.exe어셈블리 c ( c.dll,로 컴파일 됨 Any CPU) B.exe를 호출 하고 를 호출 c.dll하면 c.dll이이를 호출하는 응용 프로그램을 따릅니다. 즉, 64 비트 머신에서 A.exe호출하면 x86dll 처럼 동작 하는 반면 B.exe호출하면 x64.


2 개 (정말 3 개) 바이너리를 생성하여 비슷한 작업을 수행했습니다. 주입하려는 프로세스가 32 비트인지 64 비트인지 감지했습니다. 이 프로세스는 32 비트 또는 64 비트 버전의 인젝션 바이너리를 실행합니다 (언급 한대로 자체를 다시 실행하는 것과 반대).

지저분하게 들리지만 출력 바이너리의 복사본을 만들고 CorFlags 유틸리티를 사용 하여 복사본이 32 비트로 실행되도록 하는 빌드 후 이벤트를 사용하여 빌드시 쉽게이 작업을 수행 할 수 있습니다 . 이렇게하면 응용 프로그램과 함께 CorFlags 유틸리티를 배포 할 필요가 없습니다.이 유틸리티는 어떤 이유로 든 합법적이지 않습니다.

나는 이것이 당신의 초기 아이디어와 매우 유사하고 실제로 두 줄의 빌드 이벤트를 제외하고는 더 많은 작업이 필요하지 않다고 생각합니다.

참조 URL : https://stackoverflow.com/questions/1507268/force-x86-clr-on-an-any-cpu-net-assembly

반응형