![]() |
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 |
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: |
Re: vergleichen von zwei librarys im speicher
Wenn man die Pfade hat, dann muss man doch nur noch diese vergleichen.
|
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 |
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? |
Re: vergleichen von zwei librarys im speicher
Zitat:
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 |
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> |
Re: vergleichen von zwei librarys im speicher
zusäzlich zu
![]() 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; |
Re: vergleichen von zwei librarys im speicher
Delphi-Quellcode:
rest mussu selbst coden ;>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; |
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:
liefert übrigens immer true zurück
if CompareExecuteSections(pointer(h1),buf2,h1,h2) then
MessageBox(0,'ok',nil,0) else MessageBox(0,'execute sections not same',nil,0); 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. |
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