GHIDRA vs. IDA Pro


Grüße


Ich denke die Zeit ist gekommen. Puffte / kochte / habe eine Meinung. Mit der Veröffentlichung von Hydra hat sich die Situation mit Werkzeugen für Reverse Engineers sehr verändert. Wenn es vor der Verwendung nicht viel Auswahl gab ( Binary Ninja , Hopper , JEB oder Radare2 werden hier nicht erwähnt, da in den Informationssicherheitsunternehmen und -gemeinschaften, wie ich weiß, nur eine sehr geringe Anzahl von Personen verwendet wird oder die Schwelle für die Eingabe einiger Personen (Hallo, Radar). sehr hoch, oder die Abdeckung von Architekturen beschränkt sich nur auf x86 / x64 / ARM / ARM64 / MIPS ), jetzt haben wir einen sehr starken Konkurrenten Hex-Rays der von der NSA mit ihrer GHIDRA .


Aber ist Hydra so gut? Ist IDA schlecht (oder umgekehrt)? Lass es uns richtig machen. In diesem "Artikel" habe ich versucht, alle Vor- und Nachteile beider Tools zu reduzieren. Ich hatte nicht das Ziel zu sagen, dass dieses oder jenes Werkzeug besser ist - ziehen Sie Ihre eigenen Schlussfolgerungen. Außerdem entwickeln sich ein und das zweite Instrument. Der Artikel enthält nur die Ergebnisse des Vergleichs zum Zeitpunkt des Schreibens. Der Vergleich erfolgt in folgenden Kategorien:


  1. Unterstützte Architekturen
    Wenn Sie ein Reverse Engineer sind, der nur mit Intel-Plattformen (x86 / x64) arbeitet, ist es für Sie nicht wichtig, dass alle anderen vorhanden sind. Aber wenn Sie mit vielen verschiedenen arbeiten müssen Datei-Hosting Je mehr Architekturen standardmäßig ausgeliefert werden, desto besser.
  2. Unterstützte Formate
    Das Gleiche wie im vorherigen Absatz, nur in Bezug auf Datenformate.
  3. Dekompilierungsqualität
    Fast die notwendigste und wichtigste Komponente ist der Decompiler. Der Disassembler allein macht nicht viel Sinn. Hier ist ein Überblick darüber, was Ghidra / IDA kann / produziert.
  4. Erweiterbarkeit, SDK / API
    Reverse Engineers, die mit verschiedenen Architekturen und Formaten arbeiten und regelmäßig viele ähnliche Aufgaben ausführen, müssen in der Lage sein, schnell und bequem zusätzliche Module / Loader / Skripte zu schreiben. Es wäre auch schön zu können
    debuggen sie. Mal sehen, wie es den einzelnen Produkten geht.
  5. Die Dokumentation
    Es scheint, warum wird es gebraucht? Wir sind alle schon lange an Hotkeys gewöhnt, haben Mana zum Schreiben von Plugins gefunden usw. Wir haben auch die Benutzeroberfläche herausgefunden. Aber wie lange hat es gedauert? Mit einer Dokumentation, insbesondere von hoher Qualität, wird dies schneller und ruhiger.
  6. Debugger (für untersuchte Dateien)
    Eine wichtige und notwendige Komponente für eine Reverse Engineering-Umgebung. In der Statik ist es ebenfalls möglich, aber in der Dynamik ist es einfacher.
  7. Geschwindigkeit der Dateianalyse
    Wenn es sich um sehr große Dateien handelt (ab 10 MB), ist es wichtig, dass Sie aufgrund der Reverse Engineering-Umgebung nicht gezwungen sind, zum Tee zu gehen und zu Bett zu gehen, während die Datei analysiert wird.
  8. Arbeitserleichterung (Benutzeroberfläche, Hotkeys, Fokus auf Tastatureingabe)
    Trotz der Tatsache, dass die Hauptsache die Funktionalität ist, spielt die Art und Weise, wie sie dem Benutzer präsentiert wird und wie er aussieht, eine wichtige Rolle. Wenn die Benutzeroberfläche es zulässt, die Maus nicht für häufig verwendete Formulare und Befehle zu verwenden, ist dies ein Plus. Wenn Sie eine Reihe von Fenstern durchlaufen müssen, um einer Funktion ein Eingabeargument hinzuzufügen, ist dies bereits ein Minus. Vergleichen Sie.
  9. Neue Versionsfreigabe
    Wie schnell Fehler behoben, neue Funktionen hinzugefügt und dementsprechend neue Versionen veröffentlicht werden, ist ein Indikator für ein gutes Entwicklungsteam und einen seriösen Ansatz.
  10. Die Schwierigkeit, ein Verteilungskit zu erhalten
    Kaufen, herunterladen, die Distribution erstellen - fertig.
  11. Unterstützung
    Möchten Sie den Autoren einen Fehler melden, eine neue Funktion vorschlagen oder einfach nach etwas fragen - bei all dem geht es um Unterstützung. Wir werden herausfinden, wer besser ist - ein bezahltes oder kostenloses Produkt.
  12. Gemeinschaft
    Die Präsenz der Community und die Möglichkeit, mit ihr zu kommunizieren, Entwicklungsprobleme zu diskutieren, Fragen zur Funktionalität zu stellen oder nur gute Ratschläge von sachkundigen Personen (nicht Entwicklern) zu erhalten - das ist die Community.
  13. Projektzusammenarbeit
    Die Arbeit mehrerer Personen an einem Projekt ist ein wichtiger Punkt, um dies zu ignorieren.

Vergleich


1. Unterstützte Architekturen (IDA)


IDA Pro unterstützt eine sehr große Anzahl von Prozessoren und deren Modifikationen. Die Liste ist seriös: https://hex-rays.com/products/ida/processors.shtml
Die Prozessorliste ist für Starter und Professional Edition , 64-Bit wird nur in der Pro-Version (sowie in der Demoversion , dank Slinkinone ) unterstützt. Plattformen in letzteren sind ziemlich selten, aber dennoch.


Wenn sich die Arbeit nicht auf das Internet der Starter konzentriert, reicht Starter aus, andernfalls müssen Sie eine Pro Version kaufen.
Die Dekompilierung ist nur für x86 / x64 / arm / arm64 / PowerPC verfügbar. In der ersten Hälfte des nächsten Jahres soll der MIPS Dekompiler eingeführt werden.


1. Unterstützte Architekturen (GHIDRA)


Es gibt keine Online-Version der Liste, daher bringe ich sie hierher:



Hier wird die Liste in Form von Core-Prozessoren (ohne Änderungen) dargestellt, dies bedeutet jedoch nicht, dass sie nicht unterstützt werden. Für jedes der Prozessormodule stehen Decompiler zur Verfügung.


2. Unterstützte Formate (IDA)


Die Liste der Formate finden Sie hier: https://hex-rays.com/products/ida/file_formats.shtml


Die Liste ist ziemlich groß. Außerdem gibt es Plugins aus der Community, die der Box as niemals hinzugefügt werden Dazu müssen Sie den Moment mit Ilfak Gilfanov (dem Hauptentwickler) besprechen.


2. Unterstützte Formate (GHIDRA)


Liste der Formate 1
  • android
    1. apk
    2. bootimg
    3. dex
    4. Kernel
    5. odex
    6. xml
  • bplist
  • coff
  • complzss
  • cpio
  • ext4
  • gzip
  • ios
    1. apple8900
    2. btree
    3. decmpfs
    4. dmg
    5. dyldcache
    6. generisch
    7. ibootim
    8. img2
    9. img3
    10. img4
    11. ipsw
    12. png
    13. Prelink
    14. xattr
  • iso9660
  • Java
  • lzss
  • omf
  • Sevenzip
  • Sparseimage
  • teer
  • ubi
  • xar
  • yaffs2
  • Reißverschluss
  • zlib

Liste der Formate 2
  • coff
  • Zwerg
  • dwarf4
  • Elf
  • lx
  • Macho
  • macos
  • mz
  • ne
  • objc2
  • ZielC
  • omf
  • pdb
  • pe
  • pef
  • ubi
  • xcoff

Die obige Liste ist nur eine Liste von Verzeichnissen unter https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats
Eine weitere Dateiliste finden Sie hier: https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format


3. Qualitätsdekompilierung (IDA)


Der Decompiler von Ida funktioniert wunderbar mit x86 / x64 / arm / arm64 Code (ich kann nichts über PowerPC sagen, weil ich ihn nicht gesehen habe), der von einem Standard-Compiler generiert wurde, von dem die meisten eine ordentliche C-Auflistung produzieren.


Anfänglich konzentrierten sich die Entwickler auf MS-DOS-Code, so dass auch Artefakte älterer Compiler berücksichtigt wurden (daher gibt es in der Benutzeroberfläche in vielen Fenstern , , es / ds / ss / fs / gs ( ds - sogar auf MIPS!)) ganz neu. Richtig, die IDA Compiler-Optimierungen funktionieren nicht so gut, und der Auspuff wird zur Hölle.


Mit Code, der in einem für Ida (oder Assembler) unbekannten Compiler geschrieben wurde, werden die Ergebnisse sehr schlecht: Wenn eine nicht standardmäßige calling convention wird, wird eine dekompilierte Auflistung zu einem fast unlesbaren Satz von Zeilen.


Die Notwendigkeit, die erforderlichen Register manuell in der Eingabezeile des Prototyps der Funktion über __usercall mit @ und <> __usercall , ist ein großes Minus, insbesondere wenn es viele Register gibt und Hydra dies nicht hat und nur über die GUI, was nicht der Fall ist Es ist immer praktisch, wenn die Anzahl der verwendeten Register klein ist.


3. Qualität der Dekompilierung (GHIDRA)


Ich kenne keine Leute, die sagen werden, dass der Hydra-Decompiler cool ist. Hier ist es zur Freude wahrscheinlicher, dass es allgemein existiert, und es gibt für jeden unterstützten Prozessor!


Der Hydra-Decompiler hat eine Menge Müll im ausgegebenen Code, was für den Ida-Benutzer ungewöhnlich ist, was oft vom Verständnis der Essenz dessen ablenkt, was darin vor sich geht.


Der Hydra-Decompiler hat jedoch eine großartige Funktion: Er verfügt über einen Emulator mit Anweisungen, mit dem er nicht verwendeten und niemals aufgerufenen Müll entsorgen und gleichzeitig einige Punkte vereinfachen kann.


Außerdem ist es dem Hydra-Dekompiler egal, in welchen Registern die Argumente stehen - wenn auf sie zugegriffen wird, werden sie verwendet.


An dieser Stelle möchte ich festhalten, warum Hydra oder Ida ihre eigenen besonderen Probleme mit der Dekompilierung haben. Der Punkt ist die Ausrichtung jedes Produkts. IDA , wie oben erwähnt, mit einer Ausrichtung auf MS-DOS und im Allgemeinen auf x86 erstellt und deckt dann nach und nach x64 und ARM ab. Daher nur eine wunderbare Auspuffqualität für diese Plattformen, aber absolut keine Abdeckung für andere.
Im Gegensatz dazu wurde Hydra mit dem Ziel entwickelt, IoT-Geräte rückzuentwickeln. Daher die große Anzahl unterstützter Prozessoren, eine klare Beschreibung der einzelnen Prozessoren und die einfache Möglichkeit, neue Prozessoren zu erstellen. Aufgrund der Tatsache, dass die Entwickler versuchten, viele Architekturen abzudecken, wurde die Verbesserung des Ausstoßes des Dekompilierers nicht zu einer Priorität.

4. Funktionserweiterbarkeit (IDA)


Mit Ida können Sie Loader, Plugins, Debugger und Prozessormodule sowie Skripte direkt in die Oberfläche schreiben. Einige können in Python geschrieben werden, was etwas praktischer ist (über das IDAPython- Plugin, das nicht von IDA Entwicklern geschrieben wurde, von Elias Bachaalany ).


Das Entwickeln von Plugins in der 6.x Version war ziemlich kompliziert gesunde Dokumentation fehlte. Jetzt haben sich die Zeiten geändert und das Schreiben Ihres eigenen Stücks ist einfacher geworden. Es findet jedes Jahr ein Wettbewerb statt, bei dem Entwickler ihrer Meinung nach das beste Plugin auswählen (und die Ansicht ist eher umstritten). Zum Beispiel im letzten gewonnenen Wettbewerb, raten Sie nie, welche Auftragnehmer Funktionserweiterung ... Es stellte sich heraus, dass es sich um ein Plugin handelt, das KILLS Undo in IDA ! Es gibt einfach keine Worte. Die Entwickler haben so lange nach dieser Funktion gefragt, aber bis GHIDRA , wollte niemand einen Finger bewegen. Und jetzt - bitte entferne die coole Funktion mit dem Plugin - du hast gewonnen, Glückwunsch!


Das Debuggen von Plugins ist einfach, insbesondere wenn es in C ++ geschrieben wurde. Das Debuggen von Python- oder IDC Skripten ist schwieriger und es gibt keinen offiziellen Weg.


Ein sehr starker Schmerz im Anus begann, als die API in Version 7.0 komplett neu geschrieben wurde, was sie mit älteren Versionen inkompatibel machte. Zum einen werden die Namen der Funktionen deutlicher, die zusätzlichen Argumente werden entfernt, die Entwicklung ist einfacher geworden. Aber wenn Sie, wie ich, Plugins für die Versionen 6.x entwickelt haben und Ihre Ideen auf ein neues SDK übertragen müssen, dann haben Sie Kopfschmerzen.


In Version 7.1 kam es erneut zu Änderungen, und alles musste neu repariert werden.


4. Funktionserweiterbarkeit (GHIDRA)


Ghidra in Java (mit einem Dekompiler in C++ ) und unterstützt Python Skripte (über Jython ). GhidraDev Plugin für Eclipse ist im Standardpaket enthalten, mit dem Sie Projektvorlagen erstellen können (die später in IntelliJ IDEA importiert werden können). Die automatische Vervollständigung in der IDE und in der Dokumentation funktioniert einwandfrei, und es dauert eine halbe Stunde, um herauszufinden, wie Sie Ihr erstes Plug-In schreiben.


Darüber hinaus sind in der Grundausstattung viele Skripte enthalten, die für nahezu alle möglichen Anwendungen geschrieben wurden. Sie können bei Bedarf auch korrigiert werden.


Die Verwendung von Eclipse praktisch, um Ihre Projekte direkt während der Entwicklung zu debuggen.


5. Dokumentation (IDA)


IDA Dokumentation ist ihre Schwachstelle, und das ist schon lange so. Wie bei den meisten Entwicklern geht die Verzerrung eher in die Funktionalität als in die Dokumentation. Daher die magere HLP Datei, die im Lieferumfang enthalten ist.


Das Buch " IDA Pro Book " wurde nicht von Entwicklern geschrieben und wurde nur für die 6. Version veröffentlicht. Seitdem wurden keine neuen Bücher herausgegeben, es gibt keine Handbücher für die Entwicklung von Plugins von Entwicklern.


Irgendwann ab Version 7.0 Dokumentation zu einer Webversion und eine schlechte Beschreibung der API-Funktionen aus dem SDK.




5. Dokumentation (GHIDRA)


Die Dokumentation für Hydra wurde im Gegensatz zu Ida gleichzeitig mit der Entwicklung erstellt. Von hier aus haben wir Kommentare zu fast allen API-Funktionen, Aufzählungselementen und Klassen. Die im Lieferumfang enthaltene Hilfedatei, die die Benutzeroberfläche und die Einstellungen von Hydra beschreibt, enthält Screenshots und Beispiele für die einzelnen Schaltflächen oder Menüelemente.




6. Debugger (IDA)


Ja, das ist er. Und es funktioniert. Windows, Linux, MacOS sowie die Möglichkeit, eine Verbindung über gdb . Zu Letzterem: Für die meisten Nicht-Standard-Plattformen musste ich mein eigenes Debugger-Modul schreiben. Jetzt gibt es die Möglichkeit, über GDB für Plattformen wie x86 / x64 , ARM / AArch64 , PowerPC , MIPS , Motorola 68k , Infineon TriCore und Renesas RH850 . Vollständige Liste hier: https://hex-rays.com/products/ida/debugger/index.shtml#details


6. Debugger (GHIDRA)


Leider gibt es noch keinen öffentlichen Debugger. In den Docks von WikiLeaks einige Debugging-Module erwähnt. Trotzdem ist bekannt, dass die NSA daran arbeitet und es einen Debugger geben wird!


In der Zwischenzeit ist es durch Plugins, die die Funktionen der Schnittstelle erweitern, möglich, Ihren eigenen Debugger zu schreiben. Aber anscheinend macht das niemand.


7. Arbeitsgeschwindigkeit (IDA)


Bei großen Dateien bläst Ida viel weniger Hydra, aber nicht immer. Der Ida-Analysator wird im Singlethread-Modus ausgeführt, und bei großen Dateien ist ein Kern vollständig geladen, während der Rest im Leerlauf ist. In naher Zukunft werden die Autoren dies nicht ändern (nach den Worten der Entwickler).


7. Arbeitsgeschwindigkeit (GHIDRA)


Wenn im Gespräch zwischen den beiden Umkehrern die Geschwindigkeit dieser Ida und Hydra erörtert wird, kommt jeder zu dem Schluss, dass Hydra viel Zeit benötigt, um große Dateien zu verarbeiten. Obwohl es unter Berücksichtigung von Multithreading geschrieben wurde. Und Java schuld: Plus für Cross-Plattform, Minus für Geschwindigkeit. Wenn Sie jedoch die Speichermenge, den Stapel und den Heap für die JVM sowie die Anzahl der Threads konfigurieren, wird die Arbeit etwas beschleunigt.


8. Benutzerfreundlichkeit (IDA)


Zweifellos kennen viele Leute Idas Hotkeys auswendig. Sie sind einfach und unkompliziert, oft intuitiv. Viele der Menüpunkte und Funktionen von Ida können bequem über die Tastatur aufgerufen werden.


In Bezug auf das Erscheinungsbild wurde bis zu Version 6.x eine selbst geschriebene grafische Oberfläche verwendet. Weiterhin sind die Entwickler komplett auf Qt . Das Interface ist definitiv schöner geworden. Die Position der Registerkarten, Schaltflächen und Oberflächenelemente hat sich lange Zeit nicht geändert.


Von hier aus folgen die Vor- und Nachteile. Vorteile - die Benutzeroberfläche ist vertraut, Sie müssen nicht suchen, wo sie sich befindet, und die Gewohnheiten bekämpfen. Nachteile - einige Elemente bleiben rudimentär (der Struktureditor scheint ein Erbe alter Ida-Versionen zu sein) oder werden in 90% der Fälle nicht verwendet.



8. Arbeitserleichterung (GHIDRA)


Alles ist genau das Gegenteil. Ein neues Produkt auf dem Markt, der Unterschied zwischen Hotkeys und Ida, macht seinen Job. Die Geschwindigkeit der Arbeit, die bei Ida lange Zeit enorme Geschwindigkeit erreicht hatte, begann in Hydra zu sinken. Aber natürlich treten bei längerer Arbeit auch die letzten Gewohnheiten auf, und es wird nicht so schwer.


Hydra hat viele Menüs, die Anzahl der Elemente ist manchmal recht groß, und nicht alle Elemente haben Tastenkombinationen. Gleichzeitig können Sie mit dem Hotkey-Einstellungskonfigurator Ihren eigenen Hotkey an fast jeden Befehl hängen.


Weil Ghidra in Java , die Entwickler nutzten die Grundfunktionalität des JDK , nämlich Swing . Aus diesem Grund haben wir, was wir haben. Dies kann jedoch nicht als Minus von Hydra bezeichnet werden.


9. Veröffentlichung neuer Versionen (IDA)


Haben Sie bemerkt, dass mit der Veröffentlichung von Hydra immer häufiger neue Versionen von Ida herauskommen? Aber ich habe genau hingeschaut. Weißt du warum? Natürlich geht es um Wettbewerb. Endlich erschien sie!

Bisher wurden selten neue Versionen von Ida veröffentlicht, da Ida nur sehr ungern neue Funktionen erwirbt. Nach dem Melden eines Fehlers sollten Sie nicht damit rechnen, dass die von den Entwicklern gesendete Korrektur in Kürze bei Ihren Kollegen angezeigt wird. Es gibt keine System-Patches wie Entwickler patchen die Hauptdateien für jeden Kunden (Wasserzeichen).


Es scheint, dass die Veröffentlichungsgeschwindigkeit neuer Versionen von Ida aufgrund des Produktwettbewerbs steigen wird.


9. Veröffentlichung neuer Versionen (GHIDRA)


Die Regelmäßigkeit der Veröffentlichung neuer Versionen von Hydra ist recht groß: Seit Veröffentlichung der Quelle wurden etwa sechs Versionen veröffentlicht.


Wenn Sie lange auf eine neue Distributionsversion warten, können Sie mit github einen Master-Zweig erstellen . Das erste Mal dauert es mehr als eine Stunde, aber es lohnt sich.


10. Die Schwierigkeit, ein Distribution Kit (IDA) zu erhalten


Jeder kennt diese Geschichte: " Ilfak Gilfanov - Bekämpfung der Piraterie! ". Aus diesem Grund ist der Zugriff auf die Pro und Starter Versionen der Distributionskits für den Kauf sehr schwierig und trostlos geworden. Für bloße Sterbliche, die keinen Zugang haben verrücktes Geld Postfächer, die sich nicht auf öffentlichen Mailservern wie gmail Mail, mail.ru usw. befinden, können nicht verteilt werden. Und selbst wenn Sie eine eigene IP-Adresse oder Website haben, müssen Sie viele Überprüfungen durchführen, Scans, Bestätigungen usw. senden. Und das alles, damit die Distribution nicht ins Internet gestellt wird. Das hilft nicht immer.


Begeisterte Versionen erscheinen, aber selten. Daher sitzen die meisten Reverse-Engineer-Enthusiasten auf alten, einst zusammengeführten Distributionen von ESET und chinesischem Antivirus.


Vor nicht allzu langer Zeit erschienen offizielle, aber verkürzte Versionen für Studenten, ohne Dekompilierer und ohne viele andere Einschränkungen (mehr Details hier ).


10. Schwierigkeit, eine Distribution zu bekommen (GHIDRA)


Es scheint, dass es überhaupt nichts zu schreiben gibt, aber. Tatsächlich ist der Zugang zum Hauptstandort von Hydra von Russland, Israel und China aus verboten. Benötigen Sie ein VPN oder Tor (entsprechende Download-Geschwindigkeit). Es gibt keine Veröffentlichungen auf github , nur Quellcodes.


11. Unterstützung (IDA)


Wie sehr ich mit dem Hex-Rays Support kommunizieren musste, war immer anders: Einige der Leute, die im Support arbeiten, sind sehr höflich und immer bereit zu helfen. Teil: Der Hauptentwickler und die Kommunikation wurde unhöflich. Vor allem, wenn die Meinung nicht übereinstimmt. Aber wahrscheinlich ist das die Natur davon. Das Gleiche gilt für die Kommunikation mit Benutzern im Internet.


Kürzlich stellte sich heraus, dass nur ich mit der Unterstützung meiner Freunde kommuniziere. Ein sehr alter Fehler im Zusammenhang mit dem Verlust der Auswahl beim Scrollen, der in Version 6.6 aufgetreten ist und von dem jeder weiß, wurde von den Entwicklern nie beseitigt. Er fragte, was los sei. Und die Antworten lauten wie folgt: "Ich möchte nicht mit einer Person kommunizieren, die Benutzer auf diese Weise behandelt ." Leider funktioniert Ruf so.


Trotzdem wurden die Fehler und Vorschläge, die ich den Entwicklern gemeldet habe, korrigiert und berücksichtigt (nicht alle).


11. Unterstützung (GHIDRA)


Hydra hat ein Repository für github . Dort gibt es issues , und hier müssen Sie Fehler melden. Die Reaktionsgeschwindigkeit auf einige kann entweder sehr lang oder recht schnell sein. Aber Bugs schließen sich nicht einfach so, sie sagen, wir wollen das nicht implementieren. Alles wird berücksichtigt, berücksichtigt. Jeder kann dazu beitragen.


PRs werden langsam angewendet und bearbeitet. .


12. (IDA)


, . , -, . , , , .


12. (GHIDRA)


: ghidra.re , -, @GHIDRA , github. , .


13. (IDA)


. , , , -, .


13. (GHIDRA)


. -, .


Schlussfolgerungen


. , - . , Linux — // , , .


/ IDA . , . .


, , Ghidra . IDA — .


— . . , Ghidra , IDA — . , , IoT — . .


, , . Vielen Dank.


PS .
PPS 2 - .
PPPS . . netch80 .

Source: https://habr.com/ru/post/de480824/


All Articles