AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Modify Resource im Speicher

Ein Thema von Gruber_Hans_12345 · begonnen am 9. Jul 2021 · letzter Beitrag vom 12. Jul 2021
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#1

Modify Resource im Speicher

  Alt 9. Jul 2021, 16:02
Hallo

Ich möchte gerne eine DFM (RC_DATA) Resource im Speicher modifizieren.

Bisher habe ich nur gefunden wie ich mit UpdateResource + BeginUpdateResource eine EXE Datei modizifzieren kann.

und dieses Stückchen Code

Delphi-Quellcode:
procedure WriteResource(const ResName: string; ResType: PChar; data : PChar; len : integer);
var
    Res: HRSRC;
    ResHandle: HGLOBAL;
    Ptr: Pointer;
    OldProtect: DWORD;
begin
    Res := FindResource(HInstance, PChar(ResName), ResType);
    Win32Check(Res <> 0);

    ResHandle := LoadResource(HInstance, Res);
    Win32Check(ResHandle <> 0);

    Ptr := LockResource(ResHandle);
    Win32Check(Ptr <> nil);

    Win32Check(VirtualProtect(Ptr, SizeofResource(HInstance, Res), PAGE_READWRITE, OldProtect));
    ZeroMemory(Ptr, SizeofRes ource(HInstance, Res));
    Win32Check(VirtualProtect(Ptr, SizeofResource(HInstance, Res), OldProtect, OldProtect));
end;
Das wäre im Prinzip schon sowas was ich brauche, nur habe ich das Problem das ich da den Inhalt nicht nur überschreiben will, osndenr sich auch die Größe ändert (kleiner - geht ja eventuell) aber auch größer.

Hat da wer eine Idee?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 16:34
Ich habe es noch nicht versucht aber ich würde zu erst es so probieren wie es Microsoft hier vorschlägt.

C++ Code Auszug vom Beispiel:
Delphi-Quellcode:
HGLOBAL hResLoad; // handle to loaded resource
HMODULE hExe; // handle to existing .EXE file
HRSRC hRes; // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes; // update resource handle
LPVOID lpResLock; // pointer to resource data
BOOL result;
#define IDD_HAND_ABOUTBOX 103
#define IDD_FOOT_ABOUTBOX 110

// Load the .EXE file that contains the dialog box you want to copy.
hExe = LoadLibrary(TEXT("hand.exe"));
if (hExe == NULL)
{
    ErrorHandler(TEXT("Could not load exe."));
    return;
}


// Locate the dialog box resource in the .EXE file.
hRes = FindResource(hExe, MAKEINTRESOURCE(IDD_HAND_ABOUTBOX), RT_DIALOG);
if (hRes == NULL)
{
    ErrorHandler(TEXT("Could not locate dialog box."));
    return;
}


// Load the dialog box into global memory.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
    ErrorHandler(TEXT("Could not load dialog box."));
    return;
}


// Lock the dialog box into global memory.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
    ErrorHandler(TEXT("Could not lock dialog box."));
    return;
}


// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource(TEXT("foot.exe"), FALSE);
if (hUpdateRes == NULL)
{
    ErrorHandler(TEXT("Could not open file for writing."));
    return;
}


// Add the dialog box resource to the update list.
result = UpdateResource(hUpdateRes, // update resource handle
    RT_DIALOG, // change dialog box resource
    MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX), // dialog box id
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
    lpResLock, // ptr to resource info
    SizeofResource(hExe, hRes)); // size of resource info

if (result == FALSE)
{
    ErrorHandler(TEXT("Could not add resource."));
    return;
}


// Write changes to FOOT.EXE and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
    ErrorHandler(TEXT("Could not write changes to file."));
    return;
}


// Clean up.
if (!FreeLibrary(hExe))
{
    ErrorHandler(TEXT("Could not free executable."));
    return;
}
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 16:38
Der code ändert ja nur eine Resource in der Exe Datei, ich "muss" die Resource in der bereits geladene EXE im Speicher umändern.

Mittlerweile verfolge ich einen anderen Ansatz, indem ich einen Hook auf die Classes.InitInheritedComponent mache, und dann die TResourceStream umändere. Das könnte ach funtkionieren, aber die Resource selber ändern wäre mir noch lieber.
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#4

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 16:49
Gehen wir doch mal einen Schritt weiter weg: Was hast du eigentlich vor?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 16:53
ich möchte die DFM die in der EXE eingebunden sind zur Laufzeit patchen.
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 16:54
Hallo Hans,
nur als eine mögliche Idee: Mit MemoryModule.pas / FuncHook.pas/ MemoryModuleHook.pas
https://github.com/DSPlayer/memorymodule
und/oder
https://github.com/Fr0sT-Brutal/Delphi_MemoryModule
kann man Resourcen z.B. aus DLL’s in den Speicher laden und ausführen. Vielleicht kann man damit auf die Resourece auch schreibend zugreifen und modifizieren?

Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#7

AW: Modify Resource im Speicher

  Alt 9. Jul 2021, 17:32
ich möchte die DFM die in der EXE eingebunden sind zur Laufzeit patchen.
Geht es noch etwas genauer? Es gibt diverse Möglichkeiten in den Lademechanismus einzugreifen. Es kommt halt darauf, was genau man machen will.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#8

AW: Modify Resource im Speicher

  Alt 12. Jul 2021, 12:43
DLL/EXE laden, ohne sie zu "laden" (starten), dann würde ich dafür LoadLibraryEx+LOAD_LIBRARY_AS_DATAFILE verwenden.



Aber ganz im Ernst, wenn, dann mach es doch einfach so, wie so manche Übersetzungskomponente,
also hooke die Lade-Funktionen und gibt einen Zeiger auf was Anderes zurück.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (12. Jul 2021 um 12:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:54 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