문제

비즈니스를 수행하는 동안 하나 이상의 도우미 실행 파일을 사용하는 도서관을 개발하고 있습니다. 내 현재 구현에는 사용자가 알려진 위치에 시스템에 헬퍼 실행 파일이 설치되어 있어야합니다. 라이브러리가 올바르게 작동하려면 도우미 앱이 올바른 위치에 있어야하며 올바른 버전이어야합니다.

위의 방식으로 시스템을 구성 해야하는 요구 사항을 제거하고 싶습니다.

라이브러리에서 헬퍼 실행 파일을 묶어 런타임에 포장을 풀고 임시 디렉토리에 설치하고 한 번의 실행 기간 동안 사용될 수있는 방법이 있습니까? 달리기가 끝나면 임시 실행 파일을 제거 할 수 있습니다.

실행 파일의 텍스트를 포함하는 서명되지 않은 숯 배열이 포함 된 파일을 자동으로 생성하는 것을 고려했습니다. 이것은 빌드 프로세스의 일부로 컴파일 시간에 수행됩니다. 런타임 에이 문자열은 파일에 기록되어 실행 파일을 만듭니다.

실행 파일을 디스크에 쓰지 않고 그러한 작업을 수행 할 수 있습니까 (아마도 일종의 램 디스크)? 특정 바이러스 스캐너 및 기타 보안 소프트웨어가 그러한 작업에 반대하는 것을 구상 할 수 있습니다. 내가 걱정해야 할 다른 우려가 있습니까?

라이브러리는 Windows 및 Linux에서 크로스 플랫폼 사용을 위해 C/C ++로 개발 중입니다.

도움이 되었습니까?

해결책

당신이 사용할 수있는 xxd 이진 파일을 C 헤더 파일로 변환합니다.

$ echo -en "\001\002\005" > x.binary

$ xxd -i x.binary 
unsigned char x_binary[] = {
  0x01, 0x02, 0x05
};
unsigned int x_binary_len = 3;

xxd *NIX 시스템의 표준이며 Cygwin 또는 Mingw가있는 Windows에서 사용할 수 있으며 VIM은 표준 설치 프로그램에도 포함합니다. 이진 데이터를 컴파일 된 코드에 포함시키는 매우 교차 플랫폼 방법입니다.

또 다른 접근법은 사용하는 것입니다 objcopy 실행 파일의 끝까지 데이터를 추가하려면 -IIRC ~할 수 있다 얻다 objcopy 창에서 PES에 사용하십시오.

그보다 조금 더 좋아하는 한 가지 접근법은 실행 파일의 끝에 원시 데이터를 바로 추가하는 것입니다. 실행 파일에서 파일의 끝을 찾고 숫자로 읽어 첨부 된 이진 데이터의 크기를 나타냅니다. 그런 다음 많은 바이트를 뒤로 찾습니다 fread 해당 데이터를 파일 시스템으로 복사하여 실행 파일로 취급 할 수 있습니다. 이것은 우연히입니다 전부는 아니지만 자체 추출 실행 파일이 생성되는 방식.

이진 데이터를 추가하면 Windows PE 파일 및 *Nix ELF 파일 모두에서 작동합니다. 어느 것도 실행 파일의 "제한"을 지나서 읽지 않습니다.

물론 여러 파일을 추가 해야하는 경우 TAR/ZIP 파일을 EXE에 추가하거나 추가 된 내용을 읽으려면 약간 더 많은 사전 데이터 구조가 필요합니다.

당신은 아마 원할 것입니다 upx 당신의 실행 파일은 당신이 그들을 추가하기 전에.

당신은 또한 관심을 가질 수 있습니다 LZO 도서관, 이는 가장 빠른 탈환하는 압축 라이브러리 중 하나입니다. 그들은 매우 가벼운 감압제에 사용할 수있는 Minilzo 라이브러리가 있습니다. 그러나 LZO 라이브러리는 GPL 라이센스가있어 ~할 것 같다 코드도 GPLED가 없으면 소스 코드에 포함시킬 수 없다는 것을 의미합니다. 반면에 상용 라이센스가 있습니다.

다른 팁

"영리한 사람이 문제를 해결합니다. 현명한 사람은 그것을 피합니다." - 앨버트 아인슈타인

이 인용문의 정신으로 나는이 실행 파일을 최종 응용 프로그램과 함께 단순히 묶어 놓는 것이 좋습니다.

내 2 센트.

서명되지 않은 Char* 어레이를 사용하는 것과는 약간 다른 접근법은 전체 실행 가능한 바이너리를 DLL의 자원으로 배치하는 것입니다. 런타임에 이진 데이터를 로컬 온도 파일로 저장하고 앱을 실행할 수 있습니다. 그래도 메모리에서 실행 파일을 실행하는 방법이 있는지 확실하지 않습니다.

라이브러리가 제대로 작동하려면 도우미 앱이 올바른 위치에 있어야합니다.

Windows에서는 프로그램 파일 디렉토리 또는 System32 디렉토리일까요?

이것은 문제 일 수 있습니다. 특히 회사 환경에 응용 프로그램이 설치되면 일반적으로 행정 권한이있는 맥락에서 발생합니다. Vista와 나중에 UAC 활성화 (기본값)를 사용하면 특정 디렉토리에 작성해야합니다. 그리고 대부분의 유닉스 풍미는 누구나 기억할 수있는 한 오랫동안 이와 같은 합리적인 제한을 가지고 있습니다.

따라서 호스트 애플리케이션이 라이브러리로 호출 할 당시에이를 수행하려고하면 파일을 설치할 수있는 충분한 권한이있는 컨텍스트에 있지 않을 수 있으므로 라이브러리가 호스트 애플리케이션에 제한을 제한 할 수 있습니다.

(배제 될 또 다른 것은 호스트 애플리케이션이 프로세스를 관리 수준으로 높일 수있는 능력이없는 경우 다양한 유엔에 대한 레지스트리 변경 또는 다양한 UNICE에 대한 구성 파일 업데이트입니다.)

모든 것을 말하면, 당신은 당신이 도우미를 임시 디렉토리로 풀고 있다고 고려하고 있다고 말하면, 아마도 이것이 모두 무시할 것입니다.

QT는 이것을 달성하는 훌륭한 방법을 가지고 있습니다. qresource

"QT 리소스 시스템은 응용 프로그램 실행 파일에 이진 파일을 저장하기위한 플랫폼 독립적 메커니즘입니다."

현재 QT를 사용하고 있다면 "Windows 및 Linux에서 크로스 플랫폼 사용을위한 C ++"이라고 말하지 않으므로 사용하지 않더라도 시작을 고려할 수 있습니다.

Windows에는 디스크에 쓰지 않고 메모리 내에서 실행 파일을 실행하는 방법이 있습니다. 문제는 최신 보안 시스템 (DEP)으로 인해 모든 시스템에서 작동하지 않을 것이며 거의 모든 맬웨어 방지 스캐너가이를 감지하고 사용자에게 경고한다는 것입니다.

저의 조언은 단순히 실행 파일을 배포에 포장하는 것입니다. 확실히이를 달성하는 가장 신뢰할 수있는 방법입니다.

글쎄, 나의 첫 번째 생각은 다음과 같습니다.이 헬퍼 실행 파일은 당신의 라이브러리 코드 자체 내에서 할 수없는 일, 아마도 필요한 경우 보조 스레드를 사용 할 수있는 일은 무엇입니까? 이것은 고려해야 할 것일 수 있습니다.

그러나 실제 질문에 관해서는 ... "라이브러리"가 실제로 DLL (또는 EXE)으로 묶여 있다면 최소한 Windows는 라이브러리 내에 파일을 임베딩하는 데 상대적으로 SIMPE 지원이 있습니다.

버전 정보 및 아이콘과 같은 실행 파일에 포함시킬 수있는 리소스 메커니즘은 임의의 데이터 덩어리를 허용 할 수 있습니다. 어떤 개발 환경을 사용하고 있는지 모르기 때문에이 작업을 수행하는 방법을 정확히 말할 수는 없습니다. 그러나 대략적으로 말하면, "파일"유형의 "파일"또는 그와 같은 현명한 것을 사용하여 사용자 정의 리소스를 만들고 포함하려는 EXE를 가리키야합니다.

그런 다음 추출하고 싶을 때 다음과 같은 글을 쓸 것입니다.

HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MY_EMBEDDED_FILE), "FILE");
HGLOBAL hResourceData = LoadResource(NULL, hResource);
LPVOID pData = LockResource(hResourceData);
HANDLE hFile = CreateFile("DestinationPath\\Helper.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, SizeofResource(NULL, hResource), &dwBytesWritten, NULL);
CloseHandle(hFile);

(자신의 원하는 경로, 파일 이름 및 물론 적절한 오류 확인)

그 후, 도우미 EXE는 일반적인 EXE 파일로 존재하므로 일반적으로 실행할 수 있습니다.

사용 후 파일을 제거하려면 플래그를 조사해야합니다. CreateFile, 특히 FILE_FLAG_DELETE_ON_CLOSE. 당신은 또한 사용을 볼 수도 있습니다 MoveFileEx 결합 할 때 MOVEFILE_DELAY_UNTIL_REBOOT NULL이있는 플래그는 새 파일 이름으로 전달되었습니다. 물론 실행 파일이 종료 된시기를 알 수 있다면 항상 자신의 코드로 삭제할 수 있습니다.

Linux 실행 파일에 대해 충분히 알지 못하므로 비슷한 기능을 사용할 수 있는지 모르겠습니다.

Linux가 편리한 메커니즘을 제공하지 않거나이 아이디어가 Windows에서 귀하의 요구에 적합하지 않은 경우, Helper Exe의 내용에서 서명되지 않은 Char 어레이를 생성한다는 아이디어가 다음으로 임베드하는 가장 좋은 방법이라고 생각합니다. 도서관의 exe.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top