Python Aufgabe meines Chefs Base64/Bytecode decoden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

Hallo
Ich habe mich hier angemeldet, weil ich Hilfe benötige. Ich mache meinen Lehre in einem privaten Unternehmen. Mein Chef ist ein kolerischer Mensch und macht mir das Leben nicht einfach. Seit ich seine Homepage gemacht habe denkt er ich könne alles. Momentan gängelt er mich mit einer Aufgabe die ich nicht lösen kann da mir die gesamten Ansätze zu fehlen und das was ich kann reicht nicht aus.
Er gab mir eine Python Datei welche je nach Einstellung Code in Base64 oder Bytecode codieren soll. Eh ich herausbekommen hatte, das der Kram unter Python 2.2.3 läuft und nicht unter 3.5 hat es ne Weile gedauert. Er möchte, dass der generierte Code wieder zurückgewandelt wird, als Bytecode und auch Base64 wieder entschlüsseln in den unverschlüsselten Code je nach Einstellung. Ich wollte noch paar Infos zu haben, aber da bekam ich die Aussage, "Geht Dich nichts an, mach was dir aufgetragen wird".
Ich bin zum Glück dieses Jahr fertig mit der Lehre, muss das leider noch aushalten.
Vielleicht könnt ihr mir helfen wenn es nicht zu viel eurer Zeit kostet.

Vielen Dank für´s lesen schon mal
Camelion

Code: Alles auswählen

##############
import sys
import base64 
import marshal
import re

## Binären Code zu erstellen
ByteCode=False
#ByteCode=True

#####################
code = """
#Code#
Hallo

"""

#####################
#print code
if ByteCode:
  data=compile(code,"<string>","exec")
  data=marshal.dumps(data)
  formel = "eval(__import__('marshal').loads(__import__('base64').decodestring('"+re.sub("\n","",base64.encodestring(data))+"')))"
else:
  formel = "eval(compile(__import__('base64').decodestring('"+re.sub("\n","",base64.encodestring(code))+"'),'<string>','exec'))"
open('output.txt','w').write(formel)

print "Datei erstellt"
BlackJack

@Camelion: Wenn ich mir den Code anschaue dann brauchst Du keine Hilfe mehr, da ist echt alles zu spät. :twisted: Erster wichtiger Tipp: Vergiss sofort die Existenz von `eval` und ``exec``.

Sorry, aber lern Python und kein Codegolf/-obfuscation, und frag Deinen Chef nach den Anforderungen an das Programm. Am besten soll er schriftlich festhalten was die Anforderungen an das Programm sind, so dass man das auch tatsächlich umsetzen kann. Falls er nicht willens ist über die Anforderungen zu sprechen bis Du die verstanden hast, dann kann man Deinem Chef nicht mehr helfen. Und Dir in der Beziehung dann auch nicht.
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

@BlackJack
Das hast Du glaube missverstanden, ich habe das nicht programmiert, das hat er mir so gegeben.
Wie ich schon schrieb, ist er kolerisch und ihm ist nicht mehr zu helfen. Ich kann es nachvollziehen, das auch mir nicht zu helfen ist, aber es ist schwer Lehrstellen zu bekommen und ich bin fast durch damit. Wie ich schon schrieb gibt er keine weiteren Ausküfnte, er meinte halt, der Code muss auch wieder rückwandelbar sein, mach mal. Ich mache einen Handwerkliche Lehre und hab in meiner Freizeit bissel mit html rumgespielt. Jetzt denkt er ich muss das können. Bekomm ich es nicht gebacken, lässt er sich irgendwelche Schikanen einfallen. Darf ich bestimmt wieder fegen oder Mülltonne reinigen. :evil:
Vielen Dank für deine schnell Antwort, auch wenn ich sie ein wenig sie ein wenig schroff war. Hoffe wenn Du mal hilfe benötigst, dass dir niemand mit lerne das und gut ist. Entschuldigung, dass ich um Hilfe gefragt habe, das die ganze Sache Scheisse ist weiß ich selber.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Camelion hat geschrieben:Ich mache einen Handwerkliche Lehre und hab in meiner Freizeit bissel mit html rumgespielt. Jetzt denkt er ich muss das können.
Huch, ich dachte bei deinem Eröffungspost, dass du eine Ausbildung im IT-Bereich machst und dein Chef einfach eine komische Art hat, Aufgaben an dich zu stellen. Dass du als Azubi im handwerklichen Bereich so etwas machen sollst, finde ich sehr merkwürdig. Naja, musst du selber wissen, ob du deine Ausbildung in so einem Betrieb fortsetzen möchtest. Ich hab meine damals auch durchgezogen, obwohl ich mich in dem Betrieb nicht wohl gefühlt habe und bereue es im Nachhinein.

Im Übrigen glaube ich, dass du BlackJack missverstanden hast: Seine Kritik bezog sich auf den Chef und nicht auf dich. Man sieht bei diesem extrem schlechten Code halt nicht, was da eigentlich gemacht werden soll. Hier im Forum gibt es zwar einige erfahrene Python-Programmierer, aber eine Glaskugel besitzen wir trotzdem nicht.
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

@snafu
Nein, leider nicht im IT Bereich. Gib mir Werkzeug und ich baue dir was. :)
Kennst Du nicht solche Menschen die einfach denken Sie sind Gott und denken befehlen zu können, so ist das leider.
Lehre abbrechen ist keine Option, ich hau nicht mehr als ein Jahr in die Tonne, wie schon erwähnt bin ich fast durch damit.
Ich lebe in einer recht kleinen Gemeinde, jeder kennt jeden, da bist froh wenn eine Lehrstelle gefunden hast in der heutigen Zeit.
Dann habe ich BlackJack sicher missverstanden. Sorry... Bin glaube wegen dem Scheiss ein wenig unausgeglichen, weil Schiss hab das nicht lösen zu können und das er mich hier schon beobachtet. :K

Ich kann den Code nicht einschätzen auf seine Qualität usw., er macht jedenfalls wohl das was er machen soll.
Er wandelt z.B. "Hallo" in
Base64 Code "CiNDb2RlIwpIYWxsbwoK"
oder
Bytecode "YwAAAAABAAAAcw4AAAB/AAB/AwBlAAABZAAAUygBAAAATigBAAAAcwUAAABIYWxsbygAAAAAKAAAAAAoAAAAAHMIAAAAPHN0cmluZz5zAQAAAD8DAHMAAAAA"

Nun soll halt dieses wieder zurück gewandelt werden in "Hallo".
Wenn man z.B. "YwAAAAABAAAAcw4AAAB/AAB/AwBlAAABZAAAUygBAAAATigBAAAAcwQAAABXZWx0KAAAAAAoAAAAACgAAAAAcwgAAAA8c3RyaW5nPnMBAAAAPwMAcwAAAAA=" bekommt und decodiert (das ist Bytecode) dann muss "Welt herauskommen. Natürlich ohne die "".
BlackJack

@Camelion: Wenn der Code da von Deinem Chef ist, dann muss der halt mal Python lernen. Der läuft nicht und ist zudem absolut sinnfrei, und zudem auch noch sauschlecht. Wenn Du nicht weisst was die Anforderungen an den Code sind und nur diese kryptischen Murks hast, dann ist die Aufgabe schlicht unlösbar, weil ja noch nicht einmal die Aufgabe selbst klar definiert ist. Die sogar so unsinnig in Form dieses Quelltextes, dass man noch nicht einmal *raten* kann was die eigentliche Aufgabe hätte sein sollen. Ich wüsste nicht wie man helfen können soll. :K

Das Hauptproblem scheint hier kein Python-Problem oder überhaupt ein technisches Problem zu sein. Das ist etwas was Du mit Deinem Chef ausmachen musst, eventuell unter Zuhilfenahme einer Person der Du vertraust und die er respektiert.

Die Beispiele die Du jetzt zeigst sehen aber anders aus als das was der Code macht, also kann der nicht machen was verlangt ist. Nach den Beispielen sieht es einfach aus als wenn Du einen Umwandler zwischen Binärdaten (Bytecode ist was anderes!) und Base64 schreiben sollst. Dafür gibt es das `base64`-Modul in der Standardbibliothek. Bleibt noch die Frage wie die Schnittstelle des Programms aussehen soll. An sich wäre *das* eine ziemlich simple Aufgabe, die man nach durcharbeiten des Grundlagentutorials in der Python-Dokumentation stemmen können sollte.

Edit: Okay, scheint doch nicht so einfach zu sein, die Daten sind offenbar nicht nur Base64-Kodiert, sondern wahrscheinlich tatsächlich auch noch mit `marshal` serialisiert. Wobei grundsätzlich eine blöde Idee ist, denn das Format ist undokumentiert (absichtlich) und nicht fest:
Details of the format are undocumented on purpose; it may change between Python versions (although it rarely does).
Die Daten von Python 2.2 lassen sich mit aktuellen Python-Versionen jedenfalls nicht mehr lesen, und keiner der bei Verstand ist, setzt noch Python 2.2 ein.
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

@BlackJack
Das mit meinem Cheff sollte jetzt hier nicht so zum Thema gemacht werden, das Leben ist halt kein Wunschprogramm. Ich muss damit leider noch leben. Wir können gerne weiter darüber diskutieren, hilft mir aber leider nicht wirklich weiter.

Ich kann jetzt nicht so wirklich nachvollziehen was nicht zu verstehen ist, denn selbst ich als absoluter Python Unwissender hab es verstanden und zum laufen bekommen.

Ich habe mir auf meinem Windows PC Python-2.2.3 installiert. In der Eingabeaufforderung gehe ich in den Python22 Ordner. Dort starte ich mit python.exe script.py das file. Diese generiert mit einen .txt datei die dann Inhalt

als Base64 verschlüsselt
eval(compile(__import__('base64').decodestring('CiNDb2RlIwpIYWxsbwoK'),'<string>','exec'))

oder als Bytecode

eval(__import__('marshal').loads(__import__('base64').decodestring('YwAAAAABAAAAcw4AAAB/AAB/AwBlAAABZAAAUygBAAAATigBAAAAcwUAAABIYWxsbygAAAAAKAAAAAAoAAAAAHMIAAAAPHN0cmluZz5zAQAAAD8DAHMAAAAA')))

enthält. Das funktioniert. Es wird das Hallo aus Code halt codiert nach der Formel. Das macht der Quellcode den ich oben angegeben habe.
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

BlackJack hat geschrieben: Edit: Okay, scheint doch nicht so einfach zu sein, die Daten sind offenbar nicht nur Base64-Kodiert, sondern wahrscheinlich tatsächlich auch noch mit `marshal` serialisiert. Wobei grundsätzlich eine blöde Idee ist, denn das Format ist undokumentiert (absichtlich) und nicht fest:
Details of the format are undocumented on purpose; it may change between Python versions (although it rarely does).
Die Daten von Python 2.2 lassen sich mit aktuellen Python-Versionen jedenfalls nicht mehr lesen, und keiner der bei Verstand ist, setzt noch Python 2.2 ein.
Das habe ich auch bemerkt, denn in Python 3.5 lief es nicht.
Meine Vermutung ist, er will Motorsteuergeräte umprogrammieren. Hab mal gesehen, dass er da alte Hardware hat die vermutlich auf ein altes Pyton irgendwie angewiesen ist. Er verrät halt nichts, warum auch immer.
Wie gesagt, er möchte das verschlüsselte mit der jeweiligen Formel wieder entschlüsselt haben, so seinen "Anforderung" :cry:
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Camelion hat geschrieben:Meine Vermutung ist, er will Motorsteuergeräte umprogrammieren. Hab mal gesehen, dass er da alte Hardware hat [...]. Er verrät halt nichts, warum auch immer.
Langsam wird mir klar, warum er nichts verraten will... Andererseits: wer wollte nicht schon einmal mit motorgetriebenen Maschinen arbeiten, deren Steuerung von einem fachfremden Azubi programmiert wurde.
In specifications, Murphy's Law supersedes Ohm's.
Camelion
User
Beiträge: 6
Registriert: Mittwoch 16. März 2016, 11:22

pillmuncher hat geschrieben:]Langsam wird mir klar, warum er nichts verraten will... Andererseits: wer wollte nicht schon einmal mit motorgetriebenen Maschinen arbeiten, deren Steuerung von einem fachfremden Azubi programmiert wurde.
Ich schrieb ich vermute, ob es dem wirklich entspricht weiß ich nicht. Ich programmiere da nichts, und es geht hier ja auch nicht um irgendwelche Steuercodes, sondern nur um die umwandlung und rückwandlung von Code.
Vielleicht will er auch seine Sky Box hacke oder codierte Liebesbriefe mit seiner Affäre austauschen. :mrgreen:

Aber wier landen immer wieder bei meinem Chef hier... :roll: :wink:
BlackJack

@Camelion: Nicht zu verstehen ist der Code. Ich wiederhole es gerne noch einmal: Der ist absoluter Murks, das würde kein Python-Programmierer so schreiben, es sei denn er möchte absichtlich krytischen Murks schreiben.

Deine Beschreibung klang ausserdem danach das es sich im komplementäre Funktionen handelt, was aber nicht der Fall ist. Der Code macht aus 'CiNDb2RlIwpIYWxsbwoK' vielleicht 'Hallo', aber da ist kein Code der daraus dann wieder 'CiNDb2RlIwpIYWxsbwoK' macht, denn beide haben als ersten Schritt eine Base64-Dekodierung.

Und das erste Beispiel verwendet kein `marshal`, sondern nur Sachen die auch ein aktuelles Python 2.7 kann, und das hast Du offensichtlich nicht zum Laufen bekommen, das führt nämlich zu einem `NameError` weil da nach der Base64-Dekodierung ein Name im Quelltext steht und keine Zeichenkette und dieser Name ist nicht definiert.

Mir ist aus den ganzen Beispielen jetzt auch immer noch nicht klar wie die Daten denn nun konkret vorliegen und was damit jeweils gemacht werden soll, denn Deine Angaben und Quelltext-Schnippsel widersprechen sich.

Es läuft also wieder darauf hinaus, dass die Aufgabe nicht hinreichend eindeutig spezifiziert ist, so dass man nur herumraten kann und nicht überprüfen kann ob man richtig geraten hat. Das kann letztendlich nur Dein Chef [auf|er]klären. Genau darum landen wir immer wieder bei Deinem Chef.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Camelion: Selbst, wenn es nur deine Vermutung ist, solltest du dich absichern, für den Fall, dass deine Vermutung zutrifft. Denn glaub mir: auch wenn du rechtlich nicht zur Verantwortung gezogen werden könntest, würdest du nicht wollen, dass jemand verletzt wird. Und ja: was du machen sollst, ist Programmierung. Was sollte es den sonst sein? Hasenjagd? Wäsche bügeln?

In Anbetracht all dessen scheint mir das kein Problem zu sein, das man mit Python lösen könnte, sondern eines, das nach der Hinzuziehung eines Anwalts für Arbeitsrecht schreit.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Chef-Schelte finde ich schwierig!
Über den Quellcode kann man den Thread-Steller finden, ist in meinem Umfeld mal passiert, dass ein Chef seinen Mitarbeiter über ein Posting im Netz fand. Das gab erhebliche Probleme.
Ich würde empfehlen, den Thread sauber zu löschen...
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

1) mit google nach

Code: Alles auswählen

eval(compile(__import__('base64').decodestring('"+re.sub("\n","",base64.encodestring(code)
bin ich hier gelandet
https://github.com/knxuf/buderus/blob/m ... mwasser.py
https://github.com/knxuf/buderus/blob/m ... s-Solar.py

2) Ich glaube dir eigentlich deine Geschichte nicht. Darum nehme ich an, dass du mit diser rührseligen Geschichte eigentlich nur versuchst, jemanden dazu zu bringen, dir den Code zu schreiben bzw, den Code zu analysieren.

3) Selbst wenn die Geschichte war wäre, wäre dein Problem dein Chef und nicht der Code. Ich würde dir auch dann nicht helfen, deinem Chef in den Hintern zu kriechen. Ich würde deinem Chef nicht ein Bit Code über diese Forum schenken. Wenn dein Chef dein Problem ist, ist hier das falsche Forum für Hilfe. Wende dich an deine Gewerkschaft oder eine andere geeignete Stelle.
Antworten