Att packa upp ett generiskt paketpaket eller en kryptor innebär vanligtvis följande steg:
1. Spåra koden, eventuellt undvika eller kringgå anti-felsökningskontroller.
Detta är inte svårt för enkla förpackare men kan vara svårt för de mer avancerade. De kan använda timingkontroller ( rdtsc
), undantagsbaserad kontrollöverföring, använda felsökningsregister för beräkningar etc. Användning av en virtuell dator eller en emulator hjälper här vanligtvis mot de flesta av dem.
2. Hitta ursprunglig ingångspunkt (OEP)
Det finns många sätt att göra detta. Ibland är hoppet till OEP uppenbart när det följer en bit av looping-kod och det finns inget rimligt att ta hand om det. Eller så kan du känna igen koden på OEP om du känner till de startpunkter som produceras av olika kompilatorer. Ett par andra knep:
-
om förpackaren sparar originalregisterna innan de packas upp, ställ in en hårdvarupaus på deras plats i stacken - på det här sättet bryter du precis när de är återställs innan du hoppar till OEP.
-
om du under spårning kan identifiera minne där den uppackade koden skrivs, ställ in en brytpunkt för sidkörning på det minnesområdet - det kommer att utlösas efter hoppa. IDA låter dig ställa in en sådan brytpunkt, och jag tror att OllyDbg också.
-
ställa in brytpunkter på vanliga API: er som används av startkod, t.ex. GetCommandLine
eller GetVersionEx
. Detta ger dig inte den exakta OEP, men du kan vanligtvis gå tillbaka callstack och hitta den mer eller mindre lätt.
3. Dumpa den uppackade koden
Om du använder IDA behöver du inte dumpa filen i en separat fil - det räcker att ta en minnesbild som skulle kopiera byten från minnet till databasen så att du kan analysera dem senare. En sak att tänka på här är att om förpackaren använde dynamiskt tilldelat minne måste du markera det som "loader" så att det ingår i ögonblicksbilden. Mer här.
4. Återställ import
Jag vet inte riktigt hur det görs i Olly eller andra felsökare, men AFAIK du måste använda ett verktyg som ImpREC på din dumpning och en kopia av processen i minnet.
Det är något enklare (IMO) i IDA. Du behöver bara hitta importtabellen och byta namn på pekarna enligt de funktioner de för närvarande pekar på (detta bör göras medan felsökaren är aktiv). Du kan använda antingen renimp.idc
-skript eller UUNP "manuell rekonstrueringsfunktion" (se här).
För att hitta importtabell finns det två knep som jag använd ibland:
-
följ några samtal i startkoden på OEP för att hitta externa API: er och detta skulle leda dig till importtabellen. Vanligtvis är början och slutet av tabellen uppenbar.
-
under uppackning, ställ in en brytpunkt på GetProcAddress och se var resultaten skrivs. Detta fungerar dock inte med förpackare som använder manuell importresultat med hjälp av exportkatalogen. Att sätta en läst BP på kernel32s exporttabell kan hjälpa till här.
5. Rensa upp
Detta är valfritt men det kan vara användbart att ta bort resterna av packarkoden som bara skulle distrahera dig. I IDA bör du också tillämpa en kompilator-FLIRT-signatur om du känner igen kompilatorn som används.
6. Att göra en uppackad körbar
Jag gör inte det här steget eftersom jag sällan behöver köra den uppackade filen men i allmänhet behöver du vanligtvis fixa PE-rubriken så att förskjutningar till sektionens kod i filen matchar de i dumpningen.
Nu finns det många variationer och knep som inte omfattas av ovanstående steg. Till exempel löser vissa förpackare inte importen till en början utan lägger hopp till stubbar som löser import vid första samtalet och lappar sedan den så att den går direkt till målet nästa gång. Sedan finns det en "stulen kod" -metod som gör det svårare att hitta och återställa OEP. Ibland kör packaren en kopia av sig själv och felsöker den, så att du inte kan bifoga din egen felsökare till den (detta kan lösas med hjälp av emulator eller en felsökare som inte använder felsöknings-API: er som Intel PIN). Ändå kan de beskrivna stegen täcka en hel del av det som finns där ute.
Jag kommer att avsluta med videon som Elias gjorde och visar processen att packa upp Lighty Compressor: https: //www.hex -rays.com/video/bochs_video_2.html