2010-08-14 3 views
5

고객이 라이선스 시스템에 쉽게 금이 가지 않도록 암호화 된 실행 파일을 작성하도록 요청했습니다. 자, 저는 이것이 잘못된 안보 감이라는 것을 이해합니다. 그러나 이것에도 불구하고 그는 그것을 고집했습니다.데이터를 코드로 실행 하시겠습니까?

그래서, 휴대용 실행 파일의 내 지식을 발굴하고이 아이디어를 내놓았다 : 그것의 크기

  • 와 함께 로더 실행 파일의 마지막에

    • 암호화 실행
    • 스틱이 로더가 데이터를 암호 해독합니다.
    • 실행 권한이있는 VirtualAlloc이 할당 된 페이지에 코드를 복사합니다.
    • 응용 프로그램의 진입 점을 찾습니다.
    • 거기로 이동하면 모두 설정됩니다.

    점핑 부분에 문제가 있습니다. 어떻게해야합니까? 함수 포인터를 설정했다면 서명은 무엇입니까? 로드 된 실행 파일의 main() 함수의 서명은 무엇입니까? 아니면 조립에 의지해야합니까?

    코드를로드 한 후 절대 주소를 수정해야 할 수도 있음을 알고 있습니다. 필요한 경우 어떻게 확인합니까? 실제로이 작업을 수행하는 방법은 무엇입니까?

    편집 : Windows에서 작업하고 GCC로 컴파일. 필요한 경우 Microsoft 컴파일러를 전환 할 수 있습니다.

    편집 2 : 명확히하기 : 나는 거의 무의미하다는 것을 알고 있습니다. 나는 어떤 DRM의 약자를 의미합니다 믿습니다. 결정할 내 의뢰인의 몫이고, 그는 나에게도이 사실에 대해 경고하고 있음에도 불구하고 여전히 그것을 원합니다.

    미리 감사드립니다.

  • +0

    내 견해로 입력 된 솔루션은 거의 버그가 없으며,이 기능이 다른 기능으로 이동하는 이유는 무엇입니까? 그들은 다른 주소로 고정되어 있고 정적 링크 된 라이브러리는 어디에서와 같이이 솔루션에 많은 문제점을 많이 겪고 있습니까? 누가 암호화 된 코드를 사용합니까? – Svisstack

    +0

    나는 DRM을 정말로 원한다면 말하고 싶다. 구입. 왜? 비록 당신이 "무언가"를 얻고 일해도. 그 금이 갔을 때 당신은 6 개월 동안 무엇을합니까? 크래커들과 함께하는 것은 정규직입니다. –

    +0

    그건 내 고객이 결정할 때까지입니다. 나는 그가 나쁜 결정을 내리는 지 정말로 신경 쓰지 않는다. 나는 솔직히 그에게 경고했고 그는 여전히 그것을 원했다. –

    답변

    4

    다른 사람들도 언급했듯이 EXE를 데이터 섹션에로드하고 런타임에 링크하는 것은 어려운 작업입니다. 그러나 여기에 또 다른 옵션이 있습니다.

    입력 사항을 가져옵니다. 코드 및 초기화 된 데이터 (상수 포함) 섹션을 찾습니다. 이 섹션의 이름을 변경하고 모두를 읽기/쓰기 초기화 된 데이터 섹션으로 변환하십시오. 내용을 암호화하십시오. 이제 암호 해독 스텁이 포함 된 새 코드 세그먼트를 추가하고 거기에 진입 점을 변경하십시오. 이 스텁은 세그먼트를 적절한 위치에서 해독 한 다음 보호 유형을 해당 유형에 적합한 것으로 변경하고 원래 진입 점으로 이동해야합니다.

    이렇게하면 가져 오기 테이블이 암호화되지 않으므로 전체 PE 로더의 모든 기능을 구현할 필요가 없으므로 일반 Windows 로더가 처리합니다.

    이런 종류의 순진한 접근법은 언제든지 공동 공격에서 살아남지 못할 것입니다. 공격자는 프로세스의 메모리를 덤프하여 원래의 해독 된 코드를 얻을 수 있습니다. 이를 피하려면 연속적으로 코드를 암호화하고 암호 해독해야 할 필요가 있습니다. PE 처리는 사용자의 관심사 중 가장 적습니다.

    +0

    의미가 있습니다. 그래서 exe에 새로운 섹션을 붙이고 섹션 테이블과 엔트리 포인트를 업데이트하면 OS 로더가 필요한 경우 가져 오기와 재배치를 처리했기 때문에 해독 된 코드로 간단히 이동할 수 있습니다. –

    +1

    기본적으로, 재배치를 제외하고는 문제의 섹션에있는 경우 처리되지 않습니다. 그래서 재배치 할 수없는 EXE인지 확인하십시오. 수입은 PE 파일의 스텁에 대해 별도의 섹션을 가지고 있습니다. 확실하지는 않습니다. 아마도 이것을 확인해야합니다 :) – bdonlan

    +0

    +1 메모리 덤프 공격;) –

    0

    당신은 C 스타일 수있을 함수 포인터에 주소를 캐스팅하고 호출해야합니다 :

    typedef void (*MyPtr)(); 
    
    MyPtr p = (MyPtr)1234; 
    p(); 
    
    11

    불행하게도, 코드의 엔트리 포인트로 점프하는 것은 걱정거리입니다. Portable Executable (PE) 파일 (Windows의 EXE 및 DLL 파일에 사용되는 파일 형식)은 단일 메모리 블록에로드 한 다음 실행할 수있는 것이 아닙니다. 사용자 정의 PE 로더는 다음 작업을 처리해야합니다.

    • PE 파일의 다양한 코드 및 데이터 섹션을 별도의 메모리 블록으로로드하십시오.

    • EXE가 종속 된 DLL을로드하기 위해 가져 오기 테이블의 종속성을 확인하십시오.

    • 재배치를 수행하십시오.

    모든 세부 정보를 올바르게 얻는 것은 아마도 꽤 복잡한 작업 일 것입니다. 나는 당신이 이런 종류의 EXE 암호화를 할 수있는 도구를 찾을 것을 제안합니다.

    편집 : 빠른 구글은 당신이보고 싶을 수도 있습니다 제안 다음

    (독점)

  • RLPack (독점)

    • EXECryptor

    • UPX (GPL) 이 압축은 내가 이해하는 한 압축 만합니다.하지만 소스를 사용하여 암호화를 추가 할 수 있습니다 (GPL이 사용자의 필요와 호환되는 경우).

    이러한 도구가 더 많을 것입니다. 이는 빠른 검색 결과입니다.

    또 다른 편집 :

    MSDN 잡지 매트 Pietrek이의 글을 실시은 (Part 1, Part 2)은 "심층는 Win32 휴대용 실행 파일 형식으로 봐"라고합니다. 그것은 당신에게 유용한 PE 파일 형식에 대한 많은 정보를 담고 있습니다. 한 가지 흥미로운 정보 : Microsoft 링커의 최신 버전은 기본적으로 EXE의 기본 재배치를 생략 한 것처럼 보입니다. 래퍼 EXE가 이미 페이로드 EXE의 기본로드 주소에로드되어있을 가능성이 높기 때문에 링커에 다시 넣으라고 지시해야합니다. 또는 래퍼 EXE에 페이로드 EXE를 방해하지 않는 이국적인 기본로드 주소를 시도해 볼 수도 있습니다.

    나는 또한 page that discusses a rudimentary PE file compressor을 발견했습니다. 그것은 완전히 일반적인 것으로 보이지는 않으며 사용하기 전에 약간의 추가 작업이 필요할 것입니다.

  • +0

    나는 이러한 도구 중 일부를 알고 클라이언트를 위해 제안했지만 그는 그들에게는 맞춤식 것이 필요하다고 느낀다. 비록 내가 그 임무를 수행 할 수는 없지만, 나는 그것을 매우 흥미로운 주제로 생각하면서 그것에 대해 배우고 싶다. 언급 한 요점에 대해 나에게 약간의 자료를 제안 해 주시겠습니까? 특히 재배치. –

    +0

    @sztomi : 추가 정보에 대한 링크를 추가했습니다. 재배치에 대한 자세한 내용은 Matt Pietrek의 2 부 기사를 참조하십시오. –

    +0

    @sztime : "WINE"(http://www.winehq.org/) 프로젝트는 Linux 용 PE 로더를 구현 했으므로 아마도 최소한 소스를 연구 할 수있을 것입니다. MPlayer (http://www.mplayerhq.hu/design7/news.html)는 리눅스 플랫폼에서 Windows dll을로드하기 위해 (아마도 와인에서) 어떤 종류의 코드를 사용했습니다.어쨌든이 작업은 수행 할 수 있지만 "복제 방지 방어"인 경우 금이 갈 수 있으며 제품이 충분하면 금이 갈 것입니다. exe에 액세스 할 수있는 사람은 누구나 보호를 우회하거나 압축을 풀 수 있습니다. – SigTerm

    4

    PE 이미지를 올바르게로드하는 데 따른 번거 로움과 걱정 외에도이 작업을 수행하지 못하도록하려는 Data Execution Protection에 대해 걱정할 필요가 있습니다.

    일부 Anitivirus 및 맬웨어 방지 도구에 대한 맬웨어 동작처럼 보일 수도 있음을 잊지 마십시오.

    +6

    데이터 실행 방지는 데이터 페이지에만 적용됩니다. PAGE_EXECUTE_ * 플래그 중 하나와 함께 VirtualAllocEx()를 사용하여 페이지를 할당하면 코드에서 해당 코드를 실행할 수 있습니다. –

    +2

    확장하려면 : DEP는 의도적 인 코드로드 및 실행을 방지하기위한 것이 아닙니다. 데이터 페이지에서 실수로 (또는 더 악의적 인) 코드 실행을 방지하기위한 것입니다. 스택에서 코드를 실행하는 버퍼 오버플로 공격. 실행 중에 직접 코드를 생성하고 실행하는 것은 합법적 인 동작입니다. JIT 컴파일러는 중요한 예입니다. –

    +0

    당신 말이 맞습니다, 마틴, 나는 질문 앞에 DEP 문서를 찾았습니다. –

    1

    내 관점에서 입력 한 솔루션은 거의 버그가 없으며,이 기능이 다른 기능으로 이동하는 이유는 무엇입니까? 그들은 다른 주소로 고정되어 있고 암호화 된 코드의 정적 링크 라이브러리가 어디에 있는지와 같은이 솔루션에 많은 문제점을 많이 겪고 있습니다.

  • 잠금 해제 DLL에에서 LoadLibrary을 비밀 조립
  • 암호화 그녀에게 tmp 디렉토리와

    1. 운송 encypted DLL 파일 :

      난 당신이 뭔가를 할 수 있다고 생각 파일을 만들고 시스템에서 제거 하시겠습니까?

  • +1

    예, 이것이 내가 본 것을 본 것입니다. 암호화 된 DLL은 기본 .exe 리소스에도 저장할 수 있습니다. 또한 추출 된 DLL이 대부분의 작업을 수행하기 위해 전달 된 점프 테이블을 통해 주 .exe의 함수를 호출하여 독립적으로 작동하지 않도록 할 수 있습니다. 하지만 어쨌든 이런 종류의 물건을 사는 것이 더 나을 것입니다. – Rup

    -3

    코드의 데이터를 나누는 전역 설명자 테이블 인 gdt 덕분에 대부분의 운영 체제에서 코드와 같은 데이터를 실행할 수 없습니다. 데이터를 실행하려고하면 프로세서에서 예외가 발생합니다.

    +0

    매우 최근까지는 x86에서 읽기 권한과 실행 권한이 동일했습니다. –

    +0

    운영체제가 GDT를 사용하지 않았기 때문에 그것이 동일한 것을 의미하는 것은 아닙니다. 위키피디아 또는 인텔 데이터 시트에서 직접 확인하십시오. – Charlie

    +0

    플랫 주소 공간 전체를 포함하는 세그먼트가 하나뿐이므로 GDT는 플랫 메모리 모델 (모든 일반적인 x86 OS에서 사용됨)에서이 용도로 사용할 수 없습니다. NX 비트 (http://en.wikipedia.org/wiki/NX_bit)는 페이지 테이블 수준에서 동일한 목적을 달성하지만 Prescott (http://en.wikipedia.org/wiki/)의 5x0J 시리즈에서만 소개되었습니다. Pentium_4). –

    1

    로더는이 정말 모든 것을 말해 데이터

    를 해독합니다.

    로더가 데이터를 해독 할 수 있으려면 해독 키를 포함해야합니다 (또는 적어도 알고 있어야 함).

    따라서이 로더를 실제로 사용자에게 배포하면 로더 코드와 사용 된 키 모두에 대한 모든 액세스 권한을 갖게됩니다.

    아마도 "보안 허위 의식"이란 무엇입니까?

    클라이언트가 완고하거나 무식한 것처럼 보일 때, 생각에 결함을 분명히 보여주는 간단한 암호 해독 데모를 만드는 것이 어떻습니까?

    +0

    코드 난독 화 *는 * 작동합니다. 일부 크래킹을 방지하면 일부 사람들이 전체 앱을 구매하게됩니다. 곡선이 어떻게 보이는지 추정하고 적절한 노력을 기울여야합니다. –

    관련 문제