問題タブ [virtualalloc]
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++ - virtualallocの問題
mainhashbuf、progression、virtualpointerはcharへのポインタです。最初にスペースを予約し、仮想ポインターがそのスペースを指すようにします。次に、他の2つのポインターを仮想ポインターに等しく設定します。次に、プログレッション(現在はリザーブスペースも指している)を使用してそのスペースのコミット(1 << 15)を行い、プログレッションポインターをインクリメントします。次に、mainhashbufがポイントする必要がある現在コミットされているスペースに値を設定しようとしますが、書き込み例外が発生します。virtualallocを間違って使用しているか、ポインターが実際にどのように機能するかについて間違った概念を持っていますか?
linux - VirtualAllocに似たメモリの領域を割り当てる方法は?
Windows の VirtualAlloc に似た Linux でメモリを割り当てる方法を探していました。要件は次のとおりです。
- 割り当てるメモリ ブロックのサイズは 2^16 です。
- メモリ ブロックのアドレスが 0x0000ffff より大きい
- メモリ ブロックのアドレスは、最後の 16 ビットがゼロでなければなりません。
Windows では、アプリケーション アドレス (lpMinimumApplicationAddress) の下限のため、(2) 明らかな権利があります。(1)、(2)、システムルールから、(3)も達成できました。
助けてくれてありがとう。
c++ - 新規/削除[] と VirtualAlloc
これは私のためにクラッシュします
VirtualAlloc が原因でこれがクラッシュしていることはわかっていますが、これを修正する方法がわかりません...
c++ - VirtualAlloc アドレス
以下のコードを書きます
ただし、VirtualAlloc は失敗し、ptr1、ptr2 の値は常に NULL です。アドレス 0x70000000,0x80000000 を使いたいです。これらのアドレスを使用する方法を知っている人はいますか?
c# - VirtualAlloc を使用してバイト配列からプログラムを実行していますか?
私は C# でアプリケーション SFX / プロテクターに取り組んでおり、リバース エンジニアリングをより困難にするために、保護されたアセンブリをハードディスクに書き込むのではなく、バイト配列から実行したいと考えています。
バイト配列 (有効なエントリ ポイントを持つ) 内にプログラムがあり、それを実行したいと考えています。このウェブサイトで、これを行うにはどうすればよいかという同様の質問を見つけました。これは、以下のコード スニペットを使用して実行できることを知っていますが、これを使用してバイト配列からプログラムを実行する方法を教えてもらえますか?
技術的には、彼は以下のコードで私にこれをさせてくれました:
この回答を実装して、バイト配列からプログラムを実行するにはどうすればよいですか。このコードで何ができるのか正確に理解できません。助けてください
これは私がこの答えを見つけたリンクです: Is it possible to execute an x86 assembly sequence from within C#?
どんな助けでも大歓迎です。
winapi - 大規模な配列で VirtualAlloc を使用してメモリを予約することとコミット + 予約することの利点
基本的に非常に大きな配列で動作する C++ プログラムを作成しています。Windows では、VirtualAlloc を使用してメモリを配列に割り当てています。これで、VirutalAlloc を使用してメモリを予約することとコミットすることの違いを完全に理解できました。ただし、メモリをページごとに予約領域にコミットすることに利点があるかどうかは疑問です。特に、MSDN ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx ) には、MEM_COMMIT オプションに関する次の説明が含まれています。
仮想アドレスが実際にアクセスされない限り、または実際にアクセスされるまで、実際の物理ページは割り当てられません。
私の実験では、これが確認されています。プロセスのメモリ使用量を増やすことなく、数 GB のメモリを予約してコミットできます (タスク マネージャーに表示されるように)。実際のメモリは、実際にメモリにアクセスしたときにのみ割り当てられます。
ここで、アドレス空間の大部分を予約してから、メモリをページごとに (またはアプリのロジックによってはより大きなブロックで) コミットする必要があると主張する例をかなり見てきました。ただし、上で説明したように、メモリはアクセスする前にコミットされているようには見えません。したがって、ページごとにメモリをコミットすることに実際の利点があるかどうか疑問に思っています。実際、メモリをページごとにコミットすると、実際にメモリをコミットするための多くのシステム コールが原因で、実際にはプログラムの速度が低下する可能性があります。領域全体を一度にコミットすると、システム コール 1 回分の料金が発生しますが、カーネルは、実際に使用するメモリのみを実際に割り当てるのに十分なほど賢いようです。
どちらの戦略が優れているかを誰かが説明してくれれば幸いです。
memory-management - 特定のアドレスでページをマッピングする
VirtualAllocを使用して仮想メモリページをマップしようとしていますが、これは8TBのWindows 7 64ビット許容範囲外の特定のアドレスです。WindowsInternalsの本で読んだことがありますが、このアドレス範囲は「ページテーブルの自己マッピング構造」に使用されます。 、0x7ffffffff000アドレスでメモリページをマップする方法はありますか?
c++ - Windows でのヒープ破損エラーの即時検出。どのように?
眠れません!:)
Windows でかなり大きなプロジェクトを実行しており、ヒープ破損の問題が発生しました。この素敵なトピックを含むすべての SO を読みました:ヒープ破損エラーをデバッグするには? 、しかし、すぐに使用できるものは何もありませんでした。Debug CRT
ヒープのBoundsChecker
破損が検出されましたが、アドレスは常に異なり、検出ポイントは常に実際のメモリの上書きから遠く離れていました。私は真夜中まで寝ていなかったので、次のハックを作成しました。
いくつかのヒープ破損エラーが明らかになり、修正することができました。終了時に Debug CRT 警告が表示されなくなりました。ただし、このハックに関していくつか質問があります。
1.誤検知を引き起こす可能性はありますか?
2.ヒープの破損を見逃すことはありますか? (malloc/realloc/free を置き換えても?)
3. 32 ビットでは実行できOUT_OF_MEMORY
ず、64 ビットでのみ実行されます。32ビットの仮想アドレス空間を使い果たしただけでいいのでしょうか?
c - VirtualQueryEx を使用してリモート プロセスでモジュールを列挙しても、すべてのモジュールが返されない
特定のプロセスが使用している DLL のリストを取得しようとしています。VirtualQueryEx を使用してそれを達成しようとしています。私の問題は、DLL のすべてではなく部分的なリストだけが返されることです (プロセス エクスプローラーを使用するか、指定されたプロセスで VirtualQuery を使用してリストを表示できます)。
コードは次のとおりです。
で結果を取得していszBuf
ます。
この関数は DLL ファイルの一部であるため、デバッグが困難です。
現在、DLL は x64 バイナリとしてコンパイルされており、x64 プロセスに対して使用しています。
PS私はEnumProcessModulesについて知っていますが、理由でそれを使用していません(長すぎます:)。
windows - コード領域の32ビット変位内の実行可能メモリ
64ビットWindows上のC++でJITコンパイラを作成すると、生成されたコードは、C++で作成されたランタイム関数を呼び出す必要がある場合があります。現時点では、生成されたコードを配置するためのメモリを割り当てていVirtualAlloc(0, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
ます。割り当てられたメモリは他の方法では実行できないため、最後のフラグは重要です。
VirtualAlloc
おそらく64ビットアドレス空間のどこにでもメモリを返すことができます。これはデータには問題ありませんが(一般に4ギガバイト以上が必要になるため、64ビットアドレス指定が必要です)、x64call
命令の最も効率的な形式です。 32ビットのIP相対オフセットが必要であり、生成されるコードの量は4ギガバイト未満になるため、C++からコンパイルされたコードの32ビットの変位内に配置することが望ましいでしょう。
これを手配する方法はありますか?