Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus
Wie man eine Seite des Speichers nicht zwischengespeichert
Im vorherigen Artikel habe ich gezeigt, wie Seiten aufgelistet.
Änderungen der Attribute ist keine große Aufgabe, aber es scheint nur auf Seiten des Speichers mit Schreibzugriff zu arbeiten. Ich habe entdeckt, nicht aber auf eine Speicherseite schreiben aktivieren, die als schreibgeschützt gekennzeichnet ist.
Dieser Code wird eine Schleife alle Speicherseiten, wenn sie eine ausführbare Seite mit Schreibzugriff findet, wird es legen Sie das NOCACHE Attribut, zwingt Windows nie zu dieser Speicherseite auslagern.
Warnung: falsche Werte schreiben kann einen Prozess plötzlich zum Absturz führen. Stellen Sie sicher, dass Sie nicht beschäftigt mit wichtigen Dokumenten auf Ihrem Computer sind während der Ausführung dieses Codes.
Wir verwenden die VirtualProtectEx-api, ändern Sie das Attribut.
procedure TForm1.Button1Click(Sender: TObject);
var i,l:integer;
pid:THandle;
meminfo:MEMORY_BASIC_INFORMATION;
memstart:pointer;
memsize:Integer;
newprotect, oldprotect: DWORD;
var s:String;
var lpMsgBuf : PCHAR;
begin
button1.enabled := false;
for i:=0 to 2000 do //
begin //PROCESS_QUERY_INFORMATION
pid:=OpenProcess (PROCESS_ALL_ACCESS{PROCESS_VM_OPERATION or PROCESS_QUERY_INFORMATION or PROCESS_VM_WRITE}, false, i*4);
if pid<>0 then
begin
memstart := 0;
l:=VirtualQueryEx (pid,
memstart,
MemInfo,
SizeOf(MEMORY_BASIC_INFORMATION));
while (l=SizeOf(MEMORY_BASIC_INFORMATION)) do
begin
Application.ProcessMessages;
if Application.Terminated then
break;
if meminfo.Protect = PAGE_EXECUTE_READ then
//make it readwrite:
newprotect := PAGE_EXECUTE_READWRITE
else
if 0<>(memInfo.Protect and (PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE)) then
newprotect := meminfo.Protect or PAGE_NOCACHE
else
newProtect := meminfo.Protect;
memstart := meminfo.BaseAddress;
memsize := meminfo.regionsize;
if (meminfo.state=MEM_COMMIT) and
((meminfo.protect<>newprotect)) and
((meminfo.protect and PAGE_GUARD)=0)// and
// ((meminfo.Type_9 and (mem_private or mem_mapped))=0)
then //allocated
begin
if not VirtualProtectEx (pid,
memstart,
memsize,
newprotect,
@oldprotect) then
begin
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, Nil, GetLastError, $00000400, (*LANG_NEUTRAL, SUBLANG_DEFAULT*) @lpMsgBuf, 0, Nil );
if lpMsgBuf <> Nil then
begin
// showmessage (lpMsgBuf);
LocalFree(Integer(lpMsgBuf));
end;
end
else
//;// showmessage ('ok');
memsize := memsize + 0;
sleep(2);
end;
integer(memstart):=integer(memstart)+memsize;
l:=VirtualQueryEx (pid,
memstart,
MemInfo,
SizeOf(MEMORY_BASIC_INFORMATION));
end;
closehandle (pid);
if Application.Terminated then
break;
end;
end;
button1.enabled := true;
end;
Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus
Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Wie man eine Seite des Speichers nicht zwischengespeichert
Im vorherigen Artikel habe ich gezeigt, wie Seiten aufgelistet.
Änderungen der Attribute ist keine große Aufgabe, aber es scheint nur auf Seiten des Speichers mit Schreibzugriff zu arbeiten. Ich habe entdeckt, nicht aber auf eine Speicherseite schreiben aktivieren, die als schreibgeschützt gekennzeichnet ist.
Dieser Code wird eine Schleife alle Speicherseiten, wenn sie eine ausführbare Seite mit Schreibzugriff findet, wird es legen Sie das NOCACHE Attribut, zwingt Windows nie zu dieser Speicherseite auslagern.
Warnung: falsche Werte schreiben kann einen Prozess plötzlich zum Absturz führen. Stellen Sie sicher, dass Sie nicht beschäftigt mit wichtigen Dokumenten auf Ihrem Computer sind während der Ausführung dieses Codes.
Wir verwenden die VirtualProtectEx-api, ändern Sie das Attribut.
procedure TForm1.Button1Click(Sender: TObject);
var i,l:integer;
pid:THandle;
meminfo:MEMORY_BASIC_INFORMATION;
memstart:pointer;
memsize:Integer;
newprotect, oldprotect: DWORD;
var s:String;
var lpMsgBuf : PCHAR;
begin
button1.enabled := false;
for i:=0 to 2000 do //
begin //PROCESS_QUERY_INFORMATION
pid:=OpenProcess (PROCESS_ALL_ACCESS{PROCESS_VM_OPERATION or PROCESS_QUERY_INFORMATION or PROCESS_VM_WRITE}, false, i*4);
if pid<>0 then
begin
memstart := 0;
l:=VirtualQueryEx (pid,
memstart,
MemInfo,
SizeOf(MEMORY_BASIC_INFORMATION));
while (l=SizeOf(MEMORY_BASIC_INFORMATION)) do
begin
Application.ProcessMessages;
if Application.Terminated then
break;
if meminfo.Protect = PAGE_EXECUTE_READ then
//make it readwrite:
newprotect := PAGE_EXECUTE_READWRITE
else
if 0<>(memInfo.Protect and (PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE)) then
newprotect := meminfo.Protect or PAGE_NOCACHE
else
newProtect := meminfo.Protect;
memstart := meminfo.BaseAddress;
memsize := meminfo.regionsize;
if (meminfo.state=MEM_COMMIT) and
((meminfo.protect<>newprotect)) and
((meminfo.protect and PAGE_GUARD)=0)// and
// ((meminfo.Type_9 and (mem_private or mem_mapped))=0)
then //allocated
begin
if not VirtualProtectEx (pid,
memstart,
memsize,
newprotect,
@oldprotect) then
begin
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, Nil, GetLastError, $00000400, (*LANG_NEUTRAL, SUBLANG_DEFAULT*) @lpMsgBuf, 0, Nil );
if lpMsgBuf <> Nil then
begin
// showmessage (lpMsgBuf);
LocalFree(Integer(lpMsgBuf));
end;
end
else
//;// showmessage ('ok');
memsize := memsize + 0;
sleep(2);
end;
integer(memstart):=integer(memstart)+memsize;
l:=VirtualQueryEx (pid,
memstart,
MemInfo,
SizeOf(MEMORY_BASIC_INFORMATION));
end;
closehandle (pid);
if Application.Terminated then
break;
end;
end;
button1.enabled := true;
end;
Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus
By Wiezutun
Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus : Mehreren tausend Tipps, um Ihr Leben einfacher machen.