Forum: Compiler & IDEs Quell-Code verstecken/verschleiern


von Rangi J. (rangi)


Lesenswert?

Hallo Forum,
ich möchte meinen Quellcode gerne verstecken oder verschleiern. 
Folgender Hintergrund: mein Quellcode soll Teil eines größeren Projektes 
werden, welches von anderen Leuten erzeugt wird. Ich liefere also 
Objekt-Files, die dann von denen gelinkt und auch debugt werden. Wie 
stelle ich es am besten an, das dabei nichts aus meinem Quellcode 
zusehen ist.
Typischerweise sieht man dabei ja die Variablen-Namen und die 
Funktionsnamen, die zzt. einigermaßen Aussagekräftig sind. Das möchte 
ich verhindern. Gibts hier Tools oder wie macht ihr das?
Es geht um GCC für AVR.

von (prx) A. K. (prx)


Lesenswert?

Diese Leute sollen also Debuggen dürfen, aber die Funktion und Benennung 
der Interface-Funktionen nicht kennen dürfen?

von Karl H. (kbuchegg)


Lesenswert?

Rangi Jones schrieb:

> Ich liefere also
> Objekt-Files, ....

> Typischerweise sieht man dabei ja die Variablen-Namen und die
> Funktionsnamen,

Das würde ich gerne mal life sehen, wie man aus einem Object-File, 
welches nicht debug compiliert wurde, das alles über die interne 
Struktur rauskriegt.

Die Funktionsnamen der lokalen Funktionen sind vielleicht noch 
vorhanden, wenn der Compiler nicht inlinen konnte. Aber die sind so 
hilfreich, wie das Inhaltsverzeichnis von "Krieg und Frieden", wenn es 
um den Inhalt geht.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

komplett fertig compilieren, als binary ausliefern, die Einsprungpunkte 
mit einem Header definieren, ein Script basteln was die Binaries 
"kombiniert". Sie werden dich hassen.

von Rangi J. (rangi)


Lesenswert?

@A.K.
naja, soviel Verständnis hab ich dem Leser in dem Forum schon zugetraut. 
Die Zugriffsfunktionen sind logischweise lesbar und auch dokumentiert. 
Es geht darum, jegliche interne Funktionalität zu verschleiern.

@Karl Heinz
Die Details aus einzelnen Funktionen sind garnicht so wichtig. Es geht 
nicht nur um ein paar Funktionen in einem Modul. Es ist ein bisschen 
mehr und dann ist es dem böswilligen Debugger durchaus von nutzen, zu 
wissen was ich denn so anstelle mit der Hardware und in welcher 
Reihenfolge.
Wenn zb. die Funktion memcpy heisst muss ich garnicht wissen wie sie es 
genau macht, der Name verrät schon alles.

von Rangi J. (rangi)


Lesenswert?

@Dr. Sommer:
auf so eine Idee bin ich auch schon gekommen, aber leider geht das 
nicht. Der fertige Code geht über die 128kB-Grenze hinaus. Dafür 
verwendet AVR diese blöden Trampolins. Dadurch kann ich nicht dynamisch 
(also nach dem Linken) die Adressen von fremdem Funktionen mehr ändern.
Aber ja, für 32-Bitter würde das funktionieren. Leider keine Option.

von Dr. Sommer (Gast)


Lesenswert?

Rangi Jones schrieb:
> Dadurch kann ich nicht dynamisch
> (also nach dem Linken) die Adressen von fremdem Funktionen mehr ändern.
Ich meinte ja auch vor dem Linken. Du musst dem User Code halt durch ein 
bisschen Linker-Magic die Adressen fix mitgeben.

von OldMen (Gast)


Lesenswert?

Rangi Jones schrieb:
> stelle ich es am besten an, das dabei nichts aus meinem Quellcode
> zusehen ist.

Wenn jeder so denken würde, hätten wir heute keine GNU-Tools, Linux, 
usw.
Bewerbe Dich doch beim NSA, die brauchen so Leute.

von Kollege (Gast)


Lesenswert?

OldMen schrieb:
> Wenn jeder so denken würde, hätten wir heute keine GNU-Tools, Linux,
> usw.
> Bewerbe Dich doch beim NSA, die brauchen so Leute.

Vor allem ist der Code den Aufwand meistens gar nicht Wert...

von Horst (Gast)


Lesenswert?

OldMen schrieb:

> Bewerbe Dich doch beim NSA, die brauchen so Leute.

Woher weißt du das?

von Rangi J. (rangi)


Lesenswert?

@Dr. Sommer
das hört sich Intressant an. Mal sehen ob ichs richtig verstanden habe.
Ich baue eine Dummy-Umgebung, die alle meine Funktionen referenziert 
zusammen mit meinem Code. Dann trenne ich im hex-File Dummy von meinem 
Code.
Jetzt gebe ich meinen Teil des hex-files und eine Liste der Funktionen 
nach außen. Die andrern müssen dann ihren Code woanders hin legen, dann 
linken und danach die Hex-Files zusammenbauen.
Call-Backs würde ich dann über Funktions-Pointer per Übergabe erledigen.
Wie kann ich dem Linker (also dann beim fertigen System) sagen, dass auf 
Adresse 0xabcd eine Funkion ist, die er nicht kennt und auch nicht 
platziert?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> Die Funktionsnamen der lokalen Funktionen sind vielleicht noch
> vorhanden

Wenn sie als static deklariert wurden, sollte das nicht der Fall sein.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

hallo
Bastel doch eine Publicfunktion welche die Parameter und die gewünschte 
Aufgabe vom User übernimmt. Selbige legt diese Daten auf eine internee 
inbox welche von deinen bereits compilierten und assemblierten 
Funktionen abgearbeitet wird. Anschließend übergibst du das Ergebnis 
über eine ebensolche Schleuse Retur. Somit kannst du fertige 
maschinecode verwenden.
Interne Variablen und Funktionen kannst du mit suchen und ersetzen zuvor 
durchnummerieren. Variableninhalte (strings) vor dem ablegen und nach 
dem auslesen bitrotieren. So ist selbst das Speicherabbid nicht mehr 
ohne Aufwand auswertbar, da kein Klartext mehr zurückbleibt. IN und OUT 
lassen sich auch vor und nach der verarbeitung grundsaätzlich rotiern, 
so dass Bitmuster aus Vergleichs oder bedingten Operationen nicht mit 
den Bitmustern an den Ports korrospondieren.

Mehr Verschleierung braucht es nicht Scriptkiddis aufzuhalten anders bei 
guten Hackern, die lassen sich auch von selbstmodifizierendem Code nicht 
aufhalten. Sondern knacken aus olympischen Ehrgeiz, egal wie hoch der 
Aufwand ist.
Namaste

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du könntest all deine Module relocatable zusammenlinken (-r); dadurch 
werden bekannte Symbole aufgelöst.  Evtl. ist es zweckmäßig, alle Module 
zusammen zu compilieren, d.h. in einem Aufruf; alternativ mit LTO 
(-flto) compilen und linken.

Wie man unterschiedlichen globalen Symbole, d.h. "extern (für Kunde) 
sichtbar" und "nur für dich sichtbar zur Intermodul-Kommunikation" 
unterschiedlich handhabt, hab ich jetzt keine Idee...

Zum einen sollten von "deinen" Symbolen nach dem -r Linken keine mehr 
verbleiben, zum anderen könntest du mit Sichtbarkeit experimentieren 
(etwa attribute visibility auf "hidden" oder "externally_visible").

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

...und Strukturen, auf die der Anwender nicht direkt zugreifen muß, 
kannst du incomplete machen, d.h. im ausgelieferten Header steht nur ein 
"struct foo;" oder "union bar;" oder gar "typedef bazz;".

Damit kann der Anwender Zeiger auf dieses Zeug umherschuben und 
vergleichen, aber nicht dereferenzieren.  Du brauchst also (öffentliche) 
Zugriffsfunktionen.

von Jasch (Gast)


Lesenswert?

Rangi Jones schrieb:
> Hallo Forum,
> ich möchte meinen Quellcode gerne verstecken oder verschleiern.
> Folgender Hintergrund: mein Quellcode soll Teil eines größeren Projektes
> werden, welches von anderen Leuten erzeugt wird. Ich liefere also
> Objekt-Files, die dann von denen gelinkt und auch debugt werden. Wie
> stelle ich es am besten an, das dabei nichts aus meinem Quellcode
> zusehen ist.

Gib den Funktionen, Variablen etc. Namen nach dem Muster "f1", "f2", 
"v1", "v2" usw. Viel Spass damit...

> Typischerweise sieht man dabei ja die Variablen-Namen und die
> Funktionsnamen, die zzt. einigermaßen Aussagekräftig sind. Das möchte
> ich verhindern. Gibts hier Tools oder wie macht ihr das?
> Es geht um GCC für AVR.

Hmm, hmm, also kann der Code nicht so gigantisch gross sein, also kann 
man realistisch die komplette Funktion aus dem Maschinencode ermitteln 
(dass das auch ganz ohne irgendwelche Bezeichner geht ist klar?).

Da gibt es dann ein paar Fälle zu unterscheiden:

- die anderen Leute sind ein kleine Firma
    - Du vertraust denen -> kein Problem
    - Du vertraust denen nicht
        - Du denkst sie haben nicht die Kapazitäten um den Maschinencode 
zurückzuverwandeln -> kein Problem, aber Du kannst Dich irren
        - Du denkst sie könnten Reverse Engineering machen
            - Du hast einen Anwalt der einen ordentlichen Vertrag 
aufsetzt -> kein Problem, Du kannst im Falle eines Falles vor Gericht 
Recht bekommen, oder auch nicht ;-)
            - Ein ordentlicher Vertrag ist keine Option -> arbeite nicht 
mit denen zusammmen

- die anderen Leute sind eine grosse Firma
    - Deine Wahl, Du hast aber im Falle eines Falles keine Chance weil 
die viel mehr Geld für Anwälte haben

- die zahlen Dir genug Geld dass Du Dir keine Gedanken mehr um das ganze 
Problem machen musst -> kein Problem

Ist doch nicht so schwer? Grins.

von Karl H. (kbuchegg)


Lesenswert?

Rangi Jones schrieb:

> mehr und dann ist es dem böswilligen Debugger durchaus von nutzen, zu
> wissen was ich denn so anstelle mit der Hardware und in welcher
> Reihenfolge.

Und was soll den 'böswilligen Debugger' daran hindern, einen 
Logikanalysator an die Pins zu hängen?

> Wenn zb. die Funktion memcpy heisst muss ich garnicht wissen wie sie es
> genau macht, der Name verrät schon alles.

Und das hilft jetzt jemandem im Komplettzusammenhang des Verständnisses 
deiner Funktionen genau wie, dass er weiß dass da ein paar bytes durch 
die Gegend kopiert werden? Diese Funktionalität kommt in so ziemlich 
jedem Programm vor. Genauso wie strcpy, strcat, strtok, ... das ganze 
Repertoire der Standard-Library. Das ist ungefähr so interessant, wie 
die Information dass der nächste Mercedes-Erlkönig höchst wahrscheinlich 
einen Motor haben wird und, uh - oh, Scheibenwischer.


Lieschen Müller kannst du damit aufhalten. Aber die könnte mit den 
Informationen sowieso nichts anfangen. Wers unbedingt wissen will, 
findet es auch heraus. Und die kannst du nicht aufhalten.

: Bearbeitet durch User
von Boot_loader (Gast)


Lesenswert?

Ohne alles gelesen zuhaben, der Begriff der hier gesucht wird nennt sich 
Obfuscating!

Einfach mal nach Beispielen suchen und den Wikipedia Artikel lesen. 
Sollte das seinw as du suchst.

http://de.wikipedia.org/wiki/Obfuscator

von Karl H. (kbuchegg)


Lesenswert?

Kollege schrieb:

> Vor allem ist der Code den Aufwand meistens gar nicht Wert...

Hab lange überlegt, ob ich diesen Gedanken aufgreifen soll. Denn dann 
kommen wieder die 'Ihr kennt mich doch gar nicht - wie könnt ihr so 
gemein sein' Vorwürfe.

Genau so siehts aus.
Wer in der Lage ist, Code zu schreiben, dessen Aufbau und Funktion 
komplex und interessant genug ist, dass sich jemand Unbefugter dafür 
interessiert, der weiß auch, wie er ihn ein bischen verschleiern kann, 
bzw. schon alleine dadurch, dass er eine saubere opaque Schnittstelle 
und Information Hiding betreibt, versteckt er die Details im Inneren des 
Codes, die der Applikationsprogrammierer nicht sehen soll bzw. sehen 
braucht.

Und im Zweifelsfall ist es als Applikationsprogrammierer von Vorteil, 
sich die Internals ansehen zu können. Schon alleine aus dem Grund 
rausfinden zu können, warum das '*&%$§ wieder mal nicht funktioniert und 
was schief geht.

: Bearbeitet durch User
von 900ss (900ss)


Lesenswert?

Rangi Jones schrieb:
> ich möchte meinen Quellcode gerne verstecken oder verschleiern


Boot_loader schrieb:
> Ohne alles gelesen zuhaben, der Begriff der hier gesucht wird nennt sich
> Obfuscating!

Richtig.
Ich habe eine Weile mit einer Library aus den USA gearbeitet. Diese 
Library lag als obfuscated 'C' Sourcecode vor. Ich habe die gefragt, 
womit sie das machen..... siehe Link, ist Freeware. Dann kannst du 
getrost den Source weiter geben, da siehst du nix mehr.
Der Compiler übersetzt das aber das ein Mensch das lesen kann ist 
äußerst unwahrscheinlich :)

http://www.plexaure.de/cms/index.php?id=cobf


Ein Ausschnitt:
1
FooXYZMngBarl531=0x6000,FooXYZMngBarl586,FooXYZMngBarl496,
2
FooXYZMngBarl604,FooXYZMngBarl611=0x7000,FooXYZMngBarl523,
3
FooXYZMngBarl565,FooXYZMngBarl554,FooXYZMngBarl538,
4
FooXYZMngBarl532,FooXYZMngBarl589,FooXYZMngBarl476,
5
FooXYZMngBarl528=0x8000,FooXYZMngBarl458=0x9000,
6
FooXYZMngBarl502,FooXYZMngBarl498}FooXYZMngBarl75;
7
FooXYZMngBarm FooXYZMngBarl598(FooXYZMngBarl75 FooXYZMngBarl101,FooXYZMngBard*FooXYZMngBarl65, FooXYZMngBara FooXYZMngBarl96);FooXYZMngBarb FooXYZMngBarl42
8
{FooXYZMngBarl473=0x0000,FooXYZMngBarl606=0x0001,
9
FooXYZMngBarl466=0x0100,FooXYZMngBarl519,FooXYZMngBarl534,
10
FooXYZMngBarl493,FooXYZMngBarl603,FooXYZMngBarl507,
11
FooXYZMngBarl615,FooXYZMngBarl478,FooXYZMngBarl489,
12
FooXYZMngBarl497,FooXYZMngBarl544,FooXYZMngBarl483,
13
FooXYZMngBarl512=0x0200,FooXYZMngBarl546,FooXYZMngBarl547,
14
FooXYZMngBarl582,FooXYZMngBarl563,FooXYZMngBarl494=0x0300,
15
FooXYZMngBarl610,FooXYZMngBarl616=0x0400,FooXYZMngBarl514,
16
FooXYZMngBarl577,FooXYZMngBarl479,FooXYZMngBarl472=0x04C0,
17
FooXYZMngBarl530=0x04C0,FooXYZMngBarl468,FooXYZMngBarl568,
18
FooXYZMngBarl510,FooXYZMngBarl548,FooXYZMngBarl511=0x0500,
19
FooXYZMngBarl579}FooXYZMngBarl508;FooXYZMngBard
20
FooXYZMngBarl539(FooXYZMngBara FooXYZMngBarl469);
21
FooXYZMngBara FooXYZMngBarl578(FooXYZMngBard);FooXYZMngBard
22
FooXYZMngBarl558(FooXYZMngBara FooXYZMngBarl605);
23
FooXYZMngBarm FooXYZMngBarl600(FooXYZMngBard);FooXYZMngBarm
24
FooXYZMngBarl555(FooXYZMngBarl45*FooXYZMngBarl170);
25
FooXYZMngBard FooXYZMngBarl581(FooXYZMngBarl45* FooXYZMngBarl170);FooXYZMngBarl104*FooXYZMngBarl540( FooXYZMngBari FooXYZMngBarl45*FooXYZMngBarl77,FooXYZMngBari FooXYZMngBarl164*FooXYZMngBarl492,FooXYZMngBarl177* FooXYZMngBarl187);FooXYZMngBard FooXYZMngBarl520( FooXYZMngBari FooXYZMngBarl45*FooXYZMngBarl77, FooXYZMngBarl104*FooXYZMngBarl174);FooXYZMngBarl105*
26
FooXYZMngBarl553(FooXYZMngBari FooXYZMngBarl45* FooXYZMngBarl77,FooXYZMngBari FooXYZMngBarl178* FooXYZMngBarl580,FooXYZMngBarl188*FooXYZMngBarl187);
27
FooXYZMngBard FooXYZMngBarl562(FooXYZMngBari FooXYZMngBarl45  *FooXYZMngBarl77,FooXYZMngBarl105*FooXYZMngBarl174);

von Daniel H. (Firma: keine) (commander)


Lesenswert?

900ss D. schrieb:
> Der Compiler übersetzt das aber das ein Mensch das lesen kann ist
> äußerst unwahrscheinlich :)

Im Zweifel kompiliert man es und dekompileirt und disassembliert es 
dann. Code-Obfuscation kann es höchstens erschweren die Funktionsweise 
zu verstehen, einen wirklichen Schutz bietet es hingegen nicht. Im 
schlimmsten Fall interessiert sich der Gegenüber gar nicht für den Code 
sondern baut den Code einfach in sein Projekt ein, solange er weiß, was 
für Parameter er nutzen muss und was er heraus bekommt.

von 900ss (900ss)


Lesenswert?

Daniel H. schrieb:
> 900ss D. schrieb:
>> Der Compiler übersetzt das aber das ein Mensch das lesen kann ist
>> äußerst unwahrscheinlich :)
>
> Im Zweifel kompiliert man es und dekompileirt und disassembliert es
> dann. Code-Obfuscation kann es höchstens erschweren die Funktionsweise
> zu verstehen, einen wirklichen Schutz bietet es hingegen nicht.

Ja stimmt. Ich wünsch viel Spaß dabei ;)

>Im
> schlimmsten Fall interessiert sich der Gegenüber gar nicht für den Code
> sondern baut den Code einfach in sein Projekt ein, solange er weiß, was
> für Parameter er nutzen muss und was er heraus bekommt.

Das ist wohl war. Aber um gewisse Techniken, die in der SW stecken zu 
schützen, ist es gut (mit Ausnahme von oben).
Hier ging es darum, Algorithmen für Bad Block Managing und Wear Leveling 
bei Flash-Speichern, auf das der SW Hersteller Patente hat, zu schützen.

Wenn das jemand disassembliert und danach dann versteht, dann hat er es 
sich verdient :)

In diesem Fall könnte man genausogut die Flash-Zuriffe tracen. 
Möglichkeiten gibt es immer.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

900ss D. schrieb:
> Ja stimmt. Ich wünsch viel Spaß dabei ;)

Ehrlich gesagt ist das nicht so schwer, wenn man die Zielplattform 
kennt. Code-Obfuscation zielt darauf ab das Lesen für Menschen zu 
erschweren. Den Compiler interessiert das herzlich wenig, der optimiert 
alles Redundante und überflüssige weg und am Ende sehen "normaler" und 
verschleierter Code im Binary identisch aus.

900ss D. schrieb:
> Hier ging es darum, Algorithmen für Bad Block Managing und Wear Leveling
> bei Flash-Speichern, auf das der SW Hersteller Patente hat, zu schützen.

Wo ist der Sinn? Wenn man ein Patent darauf hat ist es doch eh schon 
geschützt.

von Detlef K. (adenin)


Lesenswert?

900ss D. schrieb:
> Ja stimmt. Ich wünsch viel Spaß dabei ;)

Ich hatte eben Spaß :)
Das sind offensichtlich Deklarationen von Funktionen und Strukturen.
Leider ist das Zeug unvollständig, sonst könnte man es in etwas 
verständliches zurück verwandeln.
1
  FooXYZMngBarl531=0x6000,
2
  FooXYZMngBarl586,
3
  FooXYZMngBarl496,
4
  FooXYZMngBarl604,
5
  FooXYZMngBarl611=0x7000,
6
  FooXYZMngBarl523,
7
  FooXYZMngBarl565,
8
  FooXYZMngBarl554,
9
  FooXYZMngBarl538,
10
  FooXYZMngBarl532,
11
  FooXYZMngBarl589,
12
  FooXYZMngBarl476,
13
  FooXYZMngBarl528=0x8000,
14
  FooXYZMngBarl458=0x9000,
15
  FooXYZMngBarl502,
16
  FooXYZMngBarl498
17
}FooXYZMngBarl75;
18
19
FooXYZMngBarm FooXYZMngBarl598(FooXYZMngBarl75 FooXYZMngBarl101, FooXYZMngBard *FooXYZMngBarl65, FooXYZMngBara FooXYZMngBarl96);
20
21
FooXYZMngBarb FooXYZMngBarl42{
22
  FooXYZMngBarl473=0x0000,
23
  FooXYZMngBarl606=0x0001,
24
  FooXYZMngBarl466=0x0100,
25
  FooXYZMngBarl519,
26
  FooXYZMngBarl534,
27
  FooXYZMngBarl493,
28
  FooXYZMngBarl603,
29
  FooXYZMngBarl507,
30
  FooXYZMngBarl615,
31
  FooXYZMngBarl478,
32
  FooXYZMngBarl489,
33
  FooXYZMngBarl497,
34
  FooXYZMngBarl544,
35
  FooXYZMngBarl483,
36
  FooXYZMngBarl512=0x0200,
37
  FooXYZMngBarl546,
38
  FooXYZMngBarl547,
39
  FooXYZMngBarl582,
40
  FooXYZMngBarl563,
41
  FooXYZMngBarl494=0x0300,
42
  FooXYZMngBarl610,
43
  FooXYZMngBarl616=0x0400,
44
  FooXYZMngBarl514,
45
  FooXYZMngBarl577,
46
  FooXYZMngBarl479,
47
  FooXYZMngBarl472=0x04C0,
48
  FooXYZMngBarl530=0x04C0,
49
  FooXYZMngBarl468,
50
  FooXYZMngBarl568,
51
  FooXYZMngBarl510,
52
  FooXYZMngBarl548,
53
  FooXYZMngBarl511=0x0500,
54
  FooXYZMngBarl579
55
}FooXYZMngBarl508;
56
57
FooXYZMngBard FooXYZMngBarl539(FooXYZMngBara FooXYZMngBarl469);
58
59
FooXYZMngBara FooXYZMngBarl578(FooXYZMngBard);
60
61
FooXYZMngBard FooXYZMngBarl558(FooXYZMngBara FooXYZMngBarl605);
62
63
FooXYZMngBarm FooXYZMngBarl600(FooXYZMngBard);
64
65
FooXYZMngBarm FooXYZMngBarl555(FooXYZMngBarl45 *FooXYZMngBarl170);
66
67
FooXYZMngBard FooXYZMngBarl581(FooXYZMngBarl45 *FooXYZMngBarl170);
68
69
FooXYZMngBarl104 *FooXYZMngBarl540(FooXYZMngBari FooXYZMngBarl45 *FooXYZMngBarl77, FooXYZMngBari FooXYZMngBarl164 *FooXYZMngBarl492, FooXYZMngBarl177 *FooXYZMngBarl187);
70
71
FooXYZMngBard FooXYZMngBarl520(FooXYZMngBari FooXYZMngBarl45 *FooXYZMngBarl77, FooXYZMngBarl104 *FooXYZMngBarl174);
72
73
FooXYZMngBarl105 *FooXYZMngBarl553(FooXYZMngBari FooXYZMngBarl45 *FooXYZMngBarl77, FooXYZMngBari FooXYZMngBarl178 *FooXYZMngBarl580, FooXYZMngBarl188 *FooXYZMngBarl187);
74
75
FooXYZMngBard FooXYZMngBarl562(FooXYZMngBari FooXYZMngBarl45 *FooXYZMngBarl77, FooXYZMngBarl105 *FooXYZMngBarl174);

von 900ss (900ss)


Lesenswert?

Detlef Kunz schrieb:
> Ich hatte eben Spaß :)
> Das sind offensichtlich Deklarationen von Funktionen und Strukturen.

Ich bin jetzt richtig beeindruckt was du alles kannst.

Ich schrieb schon:
> Möglichkeiten gibt es immer.

Selbstverständlich kann man das rekonstruieren. Und selbst dann bleibt 
es schwer. Es ist immer eine Frage des Aufwandes.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

900ss D. schrieb:

> Selbstverständlich kann man das rekonstruieren. Und selbst dann bleibt
> es schwer. Es ist immer eine Frage des Aufwandes.

Wobei du zugeben musst, dass du dir auch ein schlechtes Beispiel 
ausgesucht hast. Das jemand Definitionen und Prototypen erkennt, da sag 
ich nur: 'gähn'.

Lass mal ein Stück Code, 1 Funktion so 200 bis 300 Zeilen, durch den 
Obfuscator laufen und dann schaun wir mal weiter, wie lange Detlef 
braucht, um rauszufinden, was der Code macht.
Dann da fängt Reverse Engeniering an. Wobei das noch die einfachere 
Stufe ist. Interessant wird es dann bei mehreren Funktionen, die auf 
einer gemeinsamen (internen) Datenstruktur operieren, deren Zweck man 
nicht kennt und deren Bedeutung von Strukturmember (beispielsweise), man 
dann auch erst mal erraten muss.
Da muss der Leidensdruck dann schon sehr hoch sein, wenn man sich dann 
auch noch die Rückübersetzung aus Object-Code davorsetzt. Wer das 
knackt, der hat es sich verdient.

: Bearbeitet durch User
von 900ss (900ss)


Lesenswert?

Karl Heinz schrieb:
> 900ss D. schrieb:
>
>> Selbstverständlich kann man das rekonstruieren. Und selbst dann bleibt
>> es schwer. Es ist immer eine Frage des Aufwandes.
>
> Wobei du zugeben musst, dass du dir auch ein schlechtes Beispiel
> ausgesucht hast. Das jemand Definitionen und Prototypen erkennt, da sag
> ich nur: 'gähn'.

Eben, ich war wirklich beeindruckt ;) Ich hab einfach wahllos in den 
Code gegriffen und es hier reingestellt. Was das war, habe ich vorher 
nicht geprüft. Es sollte nur zeigen, wie soetwas aussieht.

>
> Lass mal ein Stück Code, 1 Funktion so 200 bis 300 Zeilen, durch den
> Obfuscator laufen und dann schaun wir mal weiter, wie lange Detlef
> braucht, um rauszufinden, was der Code macht.
> Dann da fängt Reverse Engeniering an. Wobei das noch die einfachere
> Stufe ist. Interessant wird es dann bei mehreren Funktionen, die auf
> einer gemeinsamen (internen) Datenstruktur operieren, deren Zweck man
> nicht kennt und deren Bedeutung von Strukturmember (beispielsweise), man
> dann auch erst mal erraten muss.
> Da muss der Leidensdruck dann schon sehr hoch sein, wenn man sich dann
> auch noch die Rückübersetzung aus Object-Code davorsetzt. Wer das
> knackt, der hat es sich verdient.

Ich stimme dir vollkommn zu. Und ich schrieb auch schon, wer das 
entschlüsselt, der hat es sich verdient :)

von Rangi J. (rangi)


Lesenswert?

Mich würde die Lösung von Dr.Sommer interessieren. Wie kann ich im 
Linkerscript reinschreiben, das eine Funktion eine bestimmte Adresse 
besitzt?
Im Detail würde ich meinen Code übersetzten, dann die Adressen der 
Übergabefunktionen aus dem map-File rausholen. Dann Name und Adresse in 
ein spezielles Linkerfile einbauen. Das geht dann zusammen mit dem 
zurecht geschnittenen hex-File und dem Header, in einer modifizierten 
Entwicklungsumgebung raus.
Nach dem Übersetzen und Linken werden das User-hex-File und mein 
existierendes hex-File zusammenkopiert. Danach kann man das System wie 
gewohnt flashen und debuggen.
Jetzt weiss ich nur nicht, wie das Linkerfile aussehen sollte. Kann mir 
da jmd helfen?

von MaWin (Gast)


Lesenswert?

Rangi Jones schrieb:
> ich möchte meinen Quellcode gerne verstecken oder verschleiern.

Gib zu, dein Code ist dermassen Scheisse, daß du nicht willst, daß die 
Anderen sich darüber kaputtlachen.

von Rangi J. (rangi)


Lesenswert?

g ja, das ausserdem

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

MaWin schrieb:
> Rangi Jones schrieb:
>> ich möchte meinen Quellcode gerne verstecken oder verschleiern.
>
> Gib zu, dein Code ist dermassen Scheisse, daß du nicht willst, daß die
> Anderen sich darüber kaputtlachen.

Im Eröffnungsposting steht, dass er Object-Code ausliefern will. D.h. 
den Quellcode kriegt sowieso keiner zu Gesicht.

@Rangi
Stell die Object-Files (-Os compiliert) in eine Library (eine echte 
Library, nicht das was hier oft als Lib bezeichnet wird), veröffentliche 
die Schnittstelle in Form von Header Files und gut ists.
Wenn dein Code nicht sowieso pipifax ist, ist das 'verschleiert genug', 
so dass die wenigsten dir da 'in die Karten schauen können'.

: Bearbeitet durch User
von Helmut L. (helmi1)


Lesenswert?

Wenn ich deine Lib nutzen muesste und da waere ein Problem drin wuerdes 
du entweder hier antraben oder das Teil fliegt raus.

von klausr (Gast)


Lesenswert?

Jasch schrieb:
> - Du hast einen Anwalt der einen ordentlichen Vertrag
> aufsetzt

> - die zahlen Dir genug Geld dass Du Dir keine Gedanken mehr um das ganze
> Problem machen musst -> kein Problem

Also, ich würde diese zwei Punkt kombinieren (+Supportvertrag) und denen 
gleich den Quelltext geben. Alles andere ist Blödsinn bzw. bringt dir 
nur zusätzliche Arbeit und denen einen erhöhten Aufwand. Wenn du gut 
bist, dann fragen sie bei Problemen in deinem Quelltext eh bei dir an. 
Wenn sie darauf nicht eingehen, würd ich gar nicht mit denen 
zusammenarbeiten.

von Mladen G. (mgira)


Lesenswert?

Karl Heinz schrieb:
> Hab lange überlegt, ob ich diesen Gedanken aufgreifen soll. Denn dann
> kommen wieder die 'Ihr kennt mich doch gar nicht - wie könnt ihr so
> gemein sein' Vorwürfe.
>
> Genau so siehts aus.
> Wer in der Lage ist, Code zu schreiben, dessen Aufbau und Funktion
> komplex und interessant genug ist, dass sich jemand Unbefugter dafür
> interessiert, der weiß auch, wie er ihn ein bischen verschleiern kann,
> bzw. schon alleine dadurch, dass er eine saubere opaque Schnittstelle
> und Information Hiding betreibt, versteckt er die Details im Inneren des
> Codes, die der Applikationsprogrammierer nicht sehen soll bzw. sehen
> braucht.
>
> Und im Zweifelsfall ist es als Applikationsprogrammierer von Vorteil,
> sich die Internals ansehen zu können. Schon alleine aus dem Grund
> rausfinden zu können, warum das '*&%$§ wieder mal nicht funktioniert und
> was schief geht.

Eben, erlebe das meist nur bei "Anfaengern" seinen "kostbaren" Code 
verschleiern zu wollen, genau da ist es meist kontraproduktiv.

Wenn die eigene, ach so schuetzenswerte Arbeit dann noch die GNU 
Toolchain aufbaut wie GCC etc., wundere ich mich schon sehr wie man auf 
die Idee kommt das es gut waere zu verschleiern.

von Jasch (Gast)


Lesenswert?

Rangi Jones schrieb:
> Im Detail würde ich meinen Code übersetzten, dann die Adressen der
> Übergabefunktionen aus dem map-File rausholen. Dann Name und Adresse in
> ein spezielles Linkerfile einbauen. Das geht dann zusammen mit dem
> zurecht geschnittenen hex-File und dem Header, in einer modifizierten
> Entwicklungsumgebung raus.

Modifizierte Entwicklungsumgebung?

Das meinst Du nicht ernst, wo willst Du denn einen Bekloppten finden der 
so einen Wahnsinn akzeptiert?

Ist das Motto dann "Du sollst keinen Fremdcode ausser meinem haben"? 
=8^(

von Jasch (Gast)


Lesenswert?

klausr schrieb:
> Jasch schrieb:
>> - Du hast einen Anwalt der einen ordentlichen Vertrag
>> aufsetzt
>
>> - die zahlen Dir genug Geld dass Du Dir keine Gedanken mehr um das ganze
>> Problem machen musst -> kein Problem
>
> Also, ich würde diese zwei Punkt kombinieren (+Supportvertrag) und denen
> gleich den Quelltext geben. Alles andere ist Blödsinn bzw. bringt dir
> nur zusätzliche Arbeit und denen einen erhöhten Aufwand. Wenn du gut
> bist, dann fragen sie bei Problemen in deinem Quelltext eh bei dir an.

So kenne ich das auch, von der Seite aus die Code/Unterstützung bei 
anderen einkauft.

Der Code ist nicht halb so interessant wie die (kompetenten) Leute 
dahinter, die braucht man beim nächsten Projekt nämlich wieder. Und beim 
übernächsten...

von Peter D. (peda)


Lesenswert?

Rangi Jones schrieb:
> Folgender Hintergrund: mein Quellcode soll Teil eines größeren Projektes
> werden, welches von anderen Leuten erzeugt wird.

Diese Leute sollte man besser nicht für dumm verkaufen.
Wenn davon wirklich ein Produkt abhängt, werden sie den Teufel tun und 
sich Daumenschrauben anlegen lassen.

Sie werden sich ganz einfach einen anderen Programmierer suchen, der zur 
Kooperation bereit ist.
Und der vor allem für den Fall des Ablebens/Geschäftsaufgabe usw. alle 
nötigen Unterlagen bereitstellt, das Projekt weiter führen zu können.

von Mark B. (markbrandis)


Lesenswert?

Rangi Jones schrieb:
> ich möchte meinen Quellcode gerne verstecken oder verschleiern.

Eine wirklich seltsame Idee in einer Zeit, in der gute Entwickler immer 
mal wieder etwas von ihrem Code auf GitHub, Bitbucket, SourceForge etc. 
veröffentlichen. Oder auch hier im Forum.

Guter Sourcecode ist auch eine Form von Eigenwerbung.

von Mark B. (markbrandis)


Lesenswert?

Ach ja, wer Quellcode verschleiern möchte, der ist hier goldrichtig:

http://www.ioccc.org/

Wobei man getrost davon ausgehen kann, dass die Leute deren Code dort 
veröffentlicht wurde es auch ordentlich können :)

von Karl H. (kbuchegg)


Lesenswert?

Mark Brandis schrieb:
> Ach ja, wer Quellcode verschleiern möchte, der ist hier goldrichtig:
>
> http://www.ioccc.org/
>
> Wobei man getrost davon ausgehen kann, dass die Leute deren Code dort
> veröffentlicht wurde es auch ordentlich können :)

Und ganz wichtig: es zum Spass machen um zu zeigen was geht.

Ich bin jetzt zu faul, den entsprechenden Eintrag beim IOCCC 
herauszusuchen. Aber da gab es mal ein Programm, welches sich eigentlich 
ganz gut las und man sich fragte was dieser Eintrag beim IOCCC zu suchen 
hat.
Es stellte sich heraus, dass äussere Form und das was das Programm 
wirklich tat, nicht überein stimmte. Überflog man den Code, dann gewann 
man den Eindruck, dass es sich wohl um (ich glaube das war es) ein 
Sortierverfahren handelt. Tatsächlich war der Code aber ein 
Multiplexer/Demultiplexer und mit dem Präprozessor so verschleiert 
worden, dass man ohne tiefgreifende Analyse nicht erkennen konnte, worum 
es sich wirklich handelt. Das war für mich der Gipfel der Obfuscation 
und Irreführung.

von Mark B. (markbrandis)


Lesenswert?

Ja, da gibt's echt viele gute Sachen beim IOCCC. Schachprogramme, 
Raytracer, ... ich staune immer wieder aufs Neue was die Jungs da so 
alles hinbekommen in dem bisschen Code.

von Detlef K. (adenin)


Lesenswert?

Mark Brandis schrieb:
> Ach ja, wer Quellcode verschleiern möchte, der ist hier goldrichtig:
>
> http://www.ioccc.org/
>
> Wobei man getrost davon ausgehen kann, dass die Leute deren Code dort
> veröffentlicht wurde es auch ordentlich können :)

Wer macht mit, die wieder zu entschleiern? :)

Ich fang an: dlowe.c von 2013
Original:
1
main(a,b)char**b;{int c=1,d=c,e=a-d;for(;e;e--)_(e)<_(c)?c=e:_(e)>_(d)?d=e:7;
2
while(++e<a)printf("\xe2\x96%c",129+(**b=8*(_(e)-_(c))/(_(d)-_(c))));}
entschleiert:
1
main(argc, argv)
2
char**argv;
3
{
4
 int valuemin_idx = valuemax_idx = 1;
5
 int i = argc - 1;            //Anzahl der auszuwertenden Parameter
6
7
//alle Parameter von hinten durcharbeiten 
8
//wir suchen den Index des kleinsten und des größten Parameters
9
 for(;i ;i--)
10
  strtof(argv[i],0) < strtof(argv[valuemin_idx],0) ? valuemin_idx=i : strtof(argv[i],0) > strtof(argv[valuemax_idx],0) ? valuemax_idx=i : 7;
11
 
12
 
13
//alle Parameter von vorn durcharbeiten 
14
//die Parameterwerte werden skaliert und so als UFT-8 Code "e2 96 81" bis "e2 96 88" ausgegeben
15
 while(++i < argc)
16
  printf("\xe2\x96%c", 0x81 + (**argv = 8 * (strtof(argv[i],0) - strtof(argv[valuemin_idx],0)) / (strtof(argv[valuemax_idx],0) - strtof(argv[valuemin_idx],0))));
17
}

von Steffen R. (steffen_rose)


Lesenswert?

Rangi Jones schrieb:
> Wie kann ich im
> Linkerscript reinschreiben, das eine Funktion eine bestimmte Adresse
> besitzt?

Kommt auf den Linker an.

von Steffen R. (steffen_rose)


Lesenswert?

Helmut Lenzen schrieb:
> Wenn ich deine Lib nutzen muesste und da waere ein Problem drin wuerdes
> du entweder hier antraben oder das Teil fliegt raus.

Wenn das nur bei Open Source auch so wäre...

Das Argument, wenn ich es benötige soll ich mitarbeiten, wird immer 
wieder angebracht. Doch nicht jeder ist in der Lage in den Tiefen der 
KDE herumzuändern.

Insofern: Bei Problemen reicht es häufig nicht, den Sourcecode zu haben. 
Auch wenn unsere Kunden den Sourcecode haben muss ich trotzdem 
"antraben". Was auch Sinn macht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.