Seite 1 von 2

Verfasst: Dienstag 24. Februar 2009, 23:48
von hendrikS
derdons korrigierte Lösung ist richtig.
Ist ja eigentlich eine extrem einfache Methode n über k zu berechnen.

Edit:Wenn man sich die Fakultäten aus n über k mal aufschreibt und dann kürzt kommt man genau auf derdons korrigierte Lösung.

Verfasst: Mittwoch 25. Februar 2009, 06:30
von Crackus
>>> from __future__ import division
>>> (6/49) * (5/48) * (4/47) * (3/46) * (2/45) * (1/44)
7.1511238420185173e-08

das ist richtig
das heißt die warscheinlichkeit im lotto zu gewinnen beträgt 7.1511238420185173e-06%
und die warscheinlichkeit das du gewinnst liegt bei 1 / 13983815.999999998 also etwa 1/14mio

also meine rechnung war schon richtig und bei dem quelllcode kann man ne menge sparen
z.B. (ist mir gestern abend noch aufgefallen) mehrere male global
import timer ist in der version auch nicht nötig
noch ein bissl mehr muss weg bye

Verfasst: Mittwoch 25. Februar 2009, 08:07
von BlackJack
@Crackus: Da sollte man sich *alle* ``global`` sparen, die durchnummerierten Namen durch eine geeignete Datenstruktur, zum Beispiel `list` ersetzen und diese ganzen Wiederholungen von nahezu identischem Quelltext durch (echte) Funktionen und Schleifen ersetzen.

Re: naya

Verfasst: Mittwoch 25. Februar 2009, 12:11
von tordmor
Crackus hat geschrieben:http://paste.pocoo.org/show/105246/
:shock: :shock:

Code: Alles auswählen

import random

population = range(1, 50)
target = (1, 2, 3, 4, 5, 6)
sample = None
count = 0

while sample != target:
    sample = tuple(sorted(random.sample(population, 6)))
    count += 1

print "Gotcha! (%d)" % count

okay das triffts perfekt

Verfasst: Mittwoch 25. Februar 2009, 13:56
von Crackus
okay das passt ich kenne einige Befehle daraus noch nicht (lerne noch nicht solange python)
und wollte eigentlich nur durch ein Programm den random befehl vertiefen und deswegen ein "kleines" Programm geschrieben was lotto simuliert.
habe dass dann schnell in eine endlosschleife getan und fertig.
aber ich finde es sehr schön das leute nicht nur sagen das kann man verbessern (was mir auch hilft) sondern auch mal einen sauberen und sehr professionellen Code reinstellen
Vielen dank an tordmor

ich werde das Programm noch mit einem hash versehen und hochladen (kann leider kein C um den Hash zu machen :( sry)

Vielen dank für Vorschläge und Verbesserungen#

PS: Rekord liegt immer noch bei 1.900.000

Edit: Vieleicht kann hier irgendwer den kleinen abschnitt in C schreiben und mir die Source zuschicken???
Müsste ich es nur noch in den Pythoncode implentiert kriegen^^
Aber das schaffe ich!!! hoffe ich
ansonsten hätte ich ya ein sehr nettes Forum was mir hoffentlich helfen würde^^

Re: okay das triffts perfekt

Verfasst: Mittwoch 25. Februar 2009, 14:31
von Trundle
Crackus hat geschrieben:PS: Rekord liegt immer noch bei 1.900.000
Dann unterbiete ich das mal: Ein Versuch, Hash ist 23be5da22193ca74d2bf7c6a5322a0a6. Bin ich jetzt ein Glückspilz oder ein Spielverderber?

Verfasst: Mittwoch 25. Februar 2009, 14:32
von Leonidas
Hmm? Was soll denn der C-Abschnitt machen?

Oo??

Verfasst: Mittwoch 25. Februar 2009, 14:46
von Crackus
@ Trundle wie haste das gemacht???
habe ich i-wo den salt reingeschrieben?? kann man die *.so oder die *.exe dateien
entschlüsseln??

@Leonidas
hmm das programm sollte die variable count übernehmen salt dazu md5 hash daraus machen und das wieder ans pythonscript übergeben dann könnte man das script reinsetzen und ne mini C-File

Re: Oo??

Verfasst: Mittwoch 25. Februar 2009, 15:00
von Leonidas
Crackus hat geschrieben: habe ich i-wo den salt reingeschrieben?? kann man die *.so oder die *.exe dateien
entschlüsseln??
Die Shared Objects sind unnötig, da das Executable statisch gelinkt ist und ja, dein Salt steht in der Datei drin und lässt sich mit einem Debugger auslesen.
Crackus hat geschrieben:hmm das programm sollte die variable count übernehmen salt dazu md5 hash daraus machen und das wieder ans pythonscript übergeben dann könnte man das script reinsetzen und ne mini C-File
Das hat genau das gleiche Problem wie dein erster Ansatz. Ist sogar noch einfacher weil das Executable viel überschauberer ist als dein 1,7 MB großer BLOB.

py2exe

Verfasst: Mittwoch 25. Februar 2009, 20:12
von Trundle
Es wurde schon desöfteren hier im Forum darauf hingewiesen, dass py2exe, PyInstaller etc. keinen Schutz bieten, sondern dafür gedacht sind, dass man Python-Skripte auf Maschinen ausführen kann, auf denen kein Python installiert ist. Also dachte ich mir, dass man das doch einmal demonstrieren könnte.

PyInstaller war neu für mich, ich hatte mich zuvor nur bereits einmal ausgiebig mit py2exe befasst, aber vom Grundprinzip arbeiten die alle gleich und unterscheiden sich eben in den Details. Der Versuch, die ausführbare Datei mit 7zip zu entpacken, schlug fehl, also ist es nicht einfach ein zip-Archiv, das an die exe (bestehend aus dem Bootstrapping-Code) gehängt wird. Also habe ich in den Code von PyInstaller geschaut, um zu sehen, wie dein Skript zum Ausführen vorbereitet wird und dann ausgeführt wird. Da ich mich nicht mit den tiefsten Interna von PyInstaller befassen wollte, habe ich mich dazu entschlossen, an den Code mit Hilfe eines Debuggers (gdb) zu gelangen, da ich mich damit nicht mit dem Entpacken befassen muss. Hilfreich dabei war, dass PyInstaller mit Debug-Informationen gebaut war, die PyInstaller-Version dazu zu erraten, war nicht weiter schwer. Es hat dann also einfach gereicht, einen Breakpoint auf "launch.c:854" zu setzen, dort wird nämlich das Skript dann ausgeführt (``PyRun_SimpleString(data)``) und man kann sich den Inhalt von `data` einfach ausgeben lassen, was in dem Fall dann einfach das Skript ist. Es ist also sogar extrem einfach, an den Hash zu kommen, man muss sich nicht einmal mit Bytecode herumschlagen.

Später, nach weiterer Betrachtung des PyInstaller-Codes, habe ich dann noch diesen Entpacker geschrieben, mit dem man sehr einfach an den Quelltext von deinem Skript kommt, ohne sich mit einem Debugger herumschlagen zu müssen oder die ausführbare Datei irgendwie ausführen zu müssen.

krass

Verfasst: Mittwoch 25. Februar 2009, 21:19
von Crackus
krass ich hab zwar nur die hälfte verstanden aber echt krass^^
okay das heißt wenn man etwas wirklich "geheim" halten will sollte man noch C lernen um Python optimal gebrauchen zu können (Java file also *.class kann man sich auch anschauen ((oder??)) )
naya C wollte ich mir so oder so mal anschauen
Gibt es noch eine andere möglichkeit pythonabschnitte zu verschlüsseln??

Verfasst: Mittwoch 25. Februar 2009, 21:23
von derdon
Warum möchtest du das machen? Es gab schon häufiger Diskussionen dazu hier im Forum (im Wiki gibt es auch eine Seite, die "Aufklärung betreibt"). Was gefällt dir an Open Source nicht? Denke mal darüber nach, wie du deine Zeit besser investieren kannst: Indem du dich fragst, wie man 1. Programme "verschlüsseln" kann oder 2. gute Programme schreiben kann, von denen viele andere Menschen profitieren können.

Re: krass

Verfasst: Mittwoch 25. Februar 2009, 21:56
von BlackVivi
Crackus hat geschrieben:krass ich hab zwar nur die hälfte verstanden aber echt krass^^
okay das heißt wenn man etwas wirklich "geheim" halten will sollte man noch C lernen um Python optimal gebrauchen zu können (Java file also *.class kann man sich auch anschauen ((oder??)) )
naya C wollte ich mir so oder so mal anschauen
Gibt es noch eine andere möglichkeit pythonabschnitte zu verschlüsseln??
Selbst C lässt sich Deassemblieren... Damit wird zumindest ungefähr klar, was passiert. Nützen tuts dann nicht viel, aber wenn man etwas _wirklich_ erfahren will, kann man es so. Java lässt sich auch wieder Entschlüsseln, aber dann sind alle Kommentare und Variablennamen und sowas weg... Also relativ schwer dann zu verstehen. Ich halt das alles sowieso für nicht so sinnvoll...

Es ist besser, wenn alle von deinem Quellcode profitieren.

Verfasst: Mittwoch 25. Februar 2009, 22:00
von Rebecca
Crackus: Das mit dem "verschluesseln" eines Programm ist ein prinzipielles Problem: Du kannst ein Programm nicht wirkungsvoll verschluesseln, da der Benutzer es zum Ausfuehren ja wieder entschluesseln muss.

Verfasst: Mittwoch 25. Februar 2009, 22:25
von numerix
hendrikS hat geschrieben:@Cofi: Apropos Golf: Postings für n über k kleiner 54 Bytes sind natürlich wilkommen :)
Mit allem drum und dran? Eingabe und Ausgabe über stdin/stdout?
Oder nur eine Funktion noverk(n,k)?

Verfasst: Mittwoch 25. Februar 2009, 22:44
von hendrikS
numerix hat geschrieben:Mit allem drum und dran? Eingabe und Ausgabe über stdin/stdout?
Oder nur eine Funktion noverk(n,k)?
Eingabe über stdin: Format: n,k
Ausgabe stdout

Verfasst: Donnerstag 26. Februar 2009, 00:03
von BlackJack
@BlackVivi: Bei Java sind die Variablennamen fast alle noch da, es sei denn man macht aktiv etwas dagegen, in dem man zum Beispiel "Obfuscator"-Programme von Drittanbietern drüber laufen lässt.

Nur lokale Namen in Methoden sind in der Regel weg, an ``private``-Namen kommt man aber dran.

Verfasst: Donnerstag 26. Februar 2009, 01:26
von BlackVivi
BlackJack hat geschrieben:@BlackVivi: Bei Java sind die Variablennamen fast alle noch da, es sei denn man macht aktiv etwas dagegen, in dem man zum Beispiel "Obfuscator"-Programme von Drittanbietern drüber laufen lässt.

Nur lokale Namen in Methoden sind in der Regel weg, an ``private``-Namen kommt man aber dran.
Ich meine gelesen zu haben, dass der Java-Compiler einen Obfuscator anwendet... Hab mich wohl verlesen. Vielen Dank, dass du mich aufgeklärt hast :) Haben wir uns wohl gegenseitig in diesem Thread aufgeklärt :P

Das macht die ganze Javageschichte ja noch unsicherer. Aber ich find diesen ganzen Codeschutz in 99.99% eh unnütz. Wenn deine Idee so gut ist, verdienst du damit Geld, egal ob jemand dir deinen Code stiehlt.. denn damit du so eine einzigartige Idee erstellst, dass sie schützenswert ist, musst du schon recht ... klug und gewitzt sein. Und solche Leute kommen eigentlich immer weiter im Leben oO'

Re: krass

Verfasst: Donnerstag 26. Februar 2009, 01:30
von Leonidas
Crackus hat geschrieben:krass ich hab zwar nur die hälfte verstanden aber echt krass^^
Ja, ich habs selbst versucht, aber auf die Idee mit dem Debugger bin ich nicht gekommen. "Viel zu lernen du noch hast" wäre das Motto für mich heute.
Crackus hat geschrieben:okay das heißt wenn man etwas wirklich "geheim" halten will sollte man noch C lernen
Und wo ist C an dieser Stelle sicherer. Hast du schonmal überlegt, wie Cracker vorgehen? Viele von den gecrackten Programmen sind in C geschrieben. Sogar solche die aufwendiger geschützt sind als sich nur auf Binärcode in dem der Algorithmus versteckt ist zu stützen.
C zu lernen ist sinnvoll, aber nicht aus diesen Gründen.
Crackus hat geschrieben:um Python optimal gebrauchen zu können
Wo hat Geheimhaltung von Code was mit der optimalen Nutzbarkeit von einer Programmiersprache zu tun? Sieh es ein: wenn du nicht schon Schutz auf der Hardware implementierst, wie einige Konsolen das machen hast du überhaupt keine Chance deine Geheimnisse in inrgenwelchen Binärdateien zu verstecken. Ein talentierter, motivierter Angreifer wird dahinterkommen, siehe auch die Konsolen-Hacks.

Auch Chips bieten keinen effektiven Schutz. In einer c't-Ausgabe ist ein faszinierender Artikel wie Bazahlkarten-Chips geknackt wurden indem die Chips Stück für Stück auseinandergenommen worden sind und der Algorithmus rekonstruiert wurde und dann ausgehebelt wurde.