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

Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Wie verhindern, dass eine Speicherseite Zwischenspeichern heraus
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung