問題タブ [systems-programming]

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.

0 投票する
1 に答える
210 参照

c - セグメンテーション違反: 構造体を変更しようとすると 11

char* パラメーターを構造体ポインターのデータ メンバーに格納しようとしています。しかし、それを行おうとすると、Segmentation Fault: 11 が表示されます。

name を current->name に保存しようとすると、エラーが発生します。助けてくれる人に感謝します!

0 投票する
0 に答える
478 参照

c++ - フラッシュ エミュレーション ライブラリ - メモリ書き込みアクセスのトラップ

NOR フラッシュのような動作をエミュレートするライブラリ (C++) を作成する必要があります。(プラットフォーム - Windows、言語 - C++) (非常に長い投稿で申し訳ありません。これまでに行ったことを説明しようとしています :) )

必要な動作:

ユーザーがフラッシュ メモリとして使用するメモリの範囲を返す必要があります。彼は返されたメモリ バッファから任意のバイトを読み取ることができるはずですが、これは問題ではありません。主な問題は書き込みです。フラッシュの書き込み動作が異なるため、アドレスがcontent (バイナリ) 10101010 で、ユーザーがそのアドレスに 01011001 を書き込もうとすると、その場所には実際には、書き込み後に 10101010 & 01011001 = 00001000 が含まれているはずです。これを行う方法がわかりません!

これらは私が考えているアプローチです:

データを複数回使用して複数回使用した後に分析できるようにするには、データをファイルとして内部的に保存する必要があるため、メモリをマップしたファイル IO を使用してメモリを返すことを計画しています。読み取りは問題ではありませんが、メモリ書き込みをトラップし、書き込む前に AND マスクを適用する方法がわかりません。

以下は私が考えたいくつかの方法です...

アプローチ 1:

公開されたポインターを読み取り専用としてマークすると、ユーザーはメモリから直接読み取りを行うことができますが、書き込みの場合は、メモリに書き込むための唯一のインターフェイスとなるインターフェイスを公開できます。インターフェースなので、マスキングを適用する要件を処理できます。

利点:

=>実装をシンプルに保ちます。

短所:

⇒書き込みに関するユーザ制限を設けて、モジュールの使い勝手を低下させています。

アプローチ 2:

すべての可能なメモリ アクセス演算子をオーバーロードするクラスを作成します。このようなもの

利点: => ここでも、実装が単純になります。

欠点: => ほとんどの書き込みケースを処理できますが、次のコード スニペットのような状況ではこれらを処理できません。

したがって、これも完全な解決策ではない可能性があり、実際には新しいコードで多くの問題が発生する可能性があります。

アプローチ 3:

3 番目のアプローチは、ページ保護を READ_ONLY に設定し、シグナル ハンドラー (Linux では mprotect と sigaction) を介して書き込み試行をトラップすることですが、現時点では書き込み呼び出しのみをトラップできますが、書き込み要求を完了するための情報を取得することはできません。 . 書き込み呼び出しをトラップし、マスクを適用した後にデータを書き込むことができるかどうかを調べます。これが可能であれば、完全な解決策になる可能性があります。

利点:

1) エミュレーターを使用するユーザーに変更を加えることなく、透過的に書き込み要求を処理できます。

これは完璧に見えますが、アクセス違反があったという割り込みしか取得できませんが、実際に書き込まれているデータを取得し、割り込みハンドラーに書き込む前にマスクを適用する方法がわかりません! (ただし、Linuxでこれを試しましたが、Windowsではこれを実行していません)

アプローチ 4:

メモリがマップされたIOを備えたエミュレートされたデバイスをいくつか用意すると、デバイスのメモリ範囲への書き込みがデバイスドライバーに送られ、それを使用して好きなことを行うことができます。

これは単なる考えです。これがまったくできるかどうかはわかりません。また、できたとしても、私の要件にはやり過ぎかもしれません。

アプローチ 4:

アプローチ 3 のように読み取りと書き込みを透過的にサポートするには、Windows に相当する Linux の FUSE フレームワークを使用できます (現在、DOKAN http://dokan-dev.net/en/と CBFS http://www.eldos. com/cbfs/ )。これを使用して、コードをファイルシステムとしてシステムに提示できます。すべての読み取りおよび書き込み呼び出しは、必要に応じてデータを操作できるユーザー空間のコードに転送されます。したがって、コードには 2 つの部分があり、

  1. flash_emulator クラスをアプリケーション ライター (現在持っているもの) に公開するライブラリ => これにより、作成したユーザー空間ファイルシステムでフラッシュ エミュレーション ファイルが開かれ、メモリ マップされた file-io が実行され、マップされたアドレスがに返されます。これを使用して、アプリケーション作成者は、ファイル システム アクション (読み取りおよび書き込み) に変換されるメモリ操作を実行できます。

  2. シンプルなユーザー空間ファイル システム。=>これにより、ユーザー空間ファイルシステムに必要な基本的な必須インターフェースが実装され、システムファイルシステムを内部的に使用して実際にファイルが保存されます。また、実装された読み取りおよび書き込み操作は、ディスクに保存されているデータにアクセスします。読み取りは現在のようにファイルから直接読み取りますが、書き込み操作はマスクを適用してファイル システムに書き込みます。

利点: => すべてのメモリ操作を透過的にサポートし、舞台裏でフラッシュのような動作をエミュレートできます。

欠点: => 使用する必要がある外部フレームワークが必要であり、これは私たちが作成するコードよりもはるかに大きくなります。(それらが無料のフレームワークであるかどうかを確認する必要があります。まだわかりません。無料でない場合は確認して戻ってきます)

透明なフラッシュのような書き込み特性を持つためだけにユーザー空間ファイルシステムを実装するのはやり過ぎかもしれませんが、アプリケーション ライターのコードに影響を与えずにそれを行うことがより重要である場合、これは可能性の 1 つに見えます。これについてあなたの見解を教えてください。ありがとうございました。

ありがとうございました、

マイクロカーネル

0 投票する
1 に答える
84 参照

c - 他の 2 つのプロセスとの通信プロセス

次のファイル (file.txt) を 1 行ずつ読み取ります。

親は負の数をプロセスに送信し、正の数を 2 番目のプロセスに送信します。

それぞれの息子が数えて、それを画面に表示します。

私が実行すると、それしかありません:

私も期待すると

0 投票する
3 に答える
11610 参照

c++ - sys / stat S_ISDIR(m)with struct dirent

ファイルがディレクトリ、リンク、または単なる通常のファイルであるかどうかを確認したいと思います。ディレクトリをループして、各ファイルをとして保存しますstruct dirent *。、、、またはに渡そうとしd_inoますが、ファイルに関係なく、肯定的な結果は得られません。だから私の質問は:私はどのように使用するのですか?S_ISDIR(m)S_ISLINK(m)S_ISREG(m)S_ISDIR(m)struct dirent

0 投票する
2 に答える
2033 参照

c - 親子プロセスの同期

親プロセスと子プロセスを同期させて、1 から 10 までを交互にファイルに出力したいと考えています。そして、どのプロセスが番号を出力したかを出力します。次のコードは代わりに出力しますが、同じ番号です。私を助けてください!

0 投票する
1 に答える
393 参照

reverse-engineering - エクスポートされたエイリアスシンボルがPDBファイルに存在しません(RegisterClipboardFormatの内部名はRegisterWindowMessageです)

user32にブレークポイントを設定しようとしています!RegisterClipboardFormat明らかに、この関数はエクスポートされます(link / dump / exports-すぐそこにあります)。MicrosoftシンボルサーバーからPDBファイルをダウンロードする前に、次の機能を見つけることができます。

問題はありません。これらの関数のいずれかを「bu」することができます。しかし、Microsoft PDBサーバーからPDBシンボルをダウンロードすると、次のようになります。

WinDBGはシンボルを見つけることができません。ただし、RegisterWindowMesssageを見つけることができます。

関数のアドレスが同じであることに注意してください(これはWindows 8の場合です)。以前のバージョンについてはわかりません。これは、オプティマイザまたはDEFファイル(EXPORTセクションのfunc1 = func2)でおそらく達成されます。'link / dump / exports'は、RegisterWindowMessageとRegisterClipboardFormatが同じRVAを持っていることを示しています。

問題は、私がこれにあまりにも多くの時間を費やしたことです。だから私の質問は:

  1. WinDBG内から、欠落しているエイリアスエクスポートシンボルを見つける簡単な方法はありますか。
  2. RegisterClipboardFormatWでのみ中断したいとします。正しく思い出せば、どこかにJMP命令があるはずです(呼び出し側モジュールのインポートテーブル内)。そのシンボルを見つけるにはどうすればよいですか?すべての呼び出しモジュールでこのエントリを見つける方法はありますか?
0 投票する
1 に答える
4607 参照

c - (ORIG_EAX * 4)ptrace呼び出し

私はここで記事を読んでいて、以下にコピーしたコードスニペットを試していました:-

ORIG_EAX正確に何が、なぜ4*ORIG_EAXptrace呼び出しに渡されるのかについて疑問があります。私は当初、、、などがレジスタの値が格納される特定の構造へのオフセットであると想定していORIG_EAXましたEBXECX

そこで、待機直後にORIG_EAXの値を使用して出力することにしましたprintf("origeax = %ld\n", ORIG_EAX);。値はでした11。したがって、オフセットに関する私の以前の仮定は間違っていました。

wait子の状態が変化すると(この場合はシステムコールが発行され)、コールが終了し、ORIG_EAXにシステムコール番号が含まれることを理解しています。

しかし、なぜORIG_EAX * 4がptrace呼び出しに渡されるのですか?

0 投票する
3 に答える
12747 参照

android - Androidの内部について学ぶ(システムを深く掘り下げる)

わかりました、みんな、それはすべて開発に関するものなので、質問をするのに適切な場所だと思います(私が間違っているか、重複した質問の場合は、教えてください)。

だから、私はAndroidを深く掘り下げて、システムがカーネルまでどのように機能するかを理解したいと思います(そして、root化やその他のハッキングの背後にあるものも学びたいです)。ここからどこへ行けばいいの?Linuxの本?VMアーキテクチャ?

ソースコードをダウンロードするだけでは、それがどのように機能するのか理解できないため、役に立ちませんでした。

0 投票する
1 に答える
37 参照

scripting - キーボード ボタンが Windows の画面にエコーするテキストを変更するには?

この背後にある考え方は、非常に頻繁に使用される文字列をエコーするためにキーの組み合わせを使用することです。shift+backspace が画面に「ありがとう」と表示される必要があるとします。どこから始めて、正確に何をすればよいかわかりません。プログラミング (C/C++/Java) の経験はありますが、スクリプトはまったくの初心者です。ヘルプやアドバイスをいただければ幸いです。前もって感謝します。

0 投票する
1 に答える
12602 参照

c - sigaction() を使用して、c

私は少し読んでいましたsigaction()(ソースはコースノートからのものです)が、このテキストを理解しているかどうかわかりません:

シグナル マスクは、シグナル ハンドラの期間中だけ計算され、インストールされます。

デフォルトでは、シグナルが発生すると、シグナル「sig」もブロックされます。

sigaction を使用して特定のシグナルに対してアクションがインストールされると、別のアクションが明示的に要求されるまでインストールされたままになります。

これは、シグナル ハンドラから戻った後にデフォルトのシグナル マスクが復元されるということですか? また、ハンドラーを使用した後にハンドラーを再インストールする必要がありsignal()ますか?

また、次のコードがあります。

それで - どのように正確SIGTERMに処理されますか? インストールされたハンドラは ですtermination handler()が、SIGTERMを使用せずにシグナル マスクに追加されていることがわかりsigprocmask()ます。これは何を意味するのでしょうか?ありがとう!

Ps 最後の質問: のifステートメントはなぜmain()ですか?