Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi vergleichen von zwei librarys im speicher (https://www.delphipraxis.net/46886-vergleichen-von-zwei-librarys-im-speicher.html)

Arnulf 2. Jun 2005 13:27


vergleichen von zwei librarys im speicher
 
Hallo
Ich würde gerne überprüfen ob eine geladene library in einem fremden prozess anders ist als diejenige die im system32 ordner liegt.

Ich denke mal man wird die beiden mit comparemem vergleichen.
Die erste frage dazu ist wie bekomm ich die .dll in einem fremden prozess eingelesen.
Genauer wie finde ich die speicheradresse - einlesen wird man wohl mit ReadProcessMemory?

Arnulf

barf00s 2. Jun 2005 13:36

Re: vergleichen von zwei librarys im speicher
 
könnte man sich nicht viel einfacher einfach alle geladenen module (dlls) eines prozesses holen, sowie deren pfade, und diese dann sparat mitnem memorystream laden und dann so mit

if CompareMem(MemStreamFuerDll1.Memory, MemStreamFuerDll2.Memory) <> 0 then
...

prüfen?
:gruebel:

Robert Marquardt 2. Jun 2005 13:50

Re: vergleichen von zwei librarys im speicher
 
Wenn man die Pfade hat, dann muss man doch nur noch diese vergleichen.

Arnulf 2. Jun 2005 14:36

Re: vergleichen von zwei librarys im speicher
 
also irgendwer versteht hier irgendwen nicht :)

ich will eine .dll die ein prozess geladen hat - in dem fall mein spiel das die opengl32.dll library geladen hat mit derjenigen vergleichen die vom spiel geladen wurde.
also einmal die im speicher und einmal die auf der festplatte - und die dürfen sich einfach nicht unterscheiden.
auch die eisprungtabellen sollten überprüft werden ...

und ich hab einfach keinen dunst wie man das machen soll.

Arnulf

Robert Marquardt 2. Jun 2005 14:51

Re: vergleichen von zwei librarys im speicher
 
Wenn du den Pfad der geladenen DLLs herausbekommen hast, dann kaeme nur noch In-Memory Patching in Frage fuer Veraenderungen.
Das lohnt aber nicht wirklich. Da ist es einfacher die Funktionen gleich ins Programm einzubauen.
Die Datensegmente der DLLs unterscheiden sich sowieso, da es zwar die gleichen DLLs sind (Codesegment gleich), aber die Zustaende sind unterschiedlich.

Sag mal was du erreichen willst. Anti-Cheating-Tool?

Arnulf 2. Jun 2005 15:10

Re: vergleichen von zwei librarys im speicher
 
Zitat:

Sag mal was du erreichen willst. Anti-Cheating-Tool?
ganz genau - ein anticheat tool :)

klar unterscheiden sich die datensegmente.
aber ich denke das codesegment zu überprüfen reicht ja wohl.
wenn hier irgendwer eine funktion hookt dann muß er doch mindestens einen jump machen und da reichts mir wenn ich das codesegment überprüfen kann.
nur wie ist die gretchenfrage :)

Arnulf

barf00s 2. Jun 2005 15:12

Re: vergleichen von zwei librarys im speicher
 
warum lädst du nicht die module und vergleichst deren inhalt?
oder muss es >unbegingt< so kompliziert sein? </dummfrag>

brechi 2. Jun 2005 15:27

Re: vergleichen von zwei librarys im speicher
 
zusäzlich zu

http://www.delphipraxis.net/internal...ct.php?t=55308

noch nen bisl code
wenn ich gleich noch zeit habe kann ich dir noch die CompareExecuteSection machen aber da haste jedenfalls schonmal die beiden dll im speicher (die originale und die von dem spiel)

Delphi-Quellcode:
procedure IsCorrectExecuteSection(dlln,processname: string);
  function CompareExecuteSections(p1,p2: pointer): boolean;
  begin
    result := true;
  end;
var h1,h2, pr, dllprocsize: integer;
    read: cardinal;
    buf, buf2: pointer;
begin
  pr := uallProcess.FindProcess(processname);
  if pr = 0 then
    messagebox(0,'process not loaded',nil,0) else
  begin
    h1 := LoadLibrary(pchar(dlln));
    if h1 = 0 then
      messagebox(0,'cant load dll',nil,0) else
    begin
      h2 := uallProcess.GetModuleOffset(dlln,pr);
      if h2 = 0 then
        MessageBox(0,'dll in process not found',nil,0) else
      begin
        buf := VirtualAlloc(nil,$1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        pr := OpenProcess(PROCESS_ALL_ACCESS,false,pr);
        ReadProcessMemory(pr,pointer(h2),buf,$1000,read);
        dllprocsize := uallUtil.GetModuleVirtualSize(integer(buf));
        if uallUtil.GetModuleVirtualSize(h1) <> dllprocsize then
          MessageBox(0,'other dll loaded',nil,0) else
        begin
          buf2 := VirtualAlloc(nil,dllprocsize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
          if CompareExecuteSections(pointer(h1),buf2) then
            MessageBox(0,'ok',nil,0) else
            MessageBox(0,'execute sections not same',nil,0);
          VirtualFree(buf2,dllprocsize,MEM_DECOMMIT);
        end;
        VirtualFree(buf,$1000,MEM_DECOMMIT);
      end;
    end;
    FreeLibrary(h1);
  end;
end;

brechi 2. Jun 2005 15:58

Re: vergleichen von zwei librarys im speicher
 
Delphi-Quellcode:

procedure IsCorrectExecuteSection(dlln,processname: string);
  function CompareSection(p1,p2: pointer; orig1, orig2: integer; size: integer): boolean;
  var i, err: integer;
  begin
    result := true;
    for i := 0 to size-1 do
      pbyte(integer(p2)+i)^ := pbyte(integer(p2)+i)^-pbyte(integer(p1)+i)^;
    err := 0;

    for i := 0 to size-1 do
      if pbyte(integer(p2)+i)^ <> 0 then
        inc(err);
    if err > 4 then  // error konstante, 4 bytes sind immer unterschiedlich in der openglcode section
      result := false;
                      // einbau unterschiedlichen dllbasen noch nicht eingebaut
                      // aber durch orig1,orig2 möglich
  end;

  function CompareExecuteSections(p1,p2: pointer; orig1,orig2: integer): boolean;
  var IDH1, IDH2: PImageDosHeader;
      INH1, INH2: PImageNtHeaders;
      sectionh1, sectionh2: PImageSectionHeader;
      seca1, seca2, i: integer;
  begin
    result := true;
    IDH1 := p1;
    IDH2 := p2;
    if (IDH1^.e_magic = IMAGE_DOS_SIGNATURE) and (IDH2^.e_magic = IMAGE_DOS_SIGNATURE) then
    begin
      INH1 := pointer(integer(p1)+integer(IDH1^._lfanew));
      INH2 := pointer(integer(p2)+integer(IDH2^._lfanew));
      if (INH1^.Signature = IMAGE_NT_SIGNATURE) and (INH2^.Signature = IMAGE_NT_SIGNATURE) then
      begin
        seca1 := INH1^.FileHeader.NumberOfSections;
        seca2 := INH2^.FileHeader.NumberOfSections;
        if (seca1 <> seca2) then
          MessageBox(0,'sectioncount is not correct',nil,0) else
        begin
          for i := 0 to seca1-1 do
          begin
            sectionh1 := pointer(pointer(integer(INH1)+integer(sizeof(TImageNtHeaders))+i*sizeof(TImageSectionHeader)));
            sectionh2 := pointer(pointer(integer(INH2)+integer(sizeof(TImageNtHeaders))+i*sizeof(TImageSectionHeader)));
            if (sectionh1^.VirtualAddress <> sectionh2^.VirtualAddress) then
              MessageBox(0,'section pointer is not correct',nil,0) else
            if (sectionh2^.Misc.VirtualSize <> sectionh2^.Misc.VirtualSize) then
              MessageBox(0,'section size is not correct',nil,0) else
            begin
              if (sectionh1^.Characteristics and $20000000) = $20000000 then
              if CompareSection(pointer(integer(p1)+integer(sectionh1^.VirtualAddress)),
                               pointer(integer(p2)+integer(sectionh2^.VirtualAddress)),
                               orig1,orig2,
                               sectionh1^.Misc.VirtualSize) = false then
                MessageBox(0,'not same section',nil,0);
            end;
          end;
        end;
      end;
    end;

  end;
var h1,h2, pr, dllprocsize: integer;
    read: cardinal;
    buf, buf2: pointer;
begin
  pr := uallProcess.FindProcess(processname);
  if pr = 0 then
    messagebox(0,'process not loaded',nil,0) else
  begin
    h1 := LoadLibrary(pchar(dlln));
    if h1 = 0 then
      messagebox(0,'cant load dll',nil,0) else
    begin
      h2 := uallProcess.GetModuleOffset(dlln,pr);
      if h2 = 0 then
        MessageBox(0,'dll in process not found',nil,0) else
      begin
        buf := VirtualAlloc(nil,$1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        pr := OpenProcess(PROCESS_ALL_ACCESS,false,pr);
        ReadProcessMemory(pr,pointer(h2),buf,$1000,read);
        dllprocsize := uallUtil.GetModuleVirtualSize(integer(buf));
        if uallUtil.GetModuleVirtualSize(h1) <> dllprocsize then
          MessageBox(0,'other dll loaded',nil,0) else
        begin
          buf2 := VirtualAlloc(nil,dllprocsize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
          ReadProcessMemory(pr,pointer(h2),buf2,dllprocsize,read);
          if CompareExecuteSections(pointer(h1),buf2,h1,h2) then
            MessageBox(0,'ok',nil,0) else
            MessageBox(0,'execute sections not same',nil,0);
          VirtualFree(buf2,dllprocsize,MEM_DECOMMIT);
        end;
        VirtualFree(buf,$1000,MEM_DECOMMIT);
      end;
    end;
    FreeLibrary(h1);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  IsCorrectExecuteSection('opengl32.dll','hl.exe');
end;
rest mussu selbst coden ;>

Arnulf 2. Jun 2005 23:47

Re: vergleichen von zwei librarys im speicher
 
wow - muß mich da erstmal durchackern :)
leider ist es schon spät und ich komm vor montag nicht dazu das wirklich durchzunehmen.

aber das ist mal unglaublich - leider hab ich immer den anspruch solche sachen zu verstehen...

naja kurz ausprobiert hab ichs - er stürtzt hin und wieder ab - gleich mitsamt ide .. aber ich schaus mir nochmal genauer an wenn ich zeit hab.
aber unglaublich - das prinzip funktioniert schon mal - danke vielmals mit so einer code flut hab ich nicht gerechnet :)
hab ich schon danke gesagt? ... nein - danke nochmal..
Ich lass den thread aber noch offen, weil ich sicher noch theoretische fragen hab :) - aber eigentlich ist er beantwortet ..

Delphi-Quellcode:
          if CompareExecuteSections(pointer(h1),buf2,h1,h2) then
            MessageBox(0,'ok',nil,0) else
            MessageBox(0,'execute sections not same',nil,0);
liefert übrigens immer true zurück
ich hab mal statt den messageboxen fals zurückgeben lassen und dann funktionierts eigentlich schon - bis auf das abstürzen der gesamten ide natürlich - hin und wieder lol....

Arnulf


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz