AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi vergleichen von zwei librarys im speicher
Thema durchsuchen
Ansicht
Themen-Optionen

vergleichen von zwei librarys im speicher

Ein Thema von Arnulf · begonnen am 2. Jun 2005 · letzter Beitrag vom 10. Jul 2005
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#1

vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 13:27
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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#2

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 13:36
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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 13:50
Wenn man die Pfade hat, dann muss man doch nur noch diese vergleichen.
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#4

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 14:36
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 14:51
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?
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#6

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 15:10
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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#7

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 15:12
warum lädst du nicht die module und vergleichst deren inhalt?
oder muss es >unbegingt< so kompliziert sein? </dummfrag>
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#8

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 15:27
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;
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 15:58
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 ;>
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#10

Re: vergleichen von zwei librarys im speicher

  Alt 2. Jun 2005, 23:47
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz