2013-09-03 2 views
6

나는 게임을하고 있는데, 내가 사용하고있는 건전한 자산의 라이센스 계약에 따른 요구 사항 중 하나는 최종 사용자가 액세스 할 수 없도록 배포된다는 것입니다. 그래서, 나는 그것들을 하나의 파일로 모으고, 그들을 암호화하거나, 그런 파일을 암호화하려고 생각하고있다. 문제는 내가 사용하고있는 사운드 라이브러리 (Hekkus Sound System)가 'char *'파일 경로 만 받아들이고 내부적으로 파일 읽기를 처리한다는 것입니다. 그래서, 만약 내가 그것을 계속 사용하려면 암호화를 처리하기 위해 stdio 파일 함수를 오버라이드해야 할 것입니다. 이것은 할 수있는 것처럼 보이지만 그것은 나를 걱정합니다. 웹에서 나는 플랫폼 (Win32, Android 및 iOS)과 관련된 이상한 좌절 문제를 겪고있는 사람들을보고 있습니다.c 라이브러리 파일 기능을 대체 하시겠습니까?

이 작업을 수행하는 플랫폼 간 라이브러리가 있습니까? 당신이 전적으로 더 나은 접근법을 권하고 싶습니까?

+4

인코딩을 해독하고/tmp 파일에 undecoded를 작성한 다음 공개 호출을 한 후 바로 연결을 해제하십시오 오픈? Hekkus 내부의 파일 디스크립터는 열린 후에도 유효합니다. (편집 : 아래의 램 디스크 아이디어는 더 좋아 보인다.) –

+2

"액세스 할 수 없음"을 정의하십시오. 사용자의 시스템에서 사운드를 재생하는 경우, 나에게 꽤 접근하기 쉬운 것 같습니다. 어쨌든 Hekkus Sound System과 관련하여 저자의 웹 사이트에 관심이있는 사람에게 정보를 제공한다고합니다. 따라서 가장 쉬운 방법은 소스 코드를 받고 패치하는 것입니다. 사운드 라이브러리가 데이터를 가져 오는 방법을 추상화하지는 않지만 이상합니다. – n0rd

+2

C에서 예약 식별자를 재정의하지 마십시오. 정의되지 않은 동작이 호출됩니다.[...] [...] 프로그램이 표준 헤더를 통하지 않고 라이브러리 함수 자체를 선언하려고 시도합니다 (예 : J12 섹션 참조). 선언문에는 외부 연계가 없다 (7.1.2). 프로그램은 7.1.4 (7.1.3)에서 허용 한 것 이외의 예약 된 식별자를 선언하거나 정의합니다. ** –

답변

7

일반 파일 대신 명명 된 파이프를 사용할 수 있습니까? 그렇다면, 사운드 라이브러리에 파이프를 읽을 파일로 제시 할 수 있으며 데이터를 해독하여 파이프에 쓸 수 있습니다. (명명 된 파이프에 대한 설명은 Beej's Guide을 참조하십시오.)

+0

아니요, 유일한 char * ... – Vigabrand

+2

이해가 안됩니다. 사운드 데이터를 라이브러리에 전달하는 대신 파일 이름을 전달해야한다고 말하는 것 같습니다. 이 경우, FIFO라고도하는 명명 된 파이프가 해결책이 될 수 있습니다. 명명 된 파이프는 파일 시스템에 파일로 표시되므로 파일을 읽는 데 필요한 모든 것이 디스크에있는 파일을 읽는 대신 파이프의 수신 측에서 찾습니다. 따라서 프로그램은 명명 된 파이프를 만들고 파이프의 _ 파일 이름을 사운드 라이브러리에 전달하고 해독 된 오디오 데이터를 작성하여 파이프의 끝에 쓸 수 있습니다. –

+1

유닉스에 명명 된 파이프는 일반 파일처럼 fopen'ed 할 수있는 파일 그러므로 그 이름은 일반 '의 char *는'이며, 오디오 라이브러리는 문제가 그것에서 읽을 필요는 없습니다. 그러나,이 프로그램의 또 다른 스레드에서 예를 들어,에서는 mkfifo 함수를 사용하여 만든, 그리고에 기록해야 차단됩니다 다른는 fopen (http://stackoverflow.com/questions/580013/how-do-i-perform- 참조 a-non-blocking-fopen-on-a-named-pipe-mkfifo) – SirDarius

0

문제의 해결책은 램 디스크입니다. http://en.wikipedia.org/wiki/RAM_drive 마치 램 디스크처럼 메모리 조각을 사용합니다. 사용할 수있는 소프트웨어가 있습니다. 램에 데이터베이스 캐싱이 널리 보급되고 있습니다.

그리고 사용자가 쉽게 액세스 할 수 있도록 파일을 디스크에 보관하지 않습니다.

+0

Android? 아이 패드? –

+0

게임이나 응용 프로그램이 실행 중 시스템에 새 드라이브를 추가 한 경우 정말 좋지 않습니다. 게다가 휴대용 솔루션이 있는지 모르겠다. 아마도 root/adminstrator 권한이 필요할 것이다. – interjay

+0

파일 읽기 기능을 무시하는 것보다 훨씬 낫습니다. –

5

stdio가 개발자가 모르는 방식으로 정확하게 작동하는 방식을 모르는 lib가 올바른 접근 방식이 아닌 것처럼 보입니다 정말 쉽지는 않습니다. ramdrive를 구현하려면 다른 오디오 라이브러리를 검색하는 것이 좋습니다.

Hekkus Sound System 내가 찾은 사람은 한 사람이고 마지막으로 업데이트 된 사람입니다. 나는 소스를 공유하지 않고 한 사람 만이있는 lib에 의존하지 않습니다.

제 조언으로, 적절한 사운드 라이브러리를 찾기 위해 시간을 투자하십시오. 대신 적절한 사운드 라이브러리를 찾으십시오.

+0

들려요. 그러나 Hekkus가 한 사람의 작업 임에도 불구하고 완전하고 사용하기 쉬운 라이브러리로서 매우 높은 품질의 기능을 입증했기 때문에 그것이 유감 스럽습니다. 플랫폼 간 플랫폼입니다. 신경 써. 왜 stdio를 무시하는 것이 어렵다고 말하는가? 간단한 암호 해독을 수행하는 얇은 레이어를 추가하는 것이 너무 어려워서는 안되며, 실제 함수를 무시하는 것이 좋습니다. – Vigabrand

+0

그럴 수도 있고, 그것은 물론 당신의 결정입니다. 솔직히 플랫폼 독립적 인 방법으로 stdio를 재정의하는 방법을 모르겠습니다. 예 : Windows 용 솔루션은 명명 된 파이프를 만드는 것이고, stdio 파일 함수로 열 수있는 명명 된 파이프에 대한 경로를 작성할 수 있습니다. 리눅스와 비슷한 메커니즘이 있지만, 아이폰이나 안드로이드 같은 다른 플랫폼에서도 똑같은 것인지 모르겠습니다. Windows에서 명명 된 파이프를 만들려면 Windows API의 CreateFile을 사용할 수 있습니다. 내가 아는 한 플랫폼 독립적 인 명명 된 파이프 라이브러리는 없습니다 (아직). 제가 생각했던 것은 창 –

+0

리눅스 전용 개념 인 것 같다? – Vigabrand

2

가능성은 encrypted loopback filesystem (추가 리소스는 google)을 사용하는 것입니다.

실제로 작동하는 방식은 자산을 암호화 된 파일 시스템에 저장하는 것입니다. 실제 파일은 단순한 파일에 저장됩니다. 이 파일 시스템은 루프백 장치로 어딘가에 마운트됩니다. 첨부/마운트시 비밀번호를 제공해야합니다. 마운트되면 모든 파일을 소프트웨어에 일반 파일로 사용할 수 있습니다. 하지만 그렇지 않으면 파일이 암호화되어 액세스 할 수 없습니다.

+0

이 필요에 잘 될 수있다 "는 stdio를 오버라이드 (override)"으로 – Vigabrand

+0

대부분 * nix OS (MacOS 포함)에는 http://en.wikipedia.org/wiki/Loop_device가있는 것 같습니다. 또한 안드로이드는 리눅스 파생물이기 때문에 또한 있어야합니다. – Ziffusion

+0

나는 또한 Windows에서 발표 할 예정이다. – Vigabrand

1

이것은 컴파일러에 종속적이며 보증 된 기능은 아니지만 많은 경우 파일/리소스를 exe에 직접 포함시키고 디스크에서와 같이 코드에서 읽을 수 있습니다. 그런 식으로 사운드 파일을 삽입 할 수 있습니다. 그것은 크게 exe의 크기를 증가하지만.

+0

이것은 투명하게 작동하지 않으므로 라이브러리가 이러한 "파일"을 열 수 없습니다. – Vigabrand

+0

@Vigabrand 왜 안 되니? 바이트 배열에로드하십시오. –

+0

숯불 *이 Hekkus의 API – Vigabrand

1

또 다른 UNIX 기반의 접근 방식 :

변수 LD_PRELOAD는 실행 파일이에 링크되어있는 공유 라이브러리를 대체하는 데 사용할 수있는 환경을 제공합니다. LD_PRELOAD에 언급 된 라이브러리에서 내 보낸 모든 심볼은 open, readclose과 같은 libc 함수에 대한 호출을 포함하여 해당 라이브러리로 확인됩니다. libdl을 사용하면 랩핑 라이브러리가 원래 구현으로 호출 할 수도 있습니다.

그래서 LD_PRELOAD가 적절하게 설정된 환경에서 Hekkus 사운드 시스템을 사용하는 프로세스를 시작하면 원하는 파일을 원하는대로 실행할 수 있습니다.

그러나 사용자가 데이터를 액세스 할 수 없게하는 방법은 절대 없다는 점에 유의해야합니다. 즉, 듣기 만하면 액세스 권한이 있다는 사실입니다. 체인의 모든 소프트웨어가 암호화를 사용하고 사용자가 하드웨어 해킹을 기꺼이하지 않더라도 오디오 출력 잭을 오디오 입력 잭과 연결하는 것이 어렵지 않습니까? 그리고 사용자가 이어폰을 사용하는 것을 금지 할 수는 없습니까? 그리고 물론, 커널은 암호화되지 않은 모든 오디오 출력을 볼 수 있으며 다른 곳으로 복사본을 보낼 수 있습니다 ...

+0

흥미로운 옵션처럼 보입니다. 물론 창을 지원해야합니다. 두 번째 요점은 사운드가 개별적으로 재생되지 않으며 음악과 여러 사운드가 발생하므로 유용하지 않습니다. 나는 등을 해본 적이 없다 – Vigabrand

+0

에도 불구하고, 나는 원래 소리를 리버스 엔지니어링하는 방법을 생각할 수 있고, 원본 파일은 암호화와 음악 소스가 행복 한 경우에는 물론, 정확하게 복잡하지 않습니다 ...하지만, 및 어쨌든 음악을 추출 할 수있는 가능성에 만족합니다. 문제가없는 것 같습니다. 음악 파일이 인터넷에 표시되면 그 사람이 고소 할 수 없다는 것을 확실히하십시오. – cmaster