CWS -> SWF

CWS -> SWF

am 24.11.2006 18:00:27 von Ferry Bolhar

Hallo,

gibt es zufällig ein Modul, mit dem man .cws (komprimierte
Macromedia Flash) Dateien in die ursprünglichen .swf
Dateien zurückwandeln kann?

Im CPAN habe ich zwar etliche Module zum Bearbeiten von
..swf-Dateien gefunden, aber nichts über .cws Dateien.

Danke für eure Antworten und schöne Grüße,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: CWS -> SWF

am 24.11.2006 20:47:46 von Christian Winter

Ferry Bolhar schrieb:
> gibt es zufällig ein Modul, mit dem man .cws (komprimierte
> Macromedia Flash) Dateien in die ursprünglichen .swf
> Dateien zurückwandeln kann?
>
> Im CPAN habe ich zwar etliche Module zum Bearbeiten von
> .swf-Dateien gefunden, aber nichts über .cws Dateien.

Keine Ahnung, aber wenn Du die ersten 8 Bytes wegzwackst
solltest Du den Rest mit Compress::Zlib entpacken können
(Bytes 1..3 = "CWS", Byte 4 = Version, Bytes 5..8 = Größe)
und nach dem Zusammenfügen (CWS durch SWF ersetzen) wieder
eine SWF-Datei haben.

Viele Grüße
-Christian

Re: CWS -> SWF

am 29.11.2006 00:37:07 von Marc Nause

Christian Winter wrote:

> Keine Ahnung, aber wenn Du die ersten 8 Bytes wegzwackst
> solltest Du den Rest mit Compress::Zlib entpacken können
> (Bytes 1..3 = "CWS", Byte 4 = Version, Bytes 5..8 = Größe)
> und nach dem Zusammenfügen (CWS durch SWF ersetzen) wieder
> eine SWF-Datei haben.

Müsste man nicht CWS durch FWS ersetzen? Soweit ich weiß, ist das die
korrekte Signatur einer unkomprimierten SWF-Datei. Oder irre ich da?

Gruß

marc

--
http://low.audioattack.de
http://yacy.audioattack.de

Re: CWS -> SWF

am 29.11.2006 09:12:11 von Ferry Bolhar

Marc Nause:

> Müsste man nicht CWS durch FWS ersetzen? Soweit ich weiß, ist das die
> korrekte Signatur einer unkomprimierten SWF-Datei. Oder irre ich da?

Die fragliche Datei beginnt mit 'CWS', das vierte Byte ist 08.
Mit einem 'file' erhalte ich

Macromedia Flash data (compressed), version 8

als Ausgabe. Daher vermute ich, dass es sich um eine solche Datei
handelt, zumal sie auch mit in eine HTML-Datei eingebunden
und im Browser dargestellt werden kann.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: CWS -> SWF

am 29.11.2006 09:22:03 von Marc Nause

Ferry Bolhar wrote:

> Die fragliche Datei beginnt mit 'CWS', das vierte Byte ist 08.
> Mit einem 'file' erhalte ich
>
> Macromedia Flash data (compressed), version 8

Hallo,

ich habe mich wohl etwas missverständlich ausgedrückt. Ich meinte, dass nach
dem Entpacken die ersten 3 Byte nicht durch SWF (wie von Christian
geschrieben), sondern durch FWS zu ersetzen sein müssten.

Gruß

Marc

--
http://low.audioattack.de
http://yacy.audioattack.de

Re: CWS -> SWF

am 29.11.2006 11:36:45 von Christian Winter

Marc Nause schrieb:
> Ferry Bolhar wrote:
>> Die fragliche Datei beginnt mit 'CWS', das vierte Byte ist 08.
>> Mit einem 'file' erhalte ich
>>
>> Macromedia Flash data (compressed), version 8
>
> ich habe mich wohl etwas missverständlich ausgedrückt. Ich meinte, dass nach
> dem Entpacken die ersten 3 Byte nicht durch SWF (wie von Christian
> geschrieben), sondern durch FWS zu ersetzen sein müssten.

Stimmt. Hatte ich nicht mehr im Kopf, aber das File muss mit
"FWS" anfangen.

-Christian

Re: CWS -> SWF

am 29.11.2006 17:59:05 von Ferry Bolhar

Hallo,

> Keine Ahnung, aber wenn Du die ersten 8 Bytes wegzwackst
> solltest Du den Rest mit Compress::Zlib entpacken können
> (Bytes 1..3 = "CWS", Byte 4 = Version, Bytes 5..8 = Größe)
> und nach dem Zusammenfügen (CWS durch SWF ersetzen) wieder
> eine SWF-Datei haben.

Ich habe das jetzt mal probiert:

tail -c+9 file.swf > file.gz

Da fehlen jetzt die ersten 8 Bytes (ja, fragt mich nicht, wieso man
9 angeben muss, mit 8 fehlen nur die sieben ersten!).

Jetzt habe ich folgendes Script (zlib.pl):

use strict;
use warnings;
use Compress::Zlib;
foreach my $file (@ARGV) {
my $buffer;
my $gz = gzopen($file,"rb") or die "Failed to open $file: $gzerrno!\n";
print $buffer while $gz->gzread($buffer) > 0;
die "Error reading from $file: $gzerrno\n" if $gzerrno;
$gz->close();
}

Das lasse ich jetzt laufen:

perl zlib.pl file.gz >file.new

Das Ergebnis ist - dasselbe File. Es ist gleich groß und hat denselben
Inhalt.

Wenn ich ein

zcat file.gz

mache, bekomme ich:

zcat: file.gz: not in gzip format

Möglicherweise reicht das Entfernen des 8-Byte-Vorspanns
doch nicht? Oder mache ich etwas in dem Skript (das ansonsten
fehlerfrei läuft) falsch?

Schöne Grüße,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: CWS -> SWF

am 29.11.2006 18:43:02 von Paul Hink

Ferry Bolhar wrote:

> tail -c+9 file.swf > file.gz
>
> Da fehlen jetzt die ersten 8 Bytes (ja, fragt mich nicht, wieso man 9
> angeben muss, mit 8 fehlen nur die sieben ersten!).

Die Manpage ist diesbezüglich eigentlich recht eindeutig:

| -c, --bytes=N
| output the last N bytes

| [...]

| If the first character of N [...] is a `+', print beginning
| with the Nth item from the start of each file

Paul

Re: CWS -> SWF

am 30.11.2006 10:10:00 von Christian Winter

Ferry Bolhar schrieb:
> Hallo,
>
>> Keine Ahnung, aber wenn Du die ersten 8 Bytes wegzwackst
>> solltest Du den Rest mit Compress::Zlib entpacken können
>> (Bytes 1..3 = "CWS", Byte 4 = Version, Bytes 5..8 = Größe)
>> und nach dem Zusammenfügen (CWS durch SWF ersetzen) wieder
>> eine SWF-Datei haben.
>
[...]
>
> use strict;
> use warnings;
> use Compress::Zlib;
> foreach my $file (@ARGV) {
> my $buffer;
> my $gz = gzopen($file,"rb") or die "Failed to open $file: $gzerrno!\n";
> print $buffer while $gz->gzread($buffer) > 0;
> die "Error reading from $file: $gzerrno\n" if $gzerrno;
> $gz->close();
> }
>

Du musst compress()/uncompress() verwenden, nicht gzip.
Das folgende Script funktioniert bei mir, um komprimierte
Flash-Files auszupacken:

------------------------------------------------------------ ------
#!/usr/bin/perl
#
# cws2swf.pl INFILE OUTFILE
# Convert compressed flash file to uncompressed.

use strict;
use warnings;
use Compress::Zlib;

die "Wrong arguments!"
unless( 2 == scalar @ARGV && -f $ARGV[0] );

open(I, "<", $ARGV[0] ) or die $!;
open(O, ">", $ARGV[1] ) or die $!;

binmode I;
binmode O;

my $src;

read( I, $src, (stat $ARGV[0])[7] );
close I;

my $dest = uncompress( substr( $src, 8 ) );

print O "FWS" , chr(6) , pack('I', length($dest) + 8 );
print O $dest;

close O;
------------------------------------------------------------ ------

HTH
-Christian

Re: CWS -> SWF

am 30.11.2006 14:39:59 von Christian Winter

Christian Winter schrieb:
> print O "FWS" , chr(6) , pack('I', length($dest) + 8 );

Muss natürlich
print O "FWS" , chr(6) , pack('L', length($dest) + 8 );
heissen, es gibt ja nicht nur 32Bit-Int-Systeme.