問題タブ [executable-format]
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.
monitoring - 実行ファイルの監視
数年前に購入したプログラムがあります。ここ数年、新しい Windows をインストールしたときに、ソフトウェア プログラマーに電話して PC に再度インストールするように言われました。今、私はこの男を見つけることができず、プログラムを開きたいので、私のexeファイルを開くためにどのファイルが必要かを知りたいのですが、レジスタへのキーを追加する必要がある場合は、何を追加する必要があるかを監視していると思います.
このようなものは何でも知るために使用できます。PS: 私は exe ファイルを持っていて、それを開こうとしましたが、いくつかのファイルを要求し、既に system32 に追加されています。
executable-format - 通常、ファイル サイズが小さくなる実行可能形式はどれですか?
通常、ファイル サイズが小さくなる実行可能形式はどれですか? たとえば、a.out 形式は ELF よりも小さいと聞いたことがあります。この質問はクロスプラットフォームなので、MS-DOS も同様です。
linker - スタックの開始アドレスを移動できるリンカー スクリプト ディレクティブはありますか?
x86_64 でリンカー スクリプトを使用して、スタックの開始位置を変更しようとしています。これを使用して、実行可能な開始アドレスを移動できました。
グローバルを次のように変更しました。
スタック領域を移動するために以下を使用しようとしました:
しかし、それは私をどこにも連れて行きませんでした。
スタックの場所をテストするために使用するテスト プログラムは次のとおりです。
これは、gcc のデフォルト リンカー スクリプトからの出力です (変更なし)。
私のリンカースクリプトからの出力は次のとおりです。
nmが新しい場所を出力するので、私は本当に混乱しています:
stack_start と stack_end が x86_64 で有効かどうかさえわかりませんが、arm のリンカ スクリプト チュートリアルからその部分をオンラインで取得したためです。リンカー スクリプトでエラーや警告が表示されないため、何が起こっているのかわかりません。
なぜ誰かがこれを行うのか疑問に思っている場合は、セキュリティ研究に影響があります。
リンカー スクリプトを使用してやりたいことを実行する方法はありますか? .text、.bss、および .data セクションは移動できるが、スタックは移動できないとは信じられません。
更新: http://www.lurklurk.org/linkers/linkers.html#osから取られた説明は、これがリンカで実行できない理由です:
「これまでのオブジェクト ファイルとリンカーに関するすべての説明は、グローバル変数についてのみ説明していることに気付いたかもしれません。前述のローカル変数と動的に割り当てられたメモリについては言及されていません。これらのデータには、リンカーの関与は必要ありません。なぜなら、それらの寿命は、プログラムが実行されているとき、つまりリンカーが業務を終了してからずっと後にしか発生しないからです。」
linux - コアダンプは単独で実行できますか?
コアダンプに関するウィキペディアのページには、
Unix ライクなシステムでは、コア ダンプは通常、標準の実行可能なイメージ形式を使用します。
これは、コア ダンプ自体が実行可能であることを意味しますか? そうでない場合、なぜですか?
編集: @WumpusQ.Wumbley がcoredump_filter
コメントで a に言及しているので、おそらく上記の質問は次のようになるはずです:それ自体で実行できるようにコア ダンプを生成できますか?
parsing - コンパイラは、コンパイル プロセスの最後に実行可能ファイルをどのように作成しますか?
私はコンパイルプロセスについて読んでいます。解析などの以前の概念のいくつかは理解していますが、最後に実行可能ファイルがどのように作成されるかを理解することはできません。
私が見た例では、「コンパイラ」はBNFによって定義された言語の形式で入力を受け取り、解析するとアセンブリを出力します。
実行可能ファイルは文字通りバイナリ形式のアセンブリだけですか? アセンブリから実行可能ファイルを作成するためのアプリケーションがあることを考えると、これは当てはまらないと思いますか?
これに答えられない場合 (つまり、スタック オーバーフロー フォーマットには複雑すぎる場合)、リンクや本に完全に満足しているので、自分自身を教育することができます。
c++ - PE Win32 で /GS コンパイラが有効になっているかどうかを確認する方法
DOS ヘッダーから ASLR、DEP、SEH などを解析できますが、ファイルが /GS スタック カナリアでコンパイルされたかどうかを確認する方法がわかりません。
私はプログラムを書いているので、オープンソースでない限り、PEStudio のようなプログラムを教えても役に立ちません。
これは dos ヘッダーの一部ですか? または、__security_cookie の .data セクションをスキャンする必要がありますか?
c++ - EXE ファイル内にテキスト関数名があるのはなぜですか?
C++ プログラムをコンパイルして、EXE ファイルをリリース モードにしました。EXE ファイルをエディターで開くと、テキスト ブロックの断片が表示されます。これらのほとんどは、プログラムで使用されている低レベル関数の名前です。
コンピュータはバイナリの機械語コードしか理解できないと言われています。では、実行可能プログラム ファイル内に人間が読めるこれらのテキストが存在する目的は何でしょうか? プログラムを実行するためにコンピュータが関数名を必要とするのはなぜですか?
IDE: Visual Studio 2015 RC
プラットフォーム: Windows 8.1 x64
コンパイラ コマンド ライン オプション:
リンカー コマンド ライン オプション:
編集:
rcgldr's answerで変更を行いました。\MD
コマンド ライン スイッチを に変更するプロジェクト設定の変更を行いました\MT
。実行ファイルのサイズが 56kb から 436kb に変更されました。必要なライブラリが実行時にリンクされていないためだと思いますが、最初から EXE ファイルに格納されています。しかし、下のスクリーン ショットに示すように、EXE ファイルにはまだテキストのブロックがあります。標準テンプレート ライブラリ (STL) からの関数名は完全になくなりましたが、多くの Win32 API 関数名があります。今考えられる理由は何ですか?