Thursday 7 September 2017

0x49 Binary Options


Hat jemand eine Idee, wie man jede Ressource-Datei direkt in die ausführbare Datei oder die freigegebene Bibliotheksdatei mithilfe von GCC kompilieren Zum Beispiel Id wie Bilddateien hinzufügen, die nie ändern (und wenn sie tun, Id müssen die Datei sowieso ersetzen) und wouldnt wollen Sie im Dateisystem herumzulügen. Wenn dies möglich ist (und ich denke, es ist, weil Visual C für Windows dies auch tun kann), wie kann ich die Dateien, die in der eigenen Binärdatei gespeichert sind, lädt die ausführbare Datei selbst analysieren, finden Sie die Datei und extrahieren die Daten aus Es vielleicht theres eine Option für GCC ich havent noch gesehen. Mit Suchmaschinen nicht wirklich spucken die richtigen Sachen. Ich würde dieses benötigen, um für geteilte Bibliotheken und normale ELF-executables zu arbeiten. Jede Hilfe wird geschätzt Gibt so etwas wie: Für die Kompatibilität mit anderen Code können Sie dann entweder fmemopen, um eine regelmäßige FILE-Objekt oder alternativ std :: stringstream zu einem iostream zu machen. Std :: stringstream ist nicht gut für diese aber und Sie können natürlich nur einen Zeiger überall können Sie einen Iterator verwenden. Wenn youre, das dieses mit automake verwendet, vergessen Sie nicht, BUILTSOURCES entsprechend zu setzen. Die schöne Sache über es auf diese Weise ist: Sie erhalten Text aus, so kann es in der Versionskontrolle und Patches sinnvoll sein Es ist portabel und gut definiert auf jeder Plattform beantwortet Ich bin gewachsen, um das Steuerelement bevorzugen John Ripleys Montage. incbin basierte Lösung bietet und nun eine Variante auf, dass. Ich habe objcopy (GNU binutils) verwendet, um die binären Daten aus einer Datei foo-data. bin in den Datenabschnitt der ausführbaren Datei zu verknüpfen: Dies gibt Ihnen eine foo-data. o Objektdatei, die Sie in Ihre ausführbare Datei verknüpfen können. Die C-Schnittstelle sieht so aus, so dass Sie Dinge wie tun können Wenn Ihre Zielarchitektur besondere Einschränkungen hinsichtlich der Speicherung konstanter und variabler Daten aufweist oder Sie diese Daten im. text-Segment speichern möchten, damit es in denselben Speichertyp passt Als Programmcode können Sie mit den objcopy-Parametern einige mehr spielen. Antwort # 1 am: April 11, 2010, um 12:22 Uhr gute Idee In meinem Fall ist es nicht sehr nützlich. Aber das ist etwas, was ich wirklich in meine Schnipsel-Sammlung bringen werde. Dank für das Teilen dieses ndash Atmocreations It39s ein wenig einfacher, ld zu verwenden, da das Ausgabeformat dort angedeutet wird, sehen Sie stackoverflow / a / 4158997/201725. Ndash Jan Hudec Sie können binäre Dateien in ausführbare Datei mit ld Linker einbetten. Wenn Sie zum Beispiel Datei foo. bar haben, können Sie es in die ausführbare Datei einbetten, indem Sie die folgenden Befehle in ld einfügen Wenn Sie ld thru gcc aufrufen, müssen Sie - Wl hier hinzufügen - formatbinary teilt dem Linker mit, dass die folgende Datei ist Binary und --formatdefault zurück zum Standard-Eingabeformat (dies ist sinnvoll, wenn Sie weitere Eingabe-Dateien nach foo. bar angeben). Dann können Sie den Inhalt Ihrer Datei aus Code: Es gibt auch Symbol mit dem Namen binaryfoobarsize. Ich denke, es ist von Typ uintptrt aber i didnt check it. Ich hatte vor kurzem die Notwendigkeit, eine Datei in eine ausführbare Datei einzubetten. Da ich an der Kommandozeile mit gcc, et al und nicht mit einem fantastischen RAD-Tool, das alles geschehen magisch macht, war es nicht sofort offensichtlich für mich, wie dies zu machen. Ein bisschen auf der Suche nach dem Netz fand einen Hack, um im Wesentlichen Katze es auf das Ende der ausführbaren Datei und dann zu entschlüsseln, wo es auf einer Reihe von Informationen, die ich nicht wissen wollte. Scheint wie dort sollte ein besserer Weg sein. Und es gibt, sein objcopy zur Rettung. Objcopy konvertiert Objektdateien oder ausführbare Dateien von einem Format in ein anderes. Eines der Formate, die es versteht, ist binär, das ist grundsätzlich jede Datei, die nicht in einem der anderen Formate, die es versteht. So haben Sie wahrscheinlich die Idee vorgestellt: konvertieren Sie die Datei, die wir in eine Objektdatei einbetten möchten, dann kann es einfach mit dem Rest des Codes verknüpft werden. Wir sagen, wir haben einen Dateinamen data. txt, den wir in unsere ausführbare Datei einbetten wollen: Um diese in eine Objektdatei zu konvertieren, die wir mit unserem Programm verknüpfen können, verwenden wir einfach objcopy, um eine. o-Datei zu erzeugen: Das sagt objcopy, dass unsere Eingabe Datei befindet sich im Binärformat, dass sich unsere Ausgabedatei im Format elf32-i386 (Objektdateien auf dem x86) befinden sollte. Die Option --binary-architecture teilt objcopy mit, dass die Ausgabedatei auf einem x86 ausgeführt werden soll. Dies wird benötigt, damit ld die Datei für die Verknüpfung mit anderen Dateien für den x86 akzeptiert. Man würde denken, dass die Angabe der Ausgabe-Format als elf32-i386 würde dies bedeuten, aber es nicht. Nun, da wir eine Objektdatei haben, brauchen wir sie nur einzubinden, wenn wir den Linker ausführen: Wenn wir das Ergebnis ausführen, bekommen wir das Gebet für die Ausgabe: Natürlich habe ich die ganze Geschichte noch nicht erzählt und dir nicht gezeigt. Wenn objcopy die obige Konvertierung ausführt, fügt er der konvertierten Objektdatei einige Linkersymbole hinzu: Nach dem Verknüpfen legen diese Symbole den Anfang und das Ende der eingebetteten Datei fest. Die Symbolnamen werden durch vorangestelltes binäres und anhängendes Anfangs - oder Ende des Dateinamens gebildet. Wenn der Dateiname alle Zeichen enthält, die in einem Symbolnamen ungültig wären, werden sie in Unterstriche umgewandelt (zB data. txt wird datatxt). Wenn Sie beim Verknüpfen mit diesen Symbolen ungelöste Namen erhalten, führen Sie einen Hex-Dump - C in der Objektdatei aus und sehen Sie das Ende des Dumps für die Namen an, die objcopy gewählt hat. Der Code, um tatsächlich die eingebettete Datei zu verwenden, sollte nun eindeutig offensichtlich sein: Eine wichtige und subtile Sache zu beachten ist, dass die Symbole hinzugefügt, um die Objektdatei arent Variablen. Sie enthalten keine Daten, sondern ihre Adresse ist ihr Wert. Ich erkläre sie als Typ char, weil seine bequem für dieses Beispiel: die eingebetteten Daten sind Zeichen-Daten. Allerdings könnten Sie deklarieren sie als alles, wie int, wenn die Daten ein Array von Ganzzahlen oder als struct foobart, wenn die Daten waren alle Array von foo Bars. Wenn die eingebetteten Daten nicht einheitlich sind, ist char wahrscheinlich das bequemste: nehmen Sie ihre Adresse und werfen Sie den Zeiger auf den richtigen Typ, wenn Sie die Daten durchlaufen. Beantwortet Apr 1 11 um 20: 39basE91 Kodierung Einführung basE91 ist eine erweiterte Methode für die Kodierung binärer Daten als ASCII-Zeichen. Es ist ähnlich wie UUencode oder base64, ist aber effizienter. Der von basE91 erzeugte Overhead hängt von den Eingangsdaten ab. Er beträgt höchstens 23 (gegenüber 33 für base64) und kann bis zu 14 reichen, was typischerweise bei 0-Byte-Blöcken auftritt. Dies macht BasE91 sehr nützlich für die Übertragung größerer Dateien über binäre unsichere Verbindungen wie E-Mail oder Terminal-Linien. Alphabet Wie der Name schon sagt, benötigt basE91 91 Zeichen, um die kodierten Binärdaten in ASCII darzustellen. Von den 94 druckbaren ASCII-Zeichen (0x21-0x7E) wurden die folgenden drei für die Erstellung des basE91-Alphabets weggelassen: Die Übersetzungstabelle setzt sich wie folgt aus den übrigen Zeichen zusammen: Eine gute Möglichkeit zum Erstellen von Zeichenketten mit binären Daten zum Speichern ( B. das Sichern einer Sql-Anweisung in einer Datei) in Textdateien oder php-Code, ist folgendes zu tun: ltphp-Feld bin2hex (Feld) Feld chunksplit (Feld 2. x) Feld x. substr (Feld 0, - 2.) gt dies wird Ihr Feld (binär oder nicht) in hex umwandeln und dann die Hex in eine Zeichenfolge konvertieren, die in einer PHP-Datei platziert werden können: FFFFFFFF - gt xFFxFFxFFxFF Als Reaktion auf Patrik: Eine einfachere Weise, eine Zahl in binär zu drucken, ist, baseconvert () zu verwenden. Lt echo baseconvert (bin, 10, 2) gt Wenn Sie es brauchen, um alle 32 Bits (wie Ihre Funktion) zu drucken, können Sie es einfach aus: lt echo strpad (baseconvert (bin, 10, 2), 32, STRPADLEFT) gt Die Konvertierung erfolgt von Basis 10, da wenn bin an baseconvert () übergeben wird, wird es in einen String konvertiert und die Default-Darstellung ist dezimal. Hoffe das hilft. Einige gaben eine Funktion, um einen Hex-Code wieder in einen einfachen Text umwandeln (menschlich lesbar ASCII: P) Einige andere gab eine Funktion, die Nutzung von bin2hex zu konvertieren URLs in etwas wie 123456 Hier ist eine Funktion aus dem Formular 123456 zurück in gehen ASCII Beachten Sie, dass diese Funktion kann leicht um jede hex-Code in ASCII lt Funktion hex2text (str) str explode (str) arrayshift (str) nmlstr foreach (str als hexstr) nmlstr zu verwandeln geändert werden. Chr (baseconvert (hexstr, 16, 10)) return nmlstr gt hoffe, das hilft :) Grüße - Tsuna Hoffentlich hilft das jemandem. Es zeigt nur eine HTML-Darstellung von Hex-Daten, ähnlich wie ein Hex-Viewer würde. ltphp Funktion HexView (Daten) bytePosition columnlinecount 0 Spalten 8 dataLength strlen (Daten) return array () geben lttable border1 cellspacing0 cellpadding2gt für (n 0 n lt dataLength n) Zeilen linecount column substr (Daten. n. 1), wenn (column Spalten ) LineCount columnCount 0 foreach (Zeilen als Zeile) return lttrgtlttd alignrightgt. BytePosition. : Lt / tdgt für (n 0 n lt Spalten n) return lttdgt. Strtoupper (bin2hex (Zeile n)). lt / tdgt Rückkehr lttdgt ampnbspampnbspampnbspampnbspampnbspampnbspampnbspampnbsp lt / tdgt für (n 0 n lt Spalten n) return lttdgt. (htmlentities (Zeile n). htmlentities (Zeile n). ampnbsp). Lt / tdgt Rückkehr lt / trgt bytePosition bytePosition Spalten return lt / tablegt return implode (. Return) gt Diese Funktion löscht sie (konvertiert zurück in ASCII). Ltphp-Funktion hex2asc (myin) für (i 0 i lt strlen (myin) / 2 i) myout. Chr (baseconvert (substr (myin. I 2. 2), 16. 10)) return myout gt Ich war nur in den oben genannten und mit einer kleinen Änderung, kam mit den folgenden, die ich glaube, flexibler zu sein: ltphp-Funktion bin2hex (Daten) korrigiert eregreplace (0-9a-fA-F.. Daten) return Pack (H. strlen (korrigiert), korrigiert) gt Dadurch wird sichergestellt, dass das, was Sie weitergeben, auch wenn es an den Extremitäten oder zwischen Paaren aufgefüllt , Sollten die gewünschten Daten zurückgeben.

No comments:

Post a Comment