問題タブ [portable-executable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Windowsでの決定論的ビルド
最終的な目標は、まったく同じ環境でまったく同じソースから構築された2つのバイナリを比較し、それらが実際に機能的に同等であることを確認できるようにすることです。
このための1つのアプリケーションは、リリース間で実際に変更されたものにQA時間を集中させることと、一般的な変更の監視です。
PE形式と連携したMSVCは、当然これを行うのを非常に困難にします。
これまでのところ、私はそれらのものを見つけて中和しました:
- PEタイムスタンプとチェックサム
- デジタル署名ディレクトリエントリ
- デバッガーセクションのタイムスタンプ
- PDBの署名、経過時間、ファイルパス
- リソースのタイムスタンプ
- VS_VERSION_INFOリソース内のすべてのファイル/製品バージョン
- デジタル署名セクション
私はPEを解析し、それらすべてのオフセットとサイズを見つけ、バイナリを比較するときにバイト範囲を無視します。チャームのように機能します(まあ、私が実行したいくつかのテストでは)。Win Server 2008でビルドされたバージョン1.0.2.0の署名された実行可能ファイルは、コンパイラのバージョンとすべてのソースとヘッダーが同じである限り、WinXP開発ボックスでビルドされたバージョン10.6.6.6の署名されていない実行可能ファイルと同じであることがわかります。これはVC7.1-9.0で機能するようです。(リリースビルドの場合)
注意点が1つあります。
両方のビルドの絶対パス は同じである 必要があり、同じ長さである必要があります。
cl.exeは相対パスを絶対パスに変換し、コンパイラフラグなどとともにオブジェクトに直接配置します。これは、バイナリ全体に不均衡な影響を及ぼします。パスを1文字変更すると、.textセクション全体で1バイトが何度か変更されます(ただし、リンクされているオブジェクトの数は多いと思います)。パスの長さを変更すると、大幅に多くの違いが生じます。objファイルとリンクされたバイナリの両方。
コンパイルフラグ付きのファイルパスが何らかのハッシュとして使用されているように感じます。これにより、リンクされたバイナリになり、コンパイルされたコードの無関係な部分の配置順序に影響を与えることさえあります。
それで、ここに3部構成の質問があります(「今何?」として要約されます):
私がやろうとしていることは、MSの物理法と企業方針に違反しているので、プロジェクト全体を放棄して家に帰るべきですか?
絶対パスの問題を(ポリシーレベルで、または魔法のコンパイラフラグを見つけることによって)処理すると仮定すると、他に注意すべき点はありますか?(__TIME__のようなものは変更されたコードを意味するので、無視されなくてもかまいません)
コンパイラに相対パスを使用させる方法、またはパスが実際のパスではないと思わせる方法はありますか?
最後の理由は、美しく迷惑なWindowsファイルシステムです。いくつかのギグに相当するソースとオブジェクトをいつ削除するかはわかりません。不正なファイルロックが原因でsvnメタデータが失敗します。少なくとも、スペースが残っている間は、新しいルートの作成は常に成功します。一度に複数のビルドを実行することも問題です。大量のVMを実行することは、解決策ではありますが、かなり重いものです。
プロセスとその子の仮想ファイルシステムをセットアップして、複数のプロセスツリーが同時にプライベートな異なる「C:\build」ディレクトリを表示するようにする方法があるのではないかと思います...ライト-ある種のウェイト仮想化...
更新:最近、GitHubでツールをオープンソース化しました。ドキュメントの比較セクションを参照してください。
windows - /TSAWARE リンカー フラグは、PE 実行可能ファイルに対して何を行いますか?
プロジェクトの 1 つ (Visual Studio 6) に /TSAWARE リンカー フラグを追加した後、PE ファイル (.idata) に新しいセクションがあることに驚きました。フラグを設定しない場合、インポートは .rdata にマージされます。
「問題」を説明するために、単純なコンソール プログラムから始めます。
そして次のようにコンパイルします:cl /Og /O1 /GF /WX /c main.c
次に、とリンクします
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj
dumpbin の出力を比較してみましょう。
したがって、何らかの理由で、リンカはインポートをマージできないと判断します。
しかしeditbin /TSAWARE a.exe
、PE オプション ヘッダーの DLL 特性フィールドのみを実行すると、変更されます。
誰かが私にこれを説明できますか? これはリンカのバグですか、それとも editbin によって変更された実行可能ファイルが特定のシステムで動作しなくなる可能性がありますか?
linux - ResHacker のように Win32 PE を編集するネイティブ Linux アプリ
自動変更 .dll サービスを実行したいのですが、ユーザーが特定の .dll を送信し、それをサーバー上で変更すると、ユーザーは変更されたバージョンの .dll をダウンロードできます。少なくともコマンドラインまたはスクリプト API を提供する、アイコン、文字列、アクセラレータ、ダイアログなどの一般的な Win32 PE 変更機能を提供するネイティブ Linux アプリはありますか?
c++ - Visual C++ でのバイナリの再現性
Visual C++ で同じコードを強制的に同じバイナリを生成する方法はありますか? PE のタイムスタンプをオフにするか、PE のタイムスタンプを強制的に固定値にしますか?
perl - Perlを使用してWinNTポータブル実行可能ファイルからヘッダーを読み取るにはどうすればよいですか?
PerlでPEファイルを操作したいのですが、モジュールが見つからなかったので、自分で作成すると思います(delphiで一度作成しました)。
実行可能ファイルをバッファにマッピングするときに問題が1つだけあります。0x00004550(IMAGE_NT_SIGNATURE)のような8進数を検索し、書き込み可能な文字列に戻すにはどうすればよいですか?
linux - 明確なアドレス(gcc、linux)の実行可能ファイルに「空の」スペースを作成するにはどうすればよいですか?
私が本質的にやりたいのは、実行可能ファイルが「動作」するために、別のプログラムにこの「空のスペース」にデータを書き込んでもらうことです。
アプリケーションに署名を追加してからデータを書き込んで後で検索することを考えましたが、それは正しく聞こえません...
さて、他の重要なこと...私は次のようなコードを使用してコード洞窟を作成することが可能であるはずだと知っています:
次に、これでも実質的に同じです(.dataセクションにあるため、実行可能ではないという事実を除けば)。
問題は、他のアプリケーションに書き込むための明確なアドレスがないことです。
c# - メモリにロードされたモジュールのPEヘッダーを読み取るにはどうすればよいですか?
.NETでメモリアクセスを試しています。現在、アンマネージBaseAddress
プロセスを開始し、ロードされたモジュールの1つ(DLL)を取得するマネージプログラムがあります。私がやりたいのは、ロードされたモジュールのPEヘッダーを何らかの方法で読み取って、後でそのエクスポートのアドレスを取得できるようにすることです。
残念ながら、これに関する適切な情報は見つかりません。何か案は?
resources - PE ファイルのリソース (文字列、画像など) を保護するには?
編集から pe ファイル リソースを保護する方法が必要です。どうもありがとうございました..
次のような編集:
1) pe ファイルをバイナリ ファイルとして開き、文字列を検索して編集します。
また
2) 「jne」(等しくない場合はジャンプ) のようなアセンブリ コードを「je」(等しい場合はジャンプ) に編集します。
file - crcを使用した編集からc++出力ファイル(peファイル)を保護します
crc(Cyclic Redundancy Check)を使用してc ++出力ファイル(peファイル)を編集から保護するにはどうすればよいですか?