Hallo Liste, ich hab ein C-Programm, das wiederum Perl-Code generiert. Nun moechte ich diesen Code an den Perl-Interpreter pipen. "programm | /usr/bin/perl -" allerdings sollte das auszufuehrende Perl-Programm die "STDIN" von dem C-Programm vererbt bekommen. Da die Pipe zwischen dem C-Programm und dem Perl-Interpreter und nicht zum eigentlichen Perl-Programm aufgebaut wird, kann dieses jedoch nicht auf die STDIN des C-Programms zugreifen. Ich habe auch die Moglichkeit mittels "popen()" im C-Programm selbst eine Pipe zum Perl-Interpreter aufzubauen. Gibt es dann eine Moeglichkeit, zB: als Argument dem Perlprogramm die STDIN aus dem C-Programm heraus mitzuteilen, und wenn, kann dann das Perl-Programm darauf zugreifen, obwohl das C-Programm sich nach dem Abladen des Codes beendet ? Erich
* Erich Lindner schrieb am 10.Mai.2003:
ich hab ein C-Programm, das wiederum Perl-Code generiert. Nun moechte ich diesen Code an den Perl-Interpreter pipen.
"programm | /usr/bin/perl -"
allerdings sollte das auszufuehrende Perl-Programm die "STDIN" von dem C-Programm vererbt bekommen. Da die Pipe zwischen dem C-Programm und dem Perl-Interpreter und nicht zum eigentlichen Perl-Programm aufgebaut wird, kann dieses jedoch nicht auf die STDIN des C-Programms zugreifen.
Ich habe auch die Moglichkeit mittels "popen()" im C-Programm selbst eine Pipe zum Perl-Interpreter aufzubauen. Gibt es dann eine Moeglichkeit, zB: als Argument dem Perlprogramm die STDIN aus dem C-Programm heraus mitzuteilen, und wenn, kann dann das Perl-Programm darauf zugreifen, obwohl das C-Programm sich nach dem Abladen des Codes beendet ?
Du kannst eine Named Pipe erzeugen, oder Du kannst weitere Directiven erzeugen. Ob das alles so Sinnig ist, weiß ich allerdings nicht. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
On Son, 11 Mai 2003 at 07:18 (+0200), Bernd Brodesser wrote:
* Erich Lindner schrieb am 10.Mai.2003:
ich hab ein C-Programm, das wiederum Perl-Code generiert. Nun moechte ich diesen Code an den Perl-Interpreter pipen.
"programm | /usr/bin/perl -"
allerdings sollte das auszufuehrende Perl-Programm die "STDIN" von dem C-Programm vererbt bekommen. Da die Pipe zwischen dem C-Programm und dem Perl-Interpreter und nicht zum eigentlichen Perl-Programm aufgebaut wird, kann dieses jedoch nicht auf die STDIN des C-Programms zugreifen.
Ich habe auch die Moglichkeit mittels "popen()" im C-Programm selbst eine Pipe zum Perl-Interpreter aufzubauen. Gibt es dann eine Moeglichkeit, zB: als Argument dem Perlprogramm die STDIN aus dem C-Programm heraus mitzuteilen, und wenn, kann dann das Perl-Programm darauf zugreifen, obwohl das C-Programm sich nach dem Abladen des Codes beendet ?
Du kannst eine Named Pipe erzeugen, oder Du kannst weitere Directiven erzeugen. Ob das alles so Sinnig ist, weiß ich allerdings nicht.
Erich, ehrlich gesagt weiss ich auch nicht, was Du da bauen willst. Die Kommunikation per Pipe, so wie Du sie beschreibst (programm | perl -) verknüpft ja auch nicht stdin des C-Progrmms mit stdin von Perl, sondern _stdout_! Korrigier mich, wenn ich falsch liege, aber für mich sieht es so aus, dass Du offenbar das C-Programm nur als Wrapper um einen dynamisch generierten Perl-Code herum haben willst. Dann wäre IMHO der einzige Weg, dass Du wie von Bernd vorgeschlagen eine Named Pipe nutzt und diese im Perl-Code anstelle von stdin nutzt. Das Ganze würde ich dann aber nicht per Pipe verknüpfen, sondern den Perl-Interpreter per fork () starten und per dup () mit der Ausgabe des C-Programms versorgen. Wenn Du mal genauer schilderst, was Du vorhast, lässt sich vielleicht ein einfacherer Weg finden. Jan
Jan Trippler wrote:
Wenn Du mal genauer schilderst, was Du vorhast, lässt sich vielleicht ein einfacherer Weg finden.
Jan
Hallo Jan, du hast natuerlich recht mit dem Wrapper. Eigentlich wollte ich mein Vorhaben nicht breittreten, um unnoetigen Diskussionen aus dem Weg zu gehen, aber ich glaub das eine genauere Schilderung doch notwendig ist. Prinzipell geht es um einen Schutzmechanismus, um Perl-Code wirksam zu schuetzen, damit dieser nicht eingesehen werden kann. Unter Perl kann dazu auch das C-Backend oder der Byte-Coder benutzt werden, jedoch besteht da bei umfangreichen Perl-Programmen, wo etliche Module geladen werden ueberhaupt keine Chance ein lauffaehiges Programm zu erstellen, zumindest sind meine Bemuehungen gaenzlich gescheitert.Zudem wird bei erfolgreicher Uebersetzung nur experimenteller Code generiert. Also hab ich mir ein C-Programm geschrieben, mit dessen Hilfe ich verschluesselte Perl-Programme ausfuehren kann. Das heist, ich habe immer ein Programm-Paar: "Programm" -> das C-Programm "Programm.dat" -> der verschluesselte Perl-Code Wenn nun das "Programm" aufgerufen wird, liest es die gleichnamige Datei mit der Endung ".dat" ein, entschluesselt den Code und sendet diesen an den Perl-Interpreter. Fuer die Pipe nutze ich im C-Programm die Funktion "popen()". Bevor dies geschieht, wird der Perl-Interpreter untersucht, ob er es auch wirklich ist, um nicht einem gefaelschten Programm auf den Leim zu gehen. Aus dem gleichen Grund werden auch keinerlei externen Komandos oder Programme aufgerufen, dies ist alles im C-Programm implementiert. Die einzige Moeglichkeit die sich vieleicht eroeffnet, ist ueber den Shard-Memory Bereich an den entschluesselten Datenstrom zu gelangen, der ueber "popen()" benutzt wird. Man kann nun das C-Programm aufrufen, als waere es das Perl-Programm, und dabei spielt es keine Rolle ob dies mit Kommandozeilen-Argumenten oder als CGI-Programm geschieht. Dies funktioniert bei mir schon seit laengerem ohne jegliche Probleme. Nun der Schoenheitsfehler: Wenn das C-Programm als CGI-Programm aufgerufen wird, und Furmulardaten mit der standardmaesigen Sendemethode "GET" uebermittelt werden klappt noch alles. Bei groesseren Formularen wird aber fuer gewoehnlich die Sendemethode "POST" benutzt, wobei die Formulardaten dann dem CGI-Programm auf "STDIN" uebermittelt werden. Nun ist das C-Programm aber nicht das eigentliche CGI-Programm, sondern der auszufuehrende Perl-Code. Nun suche ich nach einer Moeglichkeit, nach der das Perlprogramm auf die Formulardaten zugreifen kann, die eigentlich auf der STDIN des C-Programms lauern. So, nun habe ich hoffentlich alle Klarheiten beseitigt :-) Erich
Hallo, [XMailed & f'up to suse-programming@suse.com] On Mon, 12 May 2003, Erich Lindner wrote:
Jan Trippler wrote:
Wenn Du mal genauer schilderst, was Du vorhast, lässt sich vielleicht ein einfacherer Weg finden. [..] Prinzipell geht es um einen Schutzmechanismus, um Perl-Code wirksam zu schuetzen, damit dieser nicht eingesehen werden kann. [..] Also hab ich mir ein C-Programm geschrieben, mit dessen Hilfe ich verschluesselte Perl-Programme ausfuehren kann. Das heist, ich habe immer ein Programm-Paar: "Programm" -> das C-Programm "Programm.dat" -> der verschluesselte Perl-Code
Du willst dir Filter::* anschauen ;) Du koenntest dann z.B. das "entschluesseln" in perl oder C als filter implementieren... [..]
Nun der Schoenheitsfehler: Wenn das C-Programm als CGI-Programm aufgerufen wird, und Furmulardaten mit der standardmaesigen Sendemethode "GET" uebermittelt werden klappt noch alles. Bei groesseren Formularen wird aber fuer gewoehnlich die Sendemethode "POST" benutzt, wobei die Formulardaten dann dem CGI-Programm auf "STDIN" uebermittelt werden. Nun ist das C-Programm aber nicht das eigentliche CGI-Programm, sondern der auszufuehrende Perl-Code.
Du wirst IMO nicht darum herumkommen, eine Datei zu verwenden, entweder fuer den perl-code oder fuer die Daten, oder ein Filter:: Modul zu implementieren... Oh, halt, du kannst wohl auch vielleicht noch mit Dateidescriptoren tricksen oder den code via -e als Argument an perl uebergeben. Ich denke, ein Filter::-Modul ist fuer dich am ehesten geeignet, siehe dazu perldoc Filter::decrypt: ==== DESCRIPTION This is a sample decrypting source filter. Although this is a fully functional source filter and it does implement a very simple decrypt algorithm, it is not intended to be used as it is supplied. Consider it to be a template which you can combine with a proper decryption algorithm to develop your own decryption filter. ==== Achso, grad seh ich: Filter::CBC bringt wohl schon Filter fuer Blowfish, Idea, Rijndael (AES), Twofish, DES, u.a. mit... -dnh -- Das kommt davon, wenn man bei dem regenwetter keine Mütze aufzieht. Dann weicht bei vielen das Gehirn auf. [WoKo in dag°]
On Mon, 12 Mai 2003 at 19:05 (+0200), Erich Lindner wrote: [C-Wrapper um verschlüsseltes Perl-Script]
Man kann nun das C-Programm aufrufen, als waere es das Perl-Programm, und dabei spielt es keine Rolle ob dies mit Kommandozeilen-Argumenten oder als CGI-Programm geschieht. Dies funktioniert bei mir schon seit laengerem ohne jegliche Probleme.
Nun der Schoenheitsfehler: [...] Bei groesseren Formularen wird aber fuer gewoehnlich die Sendemethode "POST" benutzt, wobei die Formulardaten dann dem CGI-Programm auf "STDIN" uebermittelt werden. Nun ist das C-Programm aber nicht das eigentliche CGI-Programm, sondern der auszufuehrende Perl-Code. Nun suche ich nach einer Moeglichkeit, nach der das Perlprogramm auf die Formulardaten zugreifen kann, die eigentlich auf der STDIN des C-Programms lauern.
Ich sehe 2 Varianten:
- Öffne im Perl-Script nicht stdin, sondern eine named Pipe. Öffne
im C-Programm die gleiche named Pipe und schicke stdin in diese
Pipe.
- die perverse Methode: Hänge alles, was das C-Programm per stdin
gekriegt hat, als __DATA__ Sektion an das Perlscript an, das
kannst Du dann über <DATA> lesen (dieser Kanal ist offen).
Das ist aber beides nur IMHO-Modus, habe ich selbst noch nie probiert.
...
10 Minuten später:
Tatsache, zumindest Version 2 funktioniert:
jan@k500:~/tmp> cat pprog.c
#include
Hallo, On Mon, 12 May 2003, Jan Trippler wrote:
On Mon, 12 Mai 2003 at 19:05 (+0200), Erich Lindner wrote: [C-Wrapper um verschlüsseltes Perl-Script] [..] Ich sehe 2 Varianten: - Öffne im Perl-Script nicht stdin, sondern eine named Pipe. Öffne im C-Programm die gleiche named Pipe und schicke stdin in diese Pipe.
Sollte gehen.
========
$ mknod -m 600 PERLFIFO p
$ cat ./perlfifo.c
#include
- die perverse Methode: Hänge alles, was das C-Programm per stdin gekriegt hat, als __DATA__ Sektion an das Perlscript an, das kannst Du dann über <DATA> lesen (dieser Kanal ist offen).
Wueso is das pervers? Ist doch schick ;) Zumindest solange das
perlscript eh immer generiert wird sprich nix dagegen, da jeweils auch
noch die Daten in __DATA__ anzuhaengen ;)
========
$ cat perldata.c
#include
participants (4)
-
B.Brodesser@t-online.de
-
David Haller
-
Erich Lindner
-
Jan.Trippler@t-online.de