ProtectedMemory Delphi
1.0.0
通過保護內存區域免於訪問並確保不再需要時清除數據,從而保護敏感數據或進程訪問者。

保護敏感信息(例如加密密鑰,密碼和其他機密數據)至關重要,免受未經授權的訪問。如果沒有適當的內存保護,即使在存儲器中暫時存儲敏感數據也可能容易受到內存轉儲或過程注入等攻擊。該單元有助於鎖定和保護內存,確保在不再需要時屏蔽敏感數據並牢固地刪除。
ProtectedMemory單元”到您的Delphi項目。ProtectMemory , UnProtectMemory和ReleaseProtectedMemory過程來保護您的內存。ReleaseAllProtectedMemory在使用後釋放和清除內存。TProtectedStream類TProtectedStream類,並從TMemoryStream繼承。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() :釋放並清除所有受保護的內存區域。
Shadi Ajam
是的!我們希望您的支持!請給它嗎?並與他人分享。
在社交媒體上分享: