Autor |
Beitrag |
Gausi
Beiträge: 8535
Erhaltene Danke: 473
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 23.12.06 01:23
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 finden.
Einloggen, um Attachments anzusehen!
_________________ We are, we were and will not be.
|
|
coder62
Hält's aus hier
Beiträge: 29
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Hält's aus hier
Beiträge: 29
|
Verfasst: 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
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Hält's aus hier
Beiträge: 29
|
Verfasst: 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
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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:
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
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
Zuletzt bearbeitet von delfiphan am Sa 23.12.06 12:00, insgesamt 1-mal bearbeitet
|
|
Gausi
Beiträge: 8535
Erhaltene Danke: 473
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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...
_________________ We are, we were and will not be.
Zuletzt bearbeitet von Gausi am Sa 23.12.06 11:58, insgesamt 1-mal bearbeitet
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Sa 23.12.06 11:58
Beachte außerdem das Edit von ihm: Er hat das falsche Bild geladen.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
TmpDir
Beiträge: 53
Erhaltene Danke: 3
Win7HP Win8.1 Deb/Ubuntu
C# [Delphi 6 Pro, Delphi 2005 PE, TurboDelphi PE]
|
Verfasst: 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.
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.
Einloggen, um Attachments anzusehen!
_________________ repeat until
|
|
delfiphan
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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.
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 23.12.06 20:43
Titel: Sooo, hier meine Lösung
Hallo!
Ich hatte alles einzeln, aber jetzt hab ich dadraus ein richtiges Lösungstool gemacht. Es zeigt einem ALLE 8 Lösungen (bis auf das Bonusrätsel eben) an.
Hier ein Screenshot:
Sorry, dass das Fenster etwas groß ist, aber bei 1024er Auflösung geht es gerade. Am besten gehts mit 1152er oder mehr...
Und hier der Download (selbstverständlich Exe + Quelltext, keine Komponenten müssen installiert werden, sollte ab Delphi 4 gehen):
www.buchmanager-berl...%20by%20jaenicke.zip
Mirror 1 (Direktlink): www.sj-berlin.de/dow...%20by%20jaenicke.zip
Mirror 2 (Direktlink): [url]http://www.jänicke.at/downloads/df/a7d09a3s19d/Multilevel%20by%20jaenicke.zip[/url]
(Der Mirror 2 geht wegen des Umlauts z.B. im Free Downloadmanager nicht...)
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
Beiträge: 8535
Erhaltene Danke: 473
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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:
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 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.
_________________ We are, we were and will not be.
|
|
jaenicke
Beiträge: 19276
Erhaltene Danke: 1741
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 23.12.06 21:30
Wie er das gemacht hat hat Gausi doch schon im Blog geschrieben...
// EDIT: Gerade hab ich mich gewundert, warum noch keiner geantwortet hat...
|
|
Tilman
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
|