問題タブ [mprotect]
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 - メモリ保護を把握するために /proc/self/maps を解析するよりも良い方法はありますか?
Linux (または Solaris) では/proc/self/maps
、メモリ内の 1 つ以上のアドレスに格納されているものを読み取り、書き込み、または実行できるかどうかを判断するために、手動で繰り返し解析するよりも良い方法はありますか?
たとえば、Windows ではVirtualQuery
.
Linux では、mprotect
これらの値を変更できますが、読み戻すことはできません。
さらに、これらのアクセス許可がいつ変更されたかを知る方法はありますか (たとえば、誰かがmmap
私の背後にあるファイルを使用したとき)、非常に侵襲的なことを行いptrace
、プロセス内のすべてのスレッドで使用しsyscall
、メモリに影響を与える可能性のある.地図?
アップデート:
残念ながら、私はこれを JIT 内で使用しています。この JIT は、実行中のコードに関する情報がほとんどなく、定数の近似値を取得しています。はい、Linux で使用される vsyscall ページのように、変更可能なデータの定数マップを保持できることを認識しています。最初の解析に含まれていないものは変更可能で危険であるという仮定に安全に戻ることができますが、そのオプションに完全に満足しているわけではありません。
今私がしていることは/proc/self/maps
、特定のアドレスの保護をバイナリ検索できる構造を読んで構築することです。私の構造にないページについて何かを知る必要があるときはいつでも /proc/self/maps 、それがその間に追加されていると仮定して読み直します。
テキストを解析してこの情報を取得し、それがいつ変更されるかを知らないのは、非常に厄介なようです。(/dev/inotify
のほとんど何も動作しません/proc
)
c - OS X Tiger の mprotect API
私は MacOSX 10.4 (tiger) で mprotect API を使用しようとしています。私が知っているすべての方法を試してみましたが、書き込み許可を追加しようとしているときに「許可が拒否されました」を意味する errno 13 で常に -1 が返されます。いくつかの実行可能コード。
同じコードが MacOS X 10.5 (ヒョウ) でも正確に機能します。
コードはかなり単純です
ここで、pFunc は、プロセスのアドレス空間にロードされた関数のアドレスです。PROT_WRITE アクセス権を追加する前に PROT_EXEC を削除しようとしましたが、うまくいきませんでした。また、pFuncをメモリページサイズに合わせてみましたが、運もありません..
これを機能させる方法はありますか?
c - mprotect 関数が 5 つの引数で呼び出されるのはなぜですか?
mprotectの Linux man ページによると、関数には 3 つの引数があります。
しかし、私が分析しているプログラムで ltrace を実行しているときに、mprotect が次のように呼び出されていることがわかります。
4番目と5番目の引数は何ですか?
ltrace バージョン 0.5 を使用しています。およびカーネル 2.6.24-24-generic
c - ファイルから MachineCode をメモリにロードし、C で実行 -- mprotect が失敗する
こんにちは、生のマシンコードをメモリにロードしてCプログラム内から実行しようとしています.現在、プログラムを実行すると、メモリでmprotectを実行して実行可能にしようとすると壊れます. また、メモリが正しく設定された場合に実行されるかどうかも完全にはわかりません。現在、これを Ubuntu Linux x86 で実行しています (問題は Ubuntu の過保護にあるのでしょうか?)
私が現在持っているものは次のとおりです。
コンパイラの警告が表示されます:
プログラムがこのコードに到達していないので、アセンブラ コードが正常に動作しているかどうかを確認できません。
c - SIGSEGVをキャッチするシグナルハンドラーを作成するにはどうすればよいですか?
SIGSEGVをキャッチするためのシグナルハンドラーを作成したいと思います。を使用して読み取りまたは書き込み用にメモリのブロックを保護します
これにより、バッファから始まるページサイズのメモリバイトが読み取りまたは書き込みから保護されます。
第二に、私は記憶を読み込もうとします:
これによりSIGSEGVが生成され、ハンドラーが呼び出されます。ここまでは順調ですね。私の問題は、ハンドラーが呼び出されたら、次のようにしてメモリのアクセス書き込みを変更したいということです。
そして私のコードの通常の機能を継続します。関数を終了したくありません。同じメモリへの今後の書き込みで、信号を再度キャッチし、書き込み権限を変更してから、そのイベントを記録したいと思います。
コードは次のとおりです。
問題は、シグナルハンドラーのみが実行され、シグナルをキャッチした後、メイン関数に戻れないことです。
signals - CSIGSEGVハンドラーとMprotect
mprotect()を使用して、メモリのブロックへのアクセスを制限するプログラムを作成しています。メモリが要求されると、signal()呼び出しを使用してリッスンするSIGSEGVがスローされます。
SIGSEGVが検出されたら、要求された(障害をスローした)メモリへのポインタと要求されたセグメントのサイズに何らかの方法でアクセスする必要があります。これは可能ですか?
さらに、メモリのブロックが現在割り当てられているmprotect()のレベル(PROT_NONE、PROT_READなど)を判別する方法はありますか?
linux - mprotect は ARM Linux で命令キャッシュをフラッシュしますか?
自己変更コードを含む命令セットを実行する ARM Linux で JIT を作成しています。命令セットには、キャッシュ フラッシュ命令がありません (その点では x86 に似ています)。
コードをページに書き込んでそのページを呼び出しmprotect
た場合、命令キャッシュを無効にするのに十分ですか? cacheflush
それとも、それらのページでシステムコールも使用する必要がありますか?
linux - Linuxプロセスのアドレス空間のすべてのページを書き込み禁止にすることはできますか?
Linuxプロセスのアドレス空間内のすべてのページを(プロセス自体の内部から)書き込み保護する方法があるかどうか疑問に思っています
mprotect()
。「すべてのページ」とは、実際には、ユーザーモードで実行されている通常のプログラムによって書き込まれる可能性のあるプロセスのアドレス空間のすべてのページを意味します。つまり、プログラムテキスト、定数、グローバル、およびヒープですが、私は定数、グローバル、ヒープだけで満足するでしょう。スタックを書き込み保護したくない-それは悪い考えのようです。
1つの問題は、書き込み保護メモリをどこから始めればよいかわからないことです。特定のpidで使用されているメモリのセクションを示すを見ると/proc/pid/maps
、それらは常にアドレス
0x08048000
とプログラムテキストで始まっているように見えます。(Linuxでは、私が知る限り、プロセスのメモリは、下部にプログラムテキストがあり、その上に定数があり、次にグローバル、次にヒープ、そしてサイズに応じてさまざまなサイズの空きスペースが配置されています。ヒープまたはスタックの先頭に移動し、スタックが仮想アドレスのメモリの先頭から下に向かって成長します0xffffffff
。)ヒープの先頭がどこにあるかを確認する方法があります(を呼び出すとsbrk(0)
、現在の「ブレーク」へのポインタが返されます。つまり、ヒープの最上部)ですが、実際にはヒープがどこから始まるかを知る方法ではありません。
休憩まですべてのページを保護しようとすると0x08048000
、最終的にmprotect: Cannot allocate memory
エラーが発生します。とにかくなぜメモリを割り当てるのかわかりませんmprotect
-そしてGoogleはあまり役に立ちません。何か案は?
ちなみに、これをやりたいのは、プログラムの実行中に書き込まれるすべてのページのリストを作成したいからです。これを行うために考えられる方法は、すべてを書き込み保護することです。ページを作成し、書き込みを試行すると書き込み障害が発生するようにしてから、ページをリストに追加して書き込み保護を削除する書き込み障害ハンドラーを実装します。保護するページとその方法を理解できれば、ハンドラーの実装方法を知っていると思います。
ありがとう!
iphone - iPhone アプリケーションが Mprotect 失敗エラーでクラッシュする (MonoTouch)
MonoTouch で開発した iPhone アプリケーションに問題があります。
WCF サービスに接続するアプリケーションを開発しています。WCF サービスが応答すると、返されたデータで UITableView を更新します。これが完了すると、新しい WCF 非同期呼び出しが送信され、応答するとテーブルが再び更新されます。等々。
問題は、一定時間内にこれを実行すると、Mprotect failed エラー 12 でクラッシュすることです。これは、アプリケーションがシミュレーターではなく電話で直接実行されている場合にのみ発生します。
テーブルの更新が行われる場所をコメントアウトして、WCF サービスに次の非同期要求を送信する前に Thread.Sleep(1000) を作成しようとしましたが、それでも同じエラーが発生しますが、失敗することなく長く実行できます。
SlSvcUtil.exe /noConfig http://mydomain/myservice.svcによって生成された「プロキシ」ファイルを介して WCF サービスに接続します。
私の質問は、このエラーを何らかの方法で回避できるか、または回避策で回避できるかということです。それは私のせいですか、それともバグですか?実際には、最終的な学校のプロジェクトでアプリケーションを使用するためです。修正できればいいのですが。
コンソール出力とクラッシュ レポートの一部を投稿しますが、さらに情報が必要な場合はお知らせください。投稿します。私はMonoまたはMonoTouch環境を使用するのが初めてなので、詳細な回答が必要です.
コンソール出力:
クラッシュレポート:
iphone - MProtect Errno 12(ENOMEM)の説明
Monotouchを使用してiPhoneアプリケーションを作成していますが、最近アプリがクラッシュし始めました。
続いて、かなり長いスタックトレースと、「アプリケーションがシグナル6で異常終了した」ことを通知するSpringboardが続きます。
私は、アプリがiPhoneで利用可能なすべてのメモリを使い果たしたと述べているこの質問を読みました。いくつかの一般的な廃棄パターンをアプリに適用し、通常、重いオブジェクトはできるだけ早く廃棄しました。これは、アプリがより少ないメモリを使用して実行されることを意味します。ただし、MProtectに失敗したというメッセージが表示されます。
また、機器の下でアプリを実行しているときに、機器がデバイスで使用できる空きメモリが十分にあることを報告していることにも注意してください(約40MB)。
私はそれを正しく理解していないと思うので、誰かがMProtectとこの失敗を説明できるかどうか疑問に思いました。