2013-08-08 1 views
4

고객에게 라이센스가 필요한 Java 소프트웨어가 있습니다. 소프트웨어가 활성화 된 특정 하드웨어에서만 소프트웨어가 실행되도록 허용하는 라이센스 모듈을 만들었습니다.Java 프로그램이 가상 시스템에서 실행되고 있는지 어떻게 확인합니까?

그러나 클라이언트가 가상 컴퓨터에서 소프트웨어를 활성화하는 것을 원하지 않습니다. 이는 여러 개의 소프트웨어 사본을 단일 라이센스와 함께 사용할 수 있음을 의미합니다.

소프트웨어가 VM에 설치되는 것을 어떻게 중지합니까?

참고 :

  1. 나는이에 대한 연구를 수행하고 이미 해결책을 발견했다. 다른 개발자가 에게 유용 할 수 있도록 게시하고 있습니다.
  2. 그것은 단지에 대한 VmWareVirtual PC하지 Parallels 또는 VirtualBox
  3. 에 나는 순수 자바 솔루션을 찾을 수 없습니다 작동합니다. 그것은 네이티브 코드에 의존합니다.

더 좋은 해결책을 알고 있다면 대답으로 게시하십시오. VM이의 존재를 확인하는

+0

재미있는 질문 technicall -

VmCheck.java

package in.ksharma; import com.sun.jna.Library; public interface VmCheck extends Library { boolean IsInsideVMWare(); boolean IsInsideVPC(); } 
다음
package in.ksharma; import com.sun.jna.Native; public class Test { public static void main(String[] args) { VmCheck lib = (VmCheck) Native.loadLibrary("VmDetect.dll", VmCheck.class); if(lib.IsInsideVMWare() || lib.IsInsideVPC()) System.out.println("I'm trapped in the matrix."); else System.out.println("I'm for real."); } } 

Test.java

VM을 실행 최종 코드를 보여주는 스크린 샷입니다 물론, 유료 고객이이 DRM을 제거한 해적판 버전의 비 지불 사용자보다 소프트웨어를 사용하는 것이 더 어려운 이유는 무엇입니까? 아니면 더 중요한 이유는 무엇입니까? 그리고 지원 비용을 늘리면 라이센스가없는 DRM이 발생하여 라이센스가 부여 된 프로그램을 실행할 수 있습니다 (모든 프로그램에 버그가 있으며 DRM도 예외는 아닙니다). – Thilo

+0

@Thilo 제품의 크기가 그다지 크지 않습니다. 인터넷에서 우리 소프트웨어의 불법 복제본을 발견하지 못할 것입니다. 우리의 목표는 100 % 확실한 방법을 고안하는 것이 아니라 소프트웨어를 사용하는 것이 복사 붙여 넣기만큼 간단하지 않도록하는 것입니다. –

+0

그리고 간단한 라이센스 키 솔루션은 동일한 것을 달성하지 못합니까? – Thilo

답변

8

몇 가지 방법이 있습니다 -

  1. 는 가상화에 의해 노출 된 비 표준의 x86 명령어를 사용하여 VM 고객 도구
  2. 에 의해 만들어진 프로세스, 파일, 레지스트리 항목 등의 VM 유물의 존재를 찾고 소프트웨어

자세한 내용을 알고 싶으면 here 주제에 대해 설명하는 좋은 프레젠테이션이 있습니다.

방법 2가 가장 쉽고 간단하므로 사용하고 있습니다.

다음 코드는 코드가 VM웨어 가상 머신에서 실행되고 있는지 확인하는 데 사용할 수 있습니다 -

bool IsInsideVMWare() 
{ 
    bool rc = true; 
    __try 
    { 
    __asm 
    { 
     push edx 
     push ecx 
     push ebx 
     mov eax, 'VMXh' 
     mov ebx, 0 // any value but not the MAGIC VALUE 
     mov ecx, 10 // get VMWare version 
     mov edx, 'VX' // port number 
     in  eax, dx // read port 
        // on return EAX returns the VERSION 
     cmp ebx, 'VMXh' // is it a reply from VMWare? 
     setz [rc] // set return value 
     pop ebx 
     pop ecx 
     pop edx 
    } 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
    rc = false; 
    } 
    return rc; 
} 

Code Project에 게시 된 프로젝트에서 가져온 코드의 일부이다. 데모 용이므로 Microsoft Virtual PC의 존재를 확인하는 코드는 포함되어 있지 않습니다. 메인 사이트를 방문하여 Virtual PC 코드와 미리 컴파일 된 데모를 얻을 수 있습니다. DLL은 해당 사이트에도 제공되지만 아이러니하게도 DLL의 목적을 상실한 기능은 프로그램에서 호출 할 수 없으므로 내보내지지 않습니다. 따라서 위의 코드를 직접 컴파일하고 DLL을 만들어야했습니다.

__try__catch은 Microsoft의 특정 C++ 확장 프로그램입니다. gcc을 사용하면 Windows에서 Visual Studio로 컴파일해야합니다.

다운로드 및 설치 다음과 같은 구성 요소 -

  1. 비주얼 스튜디오 2005 (또는 그 이상) 2003

새로운 DLL 프로젝트를 만들고 메인 CPP에 위의 코드를 붙여

  • Microsoft 플랫폼 SDK 파일.

    기능을 내보내려면 코드에 추가하십시오. 이것 없이는 DLL이 컴파일되지만 함수는 외부에서 호출 할 수 없습니다.

    extern "C" __declspec(dllexport) 
    bool IsInsideVMWare() 
    { 
        //Code 
    } 
    

    이제 Visual Studio 프로젝트를 빌드하여 DLL을 컴파일하십시오. 혹시 windows.h 같은 오류가 발견되지 얻거나 다른 오류가 이러한 유래 질문 문의 -

  • Why doesn't GCC compile this code?
  • 함수가 DLL에 여부를 보낸 여부를 확인하려면를 DLL Export Viewer을 사용하여 DLL에서 내 보낸 (즉 노출 된) 함수 목록을 볼 수 있습니다.

    이제 VM이 있는지 확인하는 구성 요소가 있습니다. 우리가해야 할 일은 Java에서 호출하는 것뿐입니다.

    Java에서 원시 코드를 호출하는 데 필요한 JNA 라이브러리를 다운로드하십시오. Eclipse 프로젝트를 만들고 DLLJNA을 classpath에 추가하십시오.

    다음 만들기 파일 - enter image description here