メモリ領域をアクセスから保護し、不要になったときにデータがクリアされていることを確認することにより、ハッカーまたはプロセスのデバッガーからの機密データを保護します。

不正アクセスから、暗号化キー、パスワード、その他の機密データなどの機密情報を保護することが重要です。適切なメモリ保護がなければ、メモリに一時的に保存された機密データでさえ、メモリダンプやプロセスインジェクションなどの攻撃に対して脆弱です。このユニットは、メモリをロックおよび保護するのに役立ち、機密データがシールドされ、不要になったときに安全に消去されるようにします。
ProtectedMemoryユニットをDelphiプロジェクトにダウンロードします。ProtectMemory 、 UnProtectMemory 、およびReleaseProtectedMemory手順を使用して、メモリを保護します。ReleaseAllProtectedMemoryを呼び出して使用して、使用後にメモリが解放され、クリアされていることを確認してください。TProtectedStreamクラスを追加しましたTMemoryStreamから継承する新しいTProtectedStreamクラスが追加されました。VirtualAllocを使用し、 VirtualProtectを使用してメモリを保護および解除します。IsProtectedプロパティを使用すると、保護された(アクセスなし)と保護されていない(読み取り/書き込み)状態を切り替えることができます。 uses
ProtectedMemory;
var
Data: array [ 0 .. 255 ] of Byte;
DataPtr: Pointer;
begin
Data[ 0 ] := 99 ;
Data[ 1 ] := 11 ;
Data[ 2 ] := 22 ;
Data[ 3 ] := 33 ;
Data[ 4 ] := 44 ;
Data[ 5 ] := 55 ;
DataPtr := @Data[ 0 ];
// Protect the memory (prevents access to the memory region)
ProtectMemory(DataPtr, SizeOf(Data));
// Accessing the protected memory here will return zeros.
// Unprotect the memory before accessing it
UnProtectMemory(DataPtr);
// Optionally release the memory and clear its content
ReleaseProtectedMemory(DataPtr);
end ; uses
ProtectedMemory;
var
SensitiveStr: string;
NonSensitiveStr: string;
DataPtr: Pointer;
begin
SensitiveStr := ' Sensitive Data ' ;
NonSensitiveStr := ' Not Sensitive Data ' ;
// Get a pointer to SensitiveStr's memory
DataPtr := Pointer(SensitiveStr);
// Protect the memory region containing SensitiveStr
Writeln( ' Protecting memory... ' );
ProtectMemory(DataPtr, Length(SensitiveStr) * SizeOf(Char));
// Accessing SensitiveStr here will return zeros or show undefined behavior
Writeln( ' SensitiveStr after protection: ' , SensitiveStr);
// You can still access NonSensitiveStr, which is unaffected
NonSensitiveStr := ' Updated Non-Sensitive Data ' ;
Writeln( ' NonSensitiveStr: ' , NonSensitiveStr);
// UnProtect Memory it's reutrn it's orginal data
Writeln( ' Releasing memory... ' );
UnProtectMemory(DataPtr);
// SensitiveStr is now restored
Writeln( ' Restored SensitiveStr: ' , SensitiveStr);
end ; uses
ProtectedStream;
var
Stream: TProtectedStream;
Data: AnsiString;
Buffer: array [ 0 .. 255 ] of Byte;
begin
Data := ' Sensitive Data ' ;
Stream := TProtectedStream.Create;
try
Stream.Write(PAnsiChar(Data)^, Length(Data));
Data := ' ' ;
Stream.IsProtected := True; // Protect the memory
// Unprotect to read
Stream.IsProtected := False;
Stream.Read(Buffer, 10 );
finally
Stream.Free;
end ;
end ;ProtectMemory(var DataPtr: Pointer; Size: NativeUInt) :指定されたメモリ領域をPAGE_NOACCESSに設定し、ページングを防ぐためにロックすることにより保護します。データは新しい保護されたメモリブロックにコピーされ、元のポインターが更新され、この保護されたブロックが指されます。
UnProtectMemory(DataPtr: Pointer) :メモリ保護をPAGE_READWRITEに復元し、保護されたメモリブロックのリストから領域を削除します。
ReleaseProtectedMemory(DataPtr: Pointer) :メモリアクセスを復元し、メモリを安全にゼロにすることでコンテンツをクリアし、保護されたリストから削除します。
ReleaseAllProtectedMemory() :保護されたすべてのメモリ領域を解放およびクリアします。
シャディ・アジャム
はい!私たちはあなたのサポートが大好きです!与えてください?そして、それを他の人と共有します。
ソーシャルメディアで共有: