Afbeeldingsbron: pixabay.com

Python is een taal op hoog niveau. Hoewel velen van jullie denken dat het een programmeertaal is, is het dat niet. Het is een scripttaal. Het komt lang niet in de buurt van de machinecode of de machinetaal. Wat maakt python dan zo interessant? Als je ervaring hebt met pentesten of een gesprek hebt gehad met veel experts op het gebied van webbeveiliging of malware-analysers, dan zouden ze python altijd als hun primaire taal voorstellen om malware of exploits te ontwikkelen.

Hoewel sommige mensen de voorkeur geven aan C, C ++ of perl, zou ik persoonlijk op python stemmen. De reden hiervoor is dat het niet alleen nuttig is als hulpmiddel voor het schrijven van een programma, maar ook om het te breken.

Wat is reverse engineering?

Reverse Engineering is een zeer breed concept. Men kan het eigenlijk niet definiëren met eenvoudige syntaxis. Het juiste concept van reverse engineering is om een ​​code op te splitsen in eenvoudigere delen, deze te begrijpen, aan te passen en te verbeteren volgens ons eigen doel en deze vervolgens weer in elkaar te zetten om aan onze behoeften te voldoen. Om het wat eenvoudiger te maken, wil ik u enkele extreem veelvoorkomende voorbeelden geven.

Laten we een voorbeeld nemen van een Android mobiele telefoon. Fabrikanten maken een Stock Rom en verkopen deze aan hun consumenten. Maar meestal bevat het veel bloatware en wordt het laggy. Er zijn dus mensen op websites zoals XDA en Androidcentral die hun weg naar de ROM reverse-engineeren, verbeteren en vertragen. Een praktisch voorbeeld zou CyanogenMod Rom zijn.

Maar dit was slechts een voorbeeld om u te laten begrijpen wat het is. Reverse Engineering heeft hetzelfde concept, maar is veel te ingewikkeld dan alleen het wijzigen van een ROM.

Compilatie en Python

Als je ervaring hebt met Python, weet je dat het bij het schrijven van een python-script, of het nu een virus, payload, trojan of wat het bestand ook is, alleen werkt op computers waarop python is geïnstalleerd. Dus, laten we zeggen, ik heb een uitstekende computer-trojan geschreven die elk antivirusprogramma kan omzeilen, en ik begin het in een Windows-systeem te implementeren, maar als het Windows-systeem de Python-interpreter niet heeft geïnstalleerd, werkt het niet. Dus moet men elk bestand van het geschreven python-script in een uitvoerbaar bestand compileren en vervolgens in Windows-systeem implementeren.

Reverse Engineering Windows-uitvoerbare bestanden

Nu weet je, dat we python-scripts moeten compileren om in Windows te draaien, je moet ook weten dat er een compiler moet zijn die python-scripts omzet in een uitvoerbaar bestand. Ja dat is er. De naam is Py2exe. Py2exe is een eenvoudig installatieprogramma dat python-scripts converteert naar zelfstandige Windows-programma's. Nu is er ook een ander hulpmiddel dat Windows-uitvoerbare bestanden die in python zijn geschreven, omzet in python-scripts. De naam is Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder is een tool om door Pyinstaller gegenereerde uitvoerbare bestanden opnieuw te compileren / reverse-engineeren zonder toegang tot de broncode. Wanneer u de EXE start, is deze onverpakt in het geheugen. Dit omvat de .pyc-bestanden (python-code die wordt geconverteerd naar bytecode). Wat tools zoals pyinstaller en py2exe doen, zijn in principe pakketbibliotheken en afhankelijkheden allemaal samen, zodat u de 'stand-alone' EXE kunt uitvoeren zonder ze te hoeven downloaden of de machine voor te bereiden met een python-interpreter.

Er is ook nog een toolkit waarmee je heel dicht bij de broncode komt. De naam is PyRetic wat staat voor Reverse Engineer Obfuscated Python Bytecode. Met deze toolkit kunt u een object in het geheugen terughalen naar de broncode, zonder dat u rechtstreeks toegang tot de bytecode op schijf nodig hebt. Dit kan handig zijn als de toepassingen op de schijf op een van de vele manieren zijn verborgen.

Aanbevolen cursussen

  • Training op Java Hibernate
  • Online certificeringstraining in Java Spring
  • WordPress-programma
  • Certificatietraining in Ruby

Reverse Engineering The Hard Way

Nu is het bovenstaande gedeelte gemakkelijk te begrijpen en praktisch te doen als je de basiskennis van python hebt. Maar dat is niet altijd het geval. Soms heb je geen documentatie of opmerkingen in het python-script en zijn er te veel bestanden die je helemaal zelf kunt begrijpen. Nu is er een geweldig boek over dit deel, maar ik zal me daar niet veel op concentreren.

De naam van het boek is "Effectief werken met oude code". Het boek is onafhankelijk van python of een andere taal en geeft je een idee voor reverse engineering in bijna elke taal. De belangrijkste focus, wanneer u probeert een stukje code te begrijpen, is de reden waarom u het wilt begrijpen.

Of u de code wilt reverse-engineeren om de code te wijzigen of te porten, de aanpak voor beide is heel anders. Het instrumentarium van de legacy-code, met batterijen en steigers van testen en traceren / loggen, is dus het cruciale pad op de lange, harde weg naar veilig en verantwoord begrijpen en wijzigen.

Reverse Engineering Tools

Nu is er een andere methode om het een beetje eenvoudig te maken, die u kunt volgen en de bovenstaande stappen volgt. Er is een site genaamd Epydoc. Op deze site controleert u de code en maakt u er wat documentatie voor. Het resultaat zal niet zo goed zijn als de originele documentatie, maar het zal je tenminste een idee geven hoe het precies werkt. En door dit te doen, kunt u beginnen met het schrijven van uw eigen documentatie en nadat u het document gedeeltelijk hebt geschreven, kunt u het resterende gedeeltelijke document opnieuw genereren van de site voor het resterende deel.

U kunt zelfs de IDE-tool gebruiken om de code te analyseren. Dit geeft u meestal code-voltooiing, maar nog belangrijker, in dit geval is het mogelijk om gewoon op een variabele te klikken en te klikken om te zien waar deze vandaan komt. Dit versnelt de zaken echt wanneer je de code van andere mensen wilt begrijpen.

Ook moet u een debugger leren. U zult in lastige delen van de code er doorheen moeten stappen in een debugger om te zien wat de code daadwerkelijk doet. Pythons pdb werkt, maar veel IDE's hebben geïntegreerde debuggers, waardoor debuggen eenvoudiger wordt. PyReverse van Logilab en PyNSource van Andy Bulka zijn ook nuttig voor het genereren van UML-diagrammen.

Er is een proces om een ​​UML-klassemodel te produceren op basis van een gegeven invoer van broncode. Hiermee kunt u een momentopname van uw codebase omkeren naar UML-klassen en het klassendiagram verder vormgeven. Door code-inhoud in een visueel UML-model te brengen, helpt dit programmeurs of software-ingenieurs bij het beoordelen van een implementatie, het identificeren van mogelijke bugs of tekortkomingen en het zoeken naar mogelijke verbeteringen.

Afgezien hiervan kunnen ontwikkelaars een codebibliotheek omkeren als UML-klassen en een model met hen samenstellen, zoals een generiek verzamelkader omkeren en uw eigen kader ontwikkelen door het generieke kader uit te breiden. In dit hoofdstuk zullen we het directe omgekeerde van Python doornemen.

Objecten en primers

Om de interne werking van Python volledig te begrijpen, moet men eerst vertrouwd raken met hoe Python code compileert en uitvoert. Wanneer code wordt gecompileerd in Python is het resultaat een code-object. Een code-object is onveranderlijk en bevat alle informatie die de interpreter nodig heeft om de code uit te voeren. Een instructie voor de bytecode wordt weergegeven als een opcode-waarde van één byte gevolgd door argumenten indien nodig. Naar gegevens wordt verwezen met behulp van een index in een van de andere eigenschappen van het code-object.

Een bytecodereeks ziet er zo uit:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

Python-bytecode werkt op een stapel items. Een meer ondernemende extensie zou zijn om te proberen de bytecode terug te decompileren in leesbare Python-broncode, compleet met object- en functienamen. Python-code kan in binaire vorm worden verspreid met behulp van de marshalmodule. Deze module biedt de mogelijkheid om codeobjecten te serialiseren en te deserialiseren met behulp van de opslag- en laadfuncties.

Het meest voorkomende binaire formaat is een gecompileerd Python-bestand (.pyc) dat een magisch getal, een tijdstempel en een geserialiseerd object bevat. Dit bestandstype wordt meestal door de Python-interpreter geproduceerd als een cache van het gecompileerde object om te voorkomen dat u de bron meerdere keren moet parseren. Deze technieken zijn afhankelijk van de gemakkelijke toegang tot bytecode en type-informatie.

Met de bytecode van een codeobject kan codelogica worden gewijzigd of zelfs volledig worden vervangen. Het extraheren van type-informatie kan helpen bij het begrijpen van het programmaontwerp en het identificeren van functie- en objectdoeleinden.

Het verdoezelen en verharden van de byte-code van de applicatie zal altijd een race zijn tussen de implementeerders en degenen die deze willen breken. Om te proberen te verdedigen tegen het ophalen van bytecodes, is de logische eerste stap een runtime-vertaaloplossing.

Eigenschappen van een code-object kunnen worden opgeslagen in elk ondertekend, gecodeerd of anderszins verduisterd formaat dat tijdens runtime wordt verduisterd of vertaald en wordt gebruikt om een ​​nieuw object te instantiëren. Je zou zelfs de manier kunnen veranderen waarop het opzoeken van variabelenamen binnen de tolk werkt om naamgevingsinformatie te verdoezelen. Door een vertaallaag toe te voegen tussen het opzoeken van de werkelijke namen en de namen in de broncode, kan een ontwikkelaar omkerende pogingen verder beperken.

Conclusie

Nu, na het lezen van al deze, kunt u de behoefte voelen om te gaan experimenteren met enkele van de tolgelden die er zijn. Dus, hier zijn enkele tools die u kunnen helpen bij het reverse engineeren van uw weg naar uw python-code:

  1. Paimei
  1. Sulley
  1. De Carrera-collectie
  1. PyEmu
  1. IDAPython
  1. ImmDbg

Dit zijn allemaal geweldige stukjes code, maar wat ze echt bijzonder maakt, is wanneer ze samen worden gebruikt. Houd er rekening mee dat dit geenszins een complete lijst is, alleen degene die ik het meest gebruik en denk dat laat zien hoe de flexibiliteit van python zo'n complexe taak zoals reverse engineering beheersbaar kan maken.

Aanbevolen artikelen

Hier zijn enkele artikelen die u zullen helpen om meer details over de reverse engineering met Python te krijgen, dus ga gewoon via de link.

  1. 25 meest verbazingwekkende vragen en antwoorden over het interview met Python
  2. Aan de slag met Python en Django voor webontwikkeling
  3. Wat zijn de voordelen en beperkingen van het gebruik van Python?
  4. Carrières in Python
  5. Reverse Engineering Tools