Если иметь права админа, то можно юзать секцию PhysicalMemory, с помощью которой можно получить доступ к физической памяти... Вот небольшой примерчик:
| Код | uses JwaWinType, JwaWinBase, JwaWinNT, JwaAclApi, JwaAccCtrl;
const PhysMemDevName = '\Device\PhysicalMemory';
PhysMemName : UNICODE_STRING = ( Length : Length(PhysMemDevName) * SizeOf(WideChar); MaximumLength : Length(PhysMemDevName) * SizeOf(WideChar); Buffer : PhysMemDevName; );
PhysMemAttr : TObjectAttributes = ( Length : SizeOf(PhysMemAttr); RootDirectory : 0; ObjectName : @PhysMemName; Attributes : OBJ_CASE_INSENSITIVE; SecurityDescriptor : nil; SecurityQualityOfService : nil; );
FullAccess : EXPLICIT_ACCESS = ( grfAccessPermissions : SECTION_ALL_ACCESS; grfAccessMode : GRANT_ACCESS; grfInheritance : NO_INHERITANCE; Trustee : ( pMultipleTrustee : nil; MultipleTrusteeOperation : NO_MULTIPLE_TRUSTEE; TrusteeForm : TRUSTEE_IS_NAME; TrusteeType : TRUSTEE_IS_USER; ptstrName : 'CURRENT_USER'; ); );
function NtOpenSection(SectionHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtOpenSection';
procedure TForm1.FormCreate(Sender: TObject); var hSection : THandle; MappedAddress : Pointer; Adr : PByte; PhysicalAddress, MemorySize : Int64; Size : DWORD; SectionAcl : PACL; Errors : integer; i : integer; b1, b2, b3 : byte;
begin // разрешаем полный доступ к секции NtOpenSection (@hSection, WRITE_DAC, @PhysMemAttr); SetEntriesInAcl (1, @FullAccess, nil, SectionAcl); SetSecurityInfo (hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, SectionAcl, nil); CloseHandle (hSection); LocalFree (Cardinal(SectionAcl));
// открываем секцию на чтение и запись NtOpenSection (@hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, @PhysMemAttr);
PhysicalAddress := 0; // Физ. адрес начала сканирования MemorySize := 1*1024*1024; // Размер проверяемой памяти (1 мегабайт) Size := 4096; // Размер отображаемой области (1 страница) Errors := 0; // Кол-во ошибок
repeat // Проецируем физ. область памяти в виртуальное пространство процесса MappedAddress := MapViewOfFile(hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, PhysicalAddress shr 32, Cardinal(PhysicalAddress), Size);
Sleep (0); Adr := MappedAddress; for i := 0 to Size-1 do begin b1 := Adr^; // читаем байт Adr^ := b1 xor $FF; // записываем инвертированное значение b2 := Adr^; // читаем байт Adr^ := b1; // записываем исходный байт b3 := Adr^; // читаем байт
if (b1 <> b3) or (b2 <> (b1 xor $FF)) then Inc(Errors); Inc (Adr); end;
UnmapViewOfFile (MappedAddress); Inc (PhysicalAddress, Size); until PhysicalAddress >= MemorySize;
CloseHandle (hSection);
ShowMessage ('Обнаружено ошибок: ' + IntToStr(Errors)); end;
|
Мне не охото было выдирать определения типов и констант... Поэтому скачай Jedi WinAPI... |