質問

私はビジネスを行う過程で一の以上のヘルパー実行可能ファイルを使用してライブラリを開発しています。私の現在の実装では、ユーザーが既知の場所にシステムにインストールされているヘルパー実行可能ファイルを持っていることが必要です。関数へのライブラリのために適切にヘルパーアプリが正しい位置にあることと、正しいバージョンである必要があります。

Iシステムは、上記のように構成する要件を除去したいと思います。

それは、実行時に解凍し、一時ディレクトリにインストールされ、一度の実行の期間中に使用することができることを、このようなライブラリーにヘルパー実行可能ファイルをバンドルする方法はありますか?実験の終わりに、一時的な実行可能ファイルが削除される可能性があります。

私は、自動的に実行可能ファイルのテキストが含まれているunsigned char型の配列を含むファイルを生成すると考えられてきました。これは、ビルドプロセスの一環として、コンパイル時に行われます。実行時にこの文字列は、このように実行可能ファイルを作成し、ファイルに書き込まれます。

ディスク(RAMディスクのおそらくいくつかの並べ替え)に実行ファイルを記述することなく、このような作業を行うことは可能でしょうか?私は特定のウイルススキャナと、このような操作に反対他のセキュリティソフトウェアを思い描くことができます。そこに他の懸念は、私が心配する必要がありますか?

ライブラリは、WindowsおよびLinux上のクロスプラットフォーム用のC / C ++で開発されています。

役に立ちましたか?

解決

あなたはCヘッダファイルにバイナリファイルを変換するために、 xxd を使用することができます。

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

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

objcopy * nixのシステムではかなり標準であり、それはCygwinのかMinGWのとWindows上で利用可能です、またはVimは同様に、標準のインストーラでそれを含んでいます。これは、コンパイルされたコードにバイナリデータを含むように非常にクロスプラットフォームな方法である。

別のアプローチは、 <=を使用することです>実行ファイルの最後までにデータを追加するに - IIRCあなたはEMを<>がの取得freadおよびWindows上のPEのためにそれを使用することができます。

私はそれよりも少し良く好き

一つのアプローチは、ちょうどまっすぐにあなたの実行可能ファイルの末尾に生データを追加することです。添付バイナリデータのサイズを示す、実行ファイルでは、ファイルの最後に求め、その数を読み込みます。その後、後方、多くのバイトを求め、<=>そのデータおよび実行可能ファイルとして扱うことができ、ファイルシステムにそれをコピーします。これは偶然にそれは多く、そうでない場合は方法ですすべて、自己解凍型の実行可能ファイルがに作成されます。

あなたがバイナリデータを追加した場合は、

、それは、Windows PEファイルと* nixのELFファイルの両方で動作します - 。どちらも、それらの実行ファイルの「限界」を超えて読み

複数のファイルを追加する必要がある場合は、

もちろん、あなたはexeファイルへのtar / zipファイルを追加するか、またはあなたが付加されているもの読むことをもう少し事前のデータ構造が必要となります。

あなたがそれらを追加する前に、

また、おそらく UPX のあなたの実行ファイルにしたいでしょう。

あなたも伝え一つです LZOライブラリに、に興味があるかもしれません最速・解凍圧縮ライブラリの。彼らはあなたが非常に軽量なデコンプレッサに使用できるMiniLZOライブラリを持っています。しかし、LZOライブラリはGPLは、ライセンスされているので、の可能性がありますはあなたのコードも同様にGPL準拠されていない限り、あなたのソースコードに含めることはできませんを意味します。一方、商用ライセンスが利用可能である。

他のヒント

  

「賢い人は、問題を解決します。A   賢い人はそれを避ける「 - 。アルバート・アインシュタイン

この引用の精神で、私はあなたが単にエンド・アプリケーションで、この実行可能ファイルを一緒にバンドルすることをお勧めします。

ちょうど私の2セントます。

はunsigned char *の配列を使用してわずかに異なるアプローチは、DLLのリソースとして全体の実行可能バイナリを置くことです。実行時には、ローカルの一時ファイルとしてバイナリデータを保存し、アプリケーションを実行することができます。でも、私は、メモリ内の実行可能ファイルを実行するための方法があるかどうかわからない。

  

ライブラリが正しく機能するために   ヘルパーアプリは正しいでなければなりません   場所

Windowsでは、それは、Program FilesディレクトリまたはSystem32ディレクトリでしょうか?

これは問題になるかもしれません。アプリケーションがインストールされている場合は、特に企業環境では、それは通常、管理者権限を持つコンテキストで発生します。 Vistaでは以降UACがイネーブル(デフォルト)に設定し、これは特定のディレクトリに書き込む必要があります。そして、ほとんどのUnixのフレーバーがある限り、誰もが覚えていることができてためにそのような賢明な制約があった。

あなたは、ホストアプリケーションは、あなたのライブラリーを呼び出すときにそれを実行しようとした場合、

それは、ファイルをインストールするための十分な権限を持つコンテキストではないかもしれない、ので、あなたのライブラリーは、ホストアプリケーションに制約を置くようにします。

(ホストアプリケーションは、管理者レベルに過程を上昇させる能力を持っていない場合は除外されますもう一つは、レジストリの変更、または、各種のUnix上の設定ファイルの更新です。)

すべてのことを言って、あなたはので、多分これは、すべての議論の余地がある、あなたは一時ディレクトリにヘルパーを開梱検討していると言っています。

Qtは、これを達成するための優れた方法があります。 QResource

「Qtの資源システムは、アプリケーションの実行可能でバイナリファイルを格納するためのプラットフォームに依存しないメカニズムです。」

あなたが現在のQtを使用している場合は、

あなたは言いませんが、あなたは、「WindowsとLinuxのクロスプラットフォーム用のC ++」と言うんので、あなたはそれを使用していない場合でも、あなたが開始することを検討してください。

ディスクに書き込むことなく、メモリ内から実行可能ファイルを実行するには、Windowsでの方法があります。問題は、現代のセキュリティシステム(DEP)に、これはおそらく、すべてのシステムで動作しませんし、ほぼすべてのアンチマルウェアスキャナがそれを検出し、ユーザーに警告するということです。

私のアドバイスは、それは確かにこれを達成するための最も確実な方法ですが、単にあなたのディストリビューションに実行可能ファイルをパッケージ化することである。

さて、私の最初の考えは次のようになります。このヘルパー実行可能ファイルは、それが必要な場合は、おそらく二次スレッドを使用して、あなたのライブラリーのコード自体の中で行うことができませんでした何をするのでしょう。これは、考慮すべきものになるかもしれません。

しかし、実際の問題のためとして...あなたの「ライブラリ」は、実際にDLL(あるいはexeファイル)としてアップバンドルされている場合は、少なくともWindowsは、あなたのライブラリ内のファイルを埋め込むための比較的simpeサポートしています。

バージョン情報とアイコンのようなものは、実行ファイル内に埋め込むことを可能にするリソースメカニズムは、データの任意のチャンクを許可することができます。私はあなたが使用しているものの開発環境を知らないので、私はこれを行う方法を正確に言うことはできません。しかし、大まかに言えば、あなたは「FILE」のタイプまたはそのような賢明な何かをカスタムリソースを作成し、埋め込みたい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ファイルとして存在し、しかし、あなたは通常どおりので、あなたはそれを実行することができます。

使用後にファイルを削除するためには、特にCreateFileFILE_FLAG_DELETE_ON_CLOSEのフラグを調査する必要があります。また、NULLが新しいファイル名に渡されるとMoveFileExフラグを組み合わせるときMOVEFILE_DELAY_UNTIL_REBOOT使用に見えるかもしれません。実行が終了したときに伝えることができればそしてもちろん、あなたは常に自分自身のコードでそれを削除することができます。

私は、Linuxの実行ファイルについて十分に知っていないので、同様の機能が利用できるかどうかは知りません。

Linuxは、任意の便利なメカニズムを提供していないおよび/またはこのアイデアは、Windowsでのニーズに合わない場合は、その後、私は、ヘルパーexeファイルの内容からunsigned char型の配列を生成するあなたのアイデアは、次の最良のだろうと仮定した場合あなたのライブラリ内のexeファイルを埋め込む方法ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top