Skrivet av Magi55:
--
Om man kan lära en AI att översätta maskinkod till ett källkod,
så kan vem som helst se hur källkoden ser ut och utveckla den till en egen version.
Allt blir då open source och alla kan bygga om allt.
Eller vad tror ni skulle hända om alla kan se hur allt är kodat?
Finns det någon här som arbetar med AI och som tror detta kan bli möjligt
eller när kan en AI utvecklas för att översätta maskinkod till källkod?
Om 10 år?
Eller 50 år?
MagI
---
Man kan inte, utanför de absolut enklaste fallem få tillbaka originalprogrammet givet endast maskinkod som indata. Detta då kompilatorer gör fler transformer av programmet som ibland tappar delar av den fulla logiken då kompilatorn kan "bevisa" att transformen fortfarande ger samma observerbara påverkan på programmet tillstånd.
Bli också allt vanligare med "full program optimization", så kallad link time optimization. Detta snabbar upp programmet genom att vissa anrop till funktioner deklarerade i andra filer eller i andra bibliotek kan förenklas och ibland helt elimineras, så trots att funktion d.v.s. anrop till samma funktion F kan ta sig relativt olika uttryck beroende på hur F anropas.
Det skrivet, vad som är möjligt är att skapa någon högnivårepresentation av en program som om de kompileras med en specifik kompilator och en specifik uppsättning flaggor ger den binär man analyserade. Fast frågan är om författaren av originalprogrammet överhuvudtaget skulle inse att det är samma program...
En sak som är möjligt idag är s.k. liftning, har precis lär mig att Rosetta 2 bygger på exakt samma teknik som det jag länkar. Här går man inte tillbaka till ursprungliga källkoden, man lyfter någon maskinkod (x86_64 i fallet Rosetta 2) till något som kallas LLVM IR (LLVM Intermediate Representation).
LLVM IR är den enda "maskinkod" en front-end i LLVM behöver bry sig om. Så oavsett om du kompilera C, C++, Rust eller Swift så översätts det till LLVM IR om man kör med en LLVM front end. Vill du sedan köra ditt program på en x86_64 finns det en back-end som tar LLVM IR och skapar semantisk ekvivalent x86_64 kod. Vill du i stället köra på ARM64 tar man en backend som tar samma LLVM IR fast konverterar det till ARM64 maskinkod.
Då LLVM IR är en form av maskinkod även det är det relativt lätt att gå från "riktig" maskinkod till LLVM IR. Fördelen med LLVM IR är att det finns många och snabbt ökande antal verktyg som kan göra massa intressanta saker med LLVM IR. Om det inte redan finns lär det dyka upp verktyg som kan ta LLVM IR och skapa källkod i högre-nivå språk som har samma semantik.
Precis som de verktyg som går från assembler till säg C gäller samma även för "lifting". Man får en semantiskt ekvivalent LLVM IR representation av programmet, men med i princip 100 % säkerhet är det inte exakt den LLVM IR man hade när programmet ursprungligen skapades (om vi nu antar att det skapades med t.ex. Clang/LLVM).
I Rosetta 2 ser vi detta i form av att C->LLVM-IR->x86_64->LLVM-IR->ARM64 ger ett långsammare program än C->LLVM-IR->ARM64. Programmet gör samma sak men det senare har under kompileringsprocessen mer relevant kontext för att skapa ett optimalt program.
Skrivet av Thomas:
Problemet kvarstår ju att det vore olagligt i de allra flesta fallen, så att vidareutveckla såna program själv och skicka vidare till andra är ingen bra idé. Den begränsningen lär ju knappast göra det mer lockande att forska på området -- fast det har ju sin användning ändå.
IDA har ju t ex en (väldigt dyr) dekompilator som kan göra C-pseudokod från maskinkod. Resultatet blir dock ännu väldigt långt ifrån något som en människa skulle skriva, men i sådana fall finns det nog ändå rimlighet i att forska på detta.
Det är inte olagligt att transformera en binär till ett annat format. Om så vore fallet skulle IDA Pro - Hex Rays (produkten du refererar till) vara olaglig, Rosetta 2 och McSema etc skulle också alla vara olagliga.
Vad som man måste tänka på är att författaren av programmet har upphovsskydd på sitt verk, vilket gäller även för de varianter man får fram genom att transformera verket till andra representationer. Så är olagligt att t.ex. själv använda den kod man får ut genom omvänd kompilering och vidaredistribuera det. Är däremot helt lagligt att göra en sådan transform för att undersöka vad programmet gör, huvudpoängen med Hex Rays är ju att göra det lättare att hitta säkerhetshål i program man bara har i binärformat.
Huvudpoängen med Rosetta 2 är att översätta en maskinkod till en annan, det är OK så länge den som har upphovsrätt fortfarande behåller sina rättigheter i den alternativa formen. D.v.s. om jag äger programmet som levereras som x86_64 och det inte finns ett explicit krav att enbart köra på en x86_64 CPU får jag, förutsatt att jag äger programmet, även köra det på andra CPU-arkitekturer via någon form av översättning (skulle det finnas ett krav på att det måste vara x86 går det ändå att köra genom emulering).