問題タブ [virtualquery]
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
)
virtualquery - VirtualQuery は不正な結果を返します。バグですか?
私のコード:
結果:
ノート:
(1) AllocationBase が NULL で、BaseAddress が NULL でない
(2) AllocationProtect が 0 (保護値ではない)
VirtualQueryのバグですか?
c++ - Win API VirtualQueryEx 関数、ERROR_BAD_LENGTH
こんにちは、VirtualQueryEx 関数を呼び出してメモリ保護に関する情報を取得しようとしましたが、コードでエラー 0x18 (ERROR_BAD_LENGTH) が表示され、コードの問題点がわかりません。
コードスニペット:
PMEMORY_BASIC_INFORMATION アルテ;
VirtualQueryEx(processhandle,(LPVOID) (アドレス),alte,sizeof(PMEMORY_BASIC_INFORMATION));
ご協力いただきありがとうございます
c++ - VirtualProtectにはページの先頭のアドレスが必要ですか?
VirtualProtectを使用する必要があります。質問は、関数に渡される領域のアドレスについてです。(MSDNで)「開始ページを説明するアドレス」と表示されていますが、ページの先頭のアドレスである必要がありますか、それともそのページの任意のアドレスである可能性がありますか?つまり、最初にVirtualQueryを使用してページの開始アドレスを決定する必要がありますか?
c++ - プロセス メモリをスキャンするとクラッシュする
私は自分の DLL をプロセスに注入し、自分と同じ値のアドレスをメモリでスキャンしようとしましたが、最初のアドレスを取得した後にクラッシュが発生しました。10 個のアドレスである必要があります。
私の保護チェックは間違っていると思いますが、よくわかりません。
windows - _MEMORY_BASIC_INFORMATION 構造の BaseAddress と AllocationBase および AllocationProtect と Protect の違いは何ですか?
_MEMORY_BASIC_INFORMATION
アドレス空間を記述するフィールドが含まれています。BaseAddress
と Aの違いを知りたいですllocationBase
。 BaseAddress
は地域のベースアドレスで、? とは何AllocationBase
ですか?
AllocationProtect
また、との違いも知りたいですProtect
。少しはわかりますAllocationProtect
が、 はリージョンを予約するときの保護属性、 はパラメータProtect
で呼び出すときの保護属性だと思います。もしそうなら、リージョンを予約するときのフィールドは何ですか?VirtualAlloc
MEM_COMMIT
Protect
windows - 異なる地域は同じ割り当てアドレスを持っています
Windows 7 のプロセスのアドレス空間を調べます。VirtualQueryEx
関数を使用します。これは私の例handleOfProcess_
の一部です。プロセスのハンドルは次のとおりです。
デバッグを行うと、AllocationBase
0x00020000が0x00020000であり、Allocationbase
0x00021000が0x00000000であることがわかります。これはallocationBase
別の領域です。
どうすれば起こりますか?
ありがとうございます。
android - VirtualQueryEx が 000000000 配列全体を返す
プロセスのメモリ内で値 (さらには値のパターン) を検索するのに苦労しています。このプロセスは「VBoxHeadless」プロセスです (通常の VM プロセスと同様ですが、必要に応じてリモートで実行できる GUI はありません)。Android エミュレータの Andy によって作成されました。
プロセスからハンドルを取得できますが、VirtualQueryEx を使用すると取得できるのは適切な長さの配列だけですが、値は '00000000000' のみです。
この情報にアクセスするためにさまざまな方法を試しましたが、結果は同じです。
何か案が?
c++ - VirtualQuery によって返された空き領域で VirtualAlloc を実行できない
Windows アプリケーション内にロードされる DLL のメモリ範囲内で一定量のメモリを割り当てようとしています。
私が行っている方法はVirtualQuery()
、空きとしてマークされ、割り当てを行う必要がある境界内にあるメモリ領域を検索するために使用しています。私が見ているのは、領域がマークされているにもかかわらずMEM_FREE
VirtualAlloc()
、メモリの割り当てに失敗することがあるということです。
コードは次のコードに非常に近いです。
VirtualAlloc()
失敗したらGetLastError()
リターンERROR_INVALID_ADDRESS
(487).
私がこれを回避した方法は、それが十分に大きい場合は、mbi.RegionSize
ページ サイズのステップを使用してスキャンし、必要なメモリを割り当てることができるアドレスを見つけることです。
VirtualQuery
領域全体が解放され、必要なアドレス内に割り当てることができるはずですが、通常、最初のアドレスがVirtualAlloc
失敗すると、最終的に成功するまでいくつかのステップをループする必要があるのはなぜですか。