AGB  ·  Datenschutz  ·  Impressum  







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

RawByteString in Exe modifizieren

Ein Thema von DieDolly · begonnen am 6. Feb 2020 · letzter Beitrag vom 9. Feb 2020
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 07:52
Bau uns doch bitte eine Projektgruppe mit zwei Konsolenprojekten A und B, in dem B dann entsprechend die EXE A modifiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 08:48
Was ist ReplaceWith für ein Typ? (ich hoffe doch auch irgendeiner ANSI-Typen)

Und im POS würde ich den String nicht casten, denn dann bekommst du die Position im Unicode-String, anstatt im Original, auch wenn RawByteString zumindestens CodrpageConvertierungen umgewandelt werden sollty, also die Ord(Char) sollten gleich bleiben und demnach die Indize theoretisch gliech bleiben.


Besser über die String-Helper gehen, denn dort sind Indize immer 0-basiert.
Bei den Strings selber liegt Low(string) normal bei 1, aber in den NextGen-Compilern (Android, iOS, ...) fängt der String standardmäßig bei 0 an. (so wie normale Arrays)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 10:19
Weil bei Pos die Fehlerbehandlung fehlt?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 13:03
Abgesehn davon:
Warum kein RessourceString?

Delphi-Quellcode:
resourcestring
  deineKonstante = 'asdfasdfsda'; // wird über einen "zufälligen" String-Index in den Ressourcen gespeichert
bei Verwendung dieser Konstante wird intern LoadString vewendet

oder über den Ressourcen-Manager von Delphi (in die *.res jedes Projekte)
oder über eine eigene RC/RES-Datei
> hier jeweils über MSDN-Library durchsuchenLoadString bzw. MSDN-Library durchsuchenLoadResource/MSDN-Library durchsuchenFindResource/... den String laden



und dann entweder selber mit MSDN-Library durchsuchenUpdateResource oder über einen der vielen Resource-Editoren (teilweise lassen sie sich auch via Parameter steuern) diese Ressorce ändern, ohne bösswillig den "Programmcode" zu verändern.

und sowas lässt sich auch zur Laufzeit anpassen
* z.B. durch hooken der Load-Funktion (wird z.B. von einigen Lokalisierungskomponenten verwendet, um eine andere Sprache zu laden)
* oder über zusätzliche Dateien (z.B. siehe die .DE-Dateien neben den .BPL der Delphi-Packages)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 13:07
Warum? Vermutlich weil die "Exe-Datei 2" gar nicht von ihm ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 13:54
Nee nee, die Liebe Dolly macht sowas doch nicht.
Fremde Dateien hacken ist aber böse.
(vor allem wenn es gegen die Lizenzbedingen verstoßen könnte)



Sowas wie TEncoding.ANSI.xyz ist sowieso das Schlimmste, was man einer Binärdatei antun kann.

Wenn schon mit Unicode rumgepfuscht wird, dann besser ohne Zeichenübersetzungen.
Delphi-Quellcode:
E := TMBCSEncoding.Create($FFFF, 0, 0); // $FFFF ist auch die CodePage, welche der RawByteString benutzt
E.GetString();
Ansonsten gibt es viele Wege, um Binärdaten auch binär zu behandeln.
Delphi-Quellcode:
var R: RawByteString;
M := TFileStream.Create('.\file.exe');
SetLength(R, M.Size);
M.ReadBuffer(R[1], M.Size);
...
Und dann besser niemals mit Unicode-Funktionen darauf zugreigen
Pos und Copy gibt es standardmäßig überladen, auch als "ANSI"-Version (für AnsiString und seine Verwandten ala RawByteString)
und ansonsten gibt es auch noch die Unit AnsiStrings.

--

M := TMemoryStream.Create;
M.LoadFromFile('.\file.exe'));
...
M.Memory // ein Pointer auf den Dateiinhalt
...
M.SaveToFile('.\newfile.exe'));
M.Free;

--

B := TFile.ReadAllBytes('file');
... // B = ein Byte-Array
TFile.WriteAllBytes('newfile', B);

--

R := TFile.OpenText('file'); // bzw. direkt TStreamReader.Create
W := TFile.CreateText('file'); // bzw. TStreamWriter.Create
// geht nicht, weil hier der Encoding-Parameter fehlt,
// aber

E := TMBCSEncoding.Create($FFFF, 0, 0);
S := TFile.ReadAllText('file', E);
...
E.Free;

uvm.
Leider gibt es Pos/PosEx unverständlicher Weise nicht für normale Arrays.
Es gibt StrPos-Funktionen für PAnsiChar, die man auf Pointer/Arrays loslassen könnte, aber bei der ersten #0 brechen die ab.
Also bleibt nur selber was basteln.

Aber so oder so ist es immer besser Binärdaten niemals in Text-Strings zu speichern
und stattdessen "ordentlich" mit Streams oder Pointer bzw. ByteArrays zu arbeiten.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Feb 2020 um 13:58 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

AW: RawByteString in Exe modifizieren

  Alt 7. Feb 2020, 17:16
Ich sehe gerade alles hat jetzt seine Richtigkeit. Der Fehler lag an der Ausgabe. Die Ausgabe war nur für mich. Ich hab mich schon gewundert, wo die 4 zusätzlichen KB herkamen!
Zur Klarstellung. Ich bearbeite hier ausschließlich meine eigenen Dateien!

Zitat:
E := TMBCSEncoding.Create($FFFF, 0, 0); // $FFFF ist auch die CodePage, welche der RawByteString benutzt
E.GetString();
Wenn ich das so nutze, erhalte ich EEncodingError. Der Fehler kommt, sobald ich E := TMBCSEncoding.Create($FFFF, 0, 0); irgendwo schreibe.

Geändert von DieDolly ( 7. Feb 2020 um 17:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RawByteString in Exe modifizieren

  Alt 8. Feb 2020, 22:12
Sowas wie TEncoding.ANSI.xyz ist sowieso das Schlimmste, was man einer Binärdatei antun kann.
Was soll man dazu noch weiteres sagen?

ASCII?

Nee, Binärdateien gehören binär behandelt ... jegliche Behandlung mit irgendwelche Texten und vor allem irgendwelches Umrechnen/Umcodieren in Unicode über Codepages hat hier einfach garnichts zu suchen.

ANSI ist bei uns und den Amis zugfällig 1 Byte pro Zeichen, aber das ist nicht überall so. (nur leider erfinden gerade die dann sowas Krankes, wie Binärdaten in Textstrings)
PS: UTF-8 ist ein gutes Beispiel dafür, was jeder verstehen können dürfte, wo also ein Index im Unicode nicht die selbe Position ist, wie in der Codierung.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Feb 2020 um 22:19 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 01:31 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