Entwickler-Ecke
Open Source Projekte - Das Multilevel-Rätsel. Die Auflösung
Gausi - Sa 23.12.06 01:23
Titel: Das Multilevel-Rätsel. Die Auflösung
Ich bin müde, möchte aber trotzdem für die Wachgebliebenen schon jetzt eine Lösungsvariante vorstellen. Ich denke, ich habe in dem Blog schon genug dazu gesagt.
Die richtigen Antworten sind
- Angelina Jolie
- Darth Vader
- Gollum
- Halle Berry
- Jessica Alba
- Keira Knightley
- Quark
- Yoda
Wie man darauf kommt - einfach in dem Programm die Buttons von oben nach unten durchklicken. Das einzige was man zusätzlich tun muss ist, in einem HexEditor nach dem String "MD5" zu suchen. Dass es so aussieht, als würde der zweite Hash mit JP.II anfangen, den Initialien des letzten Papstes, ist dabei reiner Zufall. Ich finds deshalb erwähnenswert, weil Angelina im letzten Moment eingesprungen ist, weil man bei Google für unsere erste Kandidatin etwas
zu freizügige Bilder gefunden hat.
Die "Bonusrunde" ist mit dabei. Die kann man übrigens auch mit
diesem Programm [
http://www.delphi-forum.de/topic_HideAndSeek++das+etwas+andere+SteganographieProgramm_56170.html] finden.
coder62 - Sa 23.12.06 01:54
hmm für die letzten 3 sowas inner art hatte ich probiert kam aber nix beirum und selbst jetzt wo ich die lösung habe versuche ich das nachzuvollziehen aber es kommt nur bei käse bei rum.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var i,i2:integer;
begin for i := 0 to 350 -1 do begin for i2 := 0 to 350 -1 do begin image2.Canvas.Pixels[ image1.Picture.bitmap.Canvas.pixels[i,0], image1.Picture.bitmap.Canvas.pixels[0,i2]] := image1.Picture.bitmap.Canvas.pixels[i,i2];
end; end; |
erzielt nicht das erwünschte ergebnis
das im anhang kommt raus und wenn ich nix übersehe ist das wie in der auflösung nur ne bisschen andere variablenname und so.
jaenicke - Sa 23.12.06 02:34
Hmm, sieht eigentlich auch richtig aus... Naja, ich werd meine Lösung bald posten.
Aber erstmal kommentiere ich noch ein wenig ;-).
coder62 - Sa 23.12.06 02:44
ja eigentlich hab ich es auch schon x mal mit der lösung verglichen und finde keine wirkliche fehler, aber bild im anhang beweist das irgendwas falsch ist hab nur keinen plan was.
jaenicke - Sa 23.12.06 02:49
Du kannst doch einfach mal dein ganzes Projekt posten, dann krieg ich schon raus, was falsch ist. Was mich irritiert sind die großen weißen Bereiche. Da frage ich mich, wo die her kommen...
Eigentlich ist das richtig herum, aber es sieht so aus, als wenn die Pixel genau an die falsche Stelle kommen. Versuch mal [0, i] und [i2, 0]... Obwohl das eigentlich verkehrt herum ist, aber du kannst es ja mal versuchen.
Du wendest das doch auf das Gitterbild an, oder?
coder62 - Sa 23.12.06 04:21
werde morgen noch mal draufschauen, bin sowas von erledigt.
und nur bezüglich dessen ist das alles an code, hab halt timage komponenten, lade da das gitter rein und führe dann per button die schleife aus, was eigentlich anhand der lösung auch genug sein sollte.
edit: mit dem vertauschen kurz noch probiert bringt aber auch nix.
edit2: ich werde mir auf immer und ewig in den allerwertesten beissen, kein wunder das ich das rätsel nicht knacken konnte, ich habe ne falsche datei die ganze zeit geladen die sieht dem orginal zwar sehr ähnlich aber den unterschied sieht man in der oben angehängten datei das ist zum :cry:
GTA-Place - Sa 23.12.06 10:15
Meine Prozedur für Halle und Co.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Get234ButClick(Sender: TObject); var Bitmap: TBitmap; X, Y: Integer; aCol: TColor; begin Bitmap := TBitmap.Create; Bitmap.LoadFromFile('C:\Gitter.bmp');
for Y := 0 to Bitmap.Height - 1 do for X := 0 to Bitmap.Width - 1 do begin aCol := Bitmap.Canvas.Pixels[X, Y]; aCol := GetGValue(aCol) shl 7; aCol := GetRValue(aCol) shl 7;
Bitmap.Canvas.Pixels[X, Y] := aCol; end;
Bitmap.SaveToFile('C:\Test.bmp'); Bitmap.Free; end; |
Je nachdem ob an der markieren Stelle R, G oder B stand, kam eine andere Person raus.
Meine Prozedur um die letzten 3 zu finden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| procedure TForm1.Get678ButClick(Sender: TObject); var Bmp1: TBitmap; Bmp2: TBitmap; Bmp3: TBitmap; Bmp4: TBitmap; X, Y: Integer; nX, nY: Integer; R, G, B: Integer; begin Bmp1 := TBitmap.Create; Bmp1.LoadFromFile('C:\Gitter.bmp');
Bmp2 := TBitmap.Create; Bmp2.Width := Bmp1.Width; Bmp2.Height := Bmp1.Height;
Bmp3 := TBitmap.Create; Bmp3.Width := Bmp1.Width; Bmp3.Height := Bmp1.Height;
Bmp4 := TBitmap.Create; Bmp4.Width := Bmp1.Width; Bmp4.Height := Bmp1.Height;
for Y := 1 to Bmp1.Width do for X := 1 to Bmp1.Height do begin R := GetRValue(Bmp1.Canvas.Pixels[X, Y]); G := GetGValue(Bmp1.Canvas.Pixels[X, Y]); B := GetBValue(Bmp1.Canvas.Pixels[X, Y]);
nX := Bmp1.Canvas.Pixels[X, 0]; nY := Bmp1.Canvas.Pixels[0, Y];
Bmp2.Canvas.Pixels[nX, nY] := RGB(R, R, R); Bmp3.Canvas.Pixels[nX, nY] := RGB(G, G, G); Bmp4.Canvas.Pixels[nX, nY] := RGB(B, B, B); end;
Bmp2.SaveToFile('C:\Quark.bmp'); Bmp3.SaveToFile('C:\Yoda.bmp'); Bmp4.SaveToFile('C:\Gollum.bmp');
Bmp1.Free; Bmp2.Free; Bmp3.Free; Bmp4.Free; end; |
Meine Prozedur um die verstecke Nachricht zu finden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.GetBonusClick(Sender: TObject); var FStream: TFileStream; Buffer: TBuffer; X: Integer; begin FStream := TFileStream.Create('C:\Jessica.txt', fmOpenRead); SetLength(Buffer, FStream.Size); FStream.Read(Buffer[0], Length(Buffer));
for X := 0 to Length(Buffer) - 1 do begin if (Ord(Buffer[X]) <> 32) AND (Ord(Buffer[X]) <> 64) then Memo1.Text := Memo1.Text + Chr(Ord(Buffer[X])); end;
FStream.Free; end; |
Dazu muss gesagt werden: Nachdem ich die einzelnen Bilder von Jessica und Co. gespeichert hatte, sind mir außer viele @ im Hexeditor noch Buchstaben aufgefallen. Diese zusammengesetzt ergaben den Bonus-Text ;-)
delfiphan - Sa 23.12.06 11:49
@coder62: Bei mir funktioniert dein Code.
@Gausi: Hab's eben selbst gemerkt, dass meine Behauptung falsch war und durch eine andere ersetzt ;)
Gausi - Sa 23.12.06 11:57
Nein. Die Koordinaten stecken eigentlich in der Farbinformation als ganzes drin. Eine Farbkomponenente reicht nicht aus, da das Bild größer als 256 ist. Die ersten 256 Zeilen/Spalten haben einen R-Wert von 0-255, G und B sind 0. Danach kommen die restlichen mit einem zusätzlichen Grünanteil von 1.
Im "sortierten" Bild erkennt man daher am Rand einen Balken, der von Schwarz langsam Rot wird, dann wieder zu Schwarz zurückspringt und wieder rötlich wird (mit einem nicht erkennbaren Stich ins Grüne).
Edit: Hier hat irgendwer was vorm Ansenden editiert...
GTA-Place - Sa 23.12.06 11:58
Beachte außerdem das Edit von ihm: Er hat das falsche Bild geladen.
TmpDir - Sa 23.12.06 13:14
Hier mal ein Ansatz für die Farbkanäle ohne Canvas.Pixel
@Rahmenfrage: Nimmt man nur den einen Farbkanal(Byte) des Rahmens, wo nur noch Nullen und Einsen übrig bleiben, kann man viel Spass haben, aus dem Binärcode eine Sinnvolle Nachricht zu machen. :roll:
mfg
BTW: Kann man eigentlich auf den Datenbereich eines Bitmap direkt Zugreifen? In den meisten Beiträgen die ich da gelesen habe, steht immer was von "sehr umständlich" oder "kompliziert, da durch Windows verwaltet..." und das will ich nicht glauben.
delfiphan - Sa 23.12.06 13:59
@TmpDir: Scanline der letzten Bildzeile = Anfangsadresse für das ganze Bitmap. Die Zeilen sind einfach jeweils DWord-aligned (bei 24-bit Bitmaps beachten) und auf dem Kopf gespeichert. Nach einer Änderung im Speicher musst du ggf Image1.Invalidate ausführen, damit es nach einer Änderung neu gezeichnet wird.
F34r0fTh3D4rk - Sa 23.12.06 20:53
würdest du uns den vorgang des erstellens dieses genialen rätsels schildern ? wie du es geschafft hast, so viele informationen in einer datei zu verstecken und wie der entwicklungsvorgang von statten gegangen ist. was du mit welchen tools gemacht hast etc ?
mfg
Gausi - Sa 23.12.06 21:29
Zum Teil habe ich das ja schon im Blog getan. Ich kann hier ja mal ein paar Codeschnipsel bringen.
Erster Schritt waren Grauwertbilder. Hab ich zwar auch selbst gemacht, aber das können andere Programme ebenso gut. Die drei Grauwertbilder hab ich pixelweise so zu einem zusammengefügt:
Delphi-Quelltext
1: 2: 3: 4:
| Image1.Picture.Bitmap.Canvas.Pixels[x,y] := (Image4.Picture.Bitmap.Canvas.Pixels[x,y] AND $FF0000) or (Image5.Picture.Bitmap.Canvas.Pixels[x,y] AND $00FF00) or (Image6.Picture.Bitmap.Canvas.Pixels[x,y] AND $0000FF); |
Das interessanteste ist wohl das Durcheinanderwürfeln dieses Bildes. Das passiert so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| var xarr, yarr: Array of Integer;
setlength(xarr,Image1.Width); for x := 0 to Image1.Width - 1 do begin Image1.Picture.Bitmap.Canvas.Pixels[x,0] := x; xarr[x] := x; end; setlength(yarr,Image1.Height); for y := 0 to Image1.Height - 1 do begin Image1.Picture.Bitmap.Canvas.Pixels[0,y] := y; yarr[y] := y; end;
for i := 1 to Image1.Width - 3 do begin x := i + random(Image1.Width-2 - i); tmp := xarr[i]; xarr[i] := xarr[x]; xarr[x] := tmp; end; for x := 0 to Image1.Width - 1 do for y := 0 to Image1.Height - 1 do Image4.Picture.Bitmap.Canvas.Pixels[xarr[x],yarr[y]] := Image1.Picture.Bitmap.Canvas.Pixels[x,y]; |
Man sieht vielleicht: Alles ein bissel Unsauber programmiert. Aber es läuft ;-)
Damit war das Gitter-Bild fertig. Auf dieses Bild wurden dann die Schwarz-Weißbilder drübergelegt. Das lief im Wesentlichen so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| for y := 1 to Image1.Picture.Bitmap.Height -1 do begin Source1 := Image1.Picture.Bitmap.Scanline[y]; Source2 := Image2.Picture.Bitmap.Scanline[y]; Destination := aBitmap.ScanLine[y]; for x := 1 to Image1.Picture.Bitmap.Width -1 do begin if Source2[3*x] = 255 then Destination[3*x] := Source1[3*x] or 1 else Destination[3*x] := Source1[3*x] AND 254; Destination[3*x+1] := Source1[3*x+1]; Destination[3*x+2] := Source1[3*x+2]; end; |
Dabei wurden die Schwarz-Weißbilder aus Farbbildern gedithert. Gibts bestimmt Programme für, ich habs mit dem Code gemacht, den ich
hier [
http://www.delphi-forum.de/viewtopic.php?p=276986#276986] schonmal gepostet habe.
Hashsummen und weitere Hinweise kamen dann per HxD (der Hexeditor hier ausm Forum) hinzu. Dann Rot13 drüber, und zuletzt das mp3 per HxD in die ersten beiden Zeilen.
Als Tools habe ich also schnell runterprogrammierte Eigenkreationen genommen, und HxD. Sonst nichts. Wenn man mal von dem WaveEditor/Recorder absieht, sowie VLC (damit hab ich EpisodeV abgespielt, in der das Zitat fällt). Damit hab ich das mp3 erstellt.
Tilman - So 24.12.06 02:34
Naja da das Rätsel nun vorbei ist kann ich als "verbrecher" des alternativen Weihnachts-Rätsels ja mal verraten wie ich die S/W-Bilder in den Channels verstekct habe bzw. man sie meiner Meinung nach finden sollte: habe die drei Kanäle R,G,B jeweils (als Integer-zahl) auf die nächstkleinere Zahl abgerundet, z.B. 1 auf 0, 99 auf 98 usw. Schwarze Pixel wurden dann +1 (=ungerade). Ferig der Lack. Braucht man also kein mod/div dafür, auch wenns damit eleganter geht :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!