String im Kompilat

Gast #3290192
Lesenswert?

Hallo,

ich würde gerne für eine Versinkennung einen String aus dem Quellcode in 
der kompilierten Binärdatei wieder finden:

#define FIND "TEST123"
printf("%s", FIND);

Ich kann den String "TEST123" nach dem kompilieren in der Binärdatei 
aber nicht finden. Ist so etwas möglich?

Siegfried
Gast #3290218
Lesenswert?

Z.B. wenn Du mit 16-Bit-Zeichen arbeitest.

Ob Dein oben angeführtes Beispiel überhaupt funktioniert weiß ich nicht, 
aber Du bist möglicherweise über die Füße von Billy Boy gestolpert.
Die Windows-Suchfunktion ignoriert einen ganzen Sack voll Erweiterungen, 
ich weiß es von .Pas her und durchsucht diese (Kommentarlos) überhaupt 
nicht.
Also geh' mal ruhig fremd und freunde Dich, mit einer anderen 
(Suchhilfe) an.
Gast #3290489
Lesenswert?

@Wegstaben Verbuchsler
So mit einer Prise nachdenken, was könnte es heißen, na, na?, naaa? 
Vielleicht Versionskennung? Jetzt wo es klar ist, weißt Du bestimmt die 
Lösung...

Ansonsten:
Ich habe die Datei mit einem Texteditor durchsucht. Dabei ist mir 
aufgefallen dass kein einziger in der Software vorkommender String zu 
sehen ist. Kann es sein dass die exe vom Compiler implizit gepackt wird? 
Es ist übrigens ein GCC Crosscompiler der Code für einen ARM9 µC Linux 
Kleinrechner erzeugt.

Grüße
Siegfried
#3290936
Lesenswert?

Siegfried schrieb:
> Im Moment gebe ich den String nur einmal an fprint, sonst ist dieser
> unbenutzt. Ich suche nochmal mit dem Hexeditor...

Im *.hex wirst du den auch so nicht finden. Da musst du nach den 
ASCII-Zeichen des ASCII-Codes deiner Zeichen im String suchen. Wenn es 
denn ASCII ist.
"T" ist 0x54. Im *.hex steht dann "54"
"TEST123" >> "54455354313233". Danach musst du suchen(lassen).

mfg.
#3291213
Lesenswert?

Thomas Eckmann schrieb:
> "T" ist 0x54. Im *.hex steht dann "54"
> "TEST123" >> "54455354313233". Danach musst du suchen(lassen).

Außer in der .hex ist mitten in diesem String ein Zeilenumbruch… Wenn 
das Entwicklungssystem gcc-basiert ist, dann sind die binutils auch 
dabei. Darin gibt es das Programm strings, das aus ausführbaren und 
Objektdateien alle Strings ausgeben kann (definiert als Abfolge von 
mindestens 4 druckbaren Zeichen). Das sollte auch mit Hex-Dateien 
arbeiten können.
#3291479
Lesenswert?

Häufig wird im Quelltext des Hauptmoduls etwa folgendes geschrieben als 
globales Objekt:
1
const char *version = "ganztoll (tm) 0.99a 2013-04-01 (C) 2013 Lug&Trug GmbH&Co.KG";
bzw. Version und Datum darin automatisch generiert, z.B. über svn.
Dadurch daß es eine globale Variable ist, kann der Compiler sie nicht 
wegoptimieren - er weiß ja nicht, ob sie nicht in anderen Modulen 
benötigt wird.



cppler schrieb:
> Also "meinprogramm /v" gibt dann "Version 1.02" aus.

meinprogramm -v wäre etwas unixüblicher :-)
Gast #3291492
Lesenswert?

Klaus Wachtler schrieb:
> Dadurch daß es eine globale Variable ist, kann der Compiler sie nicht
> wegoptimieren - er weiß ja nicht, ob sie nicht in anderen Modulen
> benötigt wird.
Da es aber der Linker weiß, macht er genau das; wird u.a. verwendet um 
nicht benutzte Bibliotheksfunktionen wegzuoptimieren. Dieses Feature 
muss man zwar nicht einschalten, aber dadurch verliert man eben die 
sonstige Wegoptimierung von unbenutzten Variablen. Beim GCC kann man 
stattdessen __attribute__((used)) an die Variable schreiben um ein 
Wegoptimieren dieser einen Variable komplett zu verhindern.
(Firma: JDCC) #3291500
Lesenswert?

Dr. Sommer schrieb:
> Klaus Wachtler schrieb:
>> Dadurch daß es eine globale Variable ist, kann der Compiler sie nicht
>> wegoptimieren - er weiß ja nicht, ob sie nicht in anderen Modulen
>> benötigt wird.
> Da es aber der Linker weiß, macht er genau das; wird u.a. verwendet um
> nicht benutzte Bibliotheksfunktionen wegzuoptimieren. Dieses Feature
> muss man zwar nicht einschalten, aber dadurch verliert man eben die
> sonstige Wegoptimierung von unbenutzten Variablen. Beim GCC kann man
> stattdessen __attribute__((used)) an die Variable schreiben um ein
> Wegoptimieren dieser einen Variable komplett zu verhindern.

Er hatte das aber mit printf() ausgegeben, da sollte es vorhanden sein
weil's angesprochen bzw. verwendet wird (s. erster Post).
Gast #3291572
Lesenswert?

Ich glaube hier geht irgendetwas durcheinander.

Von Siegfried:
>in der kompilierten Binärdatei wieder finden
>Kann es sein dass die exe vom Compiler implizit gepackt
>Es ist übrigens ein GCC Crosscompiler der Code für einen ARM9 µC Linux

An anderer Stelle:
>Du kannst in der vom Compiler generierten Assembler-Datei
>Ich habe die Datei mit einem Texteditor durchsucht
>Ich suche nochmal mit dem Hexeditor
>Im *.hex wirst du den auch so nicht finden.

Mich würde mal interessieren ob hier über:
xxxx,
xxxx.o,
xxxx.exe (Sonderwunsch),
xxxx.asm,
xxxx.hex,
xxxx.obj oder
wie auch immer die Dinger heißen geredet wird?

Vielleicht lässt sich dann irgendein System aufstellen, zusammen mit 
einem kleinen Hinweis darauf, ob mit dem guten, alten ASCII, oder mit 
einem seiner 16-Bit Verwandten, gearbeitet wird.
Gast #3291627
Lesenswert?

Siegfried schrieb:
> Ich habe die Datei mit einem Texteditor durchsucht.

Und der kommt auch mit Binärdateien zurecht?

> Dabei ist mir aufgefallen dass kein einziger in der Software vorkommender
> String zu sehen ist. Kann es sein dass die exe vom Compiler implizit
> gepackt wird?

Was ist denn "die exe"? Um welches Dateiformat handelt es sich?
Gast #3291653
Lesenswert?

Alex W. schrieb:
>> meinprogramm -v wäre etwas unixüblicher :-)
>
> ein / ist heute aber viel cooler! Vorallem seit dem es /dance oder /huhn
> gibt

trotzdem ist das -v bei vielen einfach im Blut wenn sie die Version 
eines Programms erfragen möchten. (Also bei allen, die ernsthaft 
arbeiten, also mit Unixartigen Systemen.)

Das /h oder /v kenne ich soweit nur aus der Windowswelt. Und die ist ja 
insbesondere für die Konsistenz und Mächtigkeit auf der Kommandozeile 
bekannt. ;)
Gast #3323245
Lesenswert?

Also, ich habe zuerst in der erzeugten Assemblerdatei nachgesehen, da 
finde ich die Strings, z.B.

-LC11:
  .ascii "###VERSIONTOKEN1.21***\000
  .align2

Vermutlich deutet das align schon darauf hin dass jedes zeichen in 2 
Bytes verpackt wird?
#3323282
Lesenswert?

Vielleicht.
Vielleicht auch nicht.

Was ich tun würde:
Das restliche Programm exakt gleich lassen und lediglich 1 Buchstaben 
des Strings verändern.

D.h. du hast dann 2 EXE, die an und für sich identisch sind, bis auf 
einen Buchstaben in einem auszugebenden String. Jedes Difference-Tool 
wird dir diesen Unterschied in den beiden EXE finden. Und dann schau ich 
mir in einem Hex-Editor die Umgebung dieser gefundenen 
Differenz-Position an. Danach weiß ich es genau.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren