Delphi dekompilēšana (1/3)

Par reverso inženieriju

Biznesa cilvēki, kas izmanto datoru birojā

Westend61/Getty Images





Vienkārši sakot, dekompilācija ir kompilācijas apgrieztā puse: izpildāmā faila tulkošana augstāka līmeņa valodā.

Pieņemsim, ka esat pazaudējis Delphi projekta avotu un jums ir tikai izpildāmais fails: reversā inženierija (dekompilācija) ir noderīga, ja sākotnējie avoti nav pieejami.



Hm, 'avoti nav pieejami', vai tas nozīmē, ka varam dekompilēt citu Delfu projektus? Nu jā un nē...

Vai ir iespējama patiesa dekompilācija?

Nē, protams nē. Pilnībā automatizēta dekompilācija nav iespējama — neviens dekompilators nevar precīzi reproducēt sākotnējo pirmkodu.



Kad Delphi projekts tiek apkopots un saistīts, lai izveidotu atsevišķu izpildāmo failu, lielākā daļa programmā izmantoto nosaukumu tiek pārveidoti par adresēm. Šis nosaukumu zaudējums nozīmē, ka dekompilatoram būs jāizveido unikāli nosaukumi visām konstantēm, mainīgajiem, funkcijām un procedūrām. Pat ja tiek sasniegts zināms panākumu līmenis, ģenerētajam 'avota kodam' trūkst jēgpilnu mainīgo un funkciju nosaukumu.
Acīmredzot avota valodas sintakse izpildāmajā failā vairs nepastāv. Dekompilatoram būtu ļoti grūti interpretēt mašīnvalodas instrukciju (ASM) sēriju, kas pastāv izpildāmajā failā, un izlemt, kāda bija sākotnējā avota instrukcija.

Kāpēc un kad izmantot dekompilāciju

Reverso inženieriju var izmantot vairāku iemeslu dēļ, no kuriem daži ir:

  • Zaudētā avota koda atgūšana
  • Lietojumprogrammu migrācija uz jaunu aparatūras platformu
  • Vīrusu vai ļaunprātīga koda esamības noteikšana programmā
  • Kļūdas labošana, ja lietojumprogrammas īpašnieks nav pieejams labojuma veikšanai.
  • Kāda cita avota koda atkopšana (piemēram, lai noteiktu algoritmu).

Vai tas ir likumīgi?

Reversā inženierija NAV plaisājoša, lai gan dažreiz ir grūti novilkt smalko līniju starp šiem diviem. Datorprogrammas aizsargā autortiesību un preču zīmju likumi. Dažādās valstīs ir atšķirīgi izņēmumi no autortiesību īpašnieka tiesībām. Visizplatītākie norāda, ka ir pareizi dekompilēt: interpretējamības nolūkos, ja interfeisa specifikācija nav bijusi pieejama, kļūdu labošanai, ja autortiesību īpašnieks nav pieejams, lai veiktu labojumu, lai noteiktu daļas. programmas, kas nav aizsargātas ar autortiesībām. Protams, jums ir jābūt ļoti uzmanīgiem / sazinieties ar savu advokātu, ja jums ir šaubas, vai jums ir atļauts izjaukt kādas programmas exe failu.

Piezīme : ja jūs meklējat Delphi plaisas, atslēgu ģeneratorus vai vienkārši sērijas numurus: jūs atrodaties nepareizā vietnē. Lūdzu, ņemiet vērā, ka viss, ko šeit atrodat, ir rakstīts/prezentēts tikai izpētes/izglītojošiem nolūkiem.



Pagaidām Borland nepiedāvā nevienu produktu, kas spēj dekompilēt izpildāmo (.exe) failu vai Delphi kompilēto vienību (.dcu) atpakaļ uz sākotnējo pirmkodu (.pas).

Delphi apkopotā vienība (DCU)

Kad Delphi projekts ir apkopots vai palaists, tiek izveidots kompilētās vienības (.pas) fails. Pēc noklusējuma katras vienības kompilētā versija tiek saglabāta atsevišķā binārā formāta failā ar tādu pašu nosaukumu kā vienības failam, bet ar paplašinājumu .DCU. Piemēram, unit1.dcu satur kodu un datus, kas deklarēti failā unit1.pas.



Tas nozīmē, ka, ja jums ir kāds, piemēram, komponentu kompilēts avots, viss, kas jums jādara, ir to mainīt un iegūt kodu. Nepareizi. DCU faila formāts ir nedokumentēts (patentēts formāts) un var mainīties atkarībā no versijas.

Pēc kompilatora: Delphi Reverse Engineering

Ja vēlaties mēģināt dekompilēt Delphi izpildāmo failu, šīs ir dažas lietas, kas jums jāzina:



Delphi programmu avota faili parasti tiek glabāti divos failu tipos: ASCII koda faili (.pas, .dpr) un resursu faili (.res, .rc, .dfm, .dcr). Dfm faili satur veidlapā ietverto objektu informāciju (īpašības). Veidojot exe , Delphi kopē informāciju .dfm failos gatavajā .exe koda failā. Veidlapu faili apraksta katru veidlapas komponentu, tostarp visu pastāvīgo rekvizītu vērtības. Katru reizi, kad mainām veidlapas pozīciju, pogas parakstu vai komponentam piešķiram notikuma procedūru, Delphi ieraksta šīs modifikācijas DFM failā (nevis notikuma procedūras kodā — tas tiek saglabāts pas/dcu failā). Lai iegūtu “dfm” no izpildāmā faila, mums ir jāsaprot, kāda veida resursi tiek glabāti Win32 izpildāmā failā.

Visām Delphi sastādītajām programmām ir šādas sadaļas: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. No dekompilēšanas viedokļa vissvarīgākās ir sadaļas CODE un .rsrc. Iekš ' Funkcionalitātes pievienošana Delphi programmai ' rakstā ir parādīti daži interesanti fakti par Delphi izpildāmo failu formātu, klases informāciju un DFM resursiem: kā pārdalīt notikumus, lai tos apstrādātu citi notikumu apstrādātāji, kas definēti tajā pašā formā. Vēl vairāk: kā pievienot savu notikumu apdarinātāju, pievienojot kodu izpildāmajam failam, kas mainīs pogas parakstu.



Starp daudziem resursu veidiem, kas tiek glabāti exe failā, RT_RCDATA vai lietojumprogrammas definētais resurss (neapstrādāti dati) satur informāciju, kas bija DFM failā pirms kompilācijas. Lai iegūtu DFM datus no exe faila, mēs varam izsaukt EnumResourceNames API funkcija... Papildinformāciju par DFM izvilkšanu no izpildāmā faila skatiet: Delphi DFM Explorer kodēšana rakstu.

Reversās inženierijas māksla tradicionāli ir bijusi tehnisko burvju zeme, kas pārzina montāžas valodu un atkļūdotājus. Ir parādījušies vairāki Delphi dekompilatori, kas ļauj ikvienam, pat ar ierobežotām tehniskām zināšanām, apgrieztā inženierijā lielāko daļu Delphi izpildāmo failu.

Ja jūs interesē Delphi reversās inženierijas programmas, es iesaku jums apskatīt dažus šādus 'dekompilatorus':

IDR (Interactive Delphi Reconstructor)

Izpildāmo failu (EXE) dekompilators un dinamiskas bibliotēkas (DLL), rakstīts Delphi un izpildīts Windows32 vidē. Projekta gala mērķis ir izstrādāt programmu, kas spēj atjaunot lielāko daļu sākotnējo Delphi pirmkodi no kompilētā faila, bet IDR, kā arī citi Delphi dekompilatori to vēl nevar izdarīt. Tomēr IDR ir statusā, kas ievērojami atvieglo šādu procesu. Salīdzinot ar citiem labi zināmiem Delphi dekompilatoriem, IDR analīzes rezultātam ir vislielākā pilnība un uzticamība.

tālākpārdevējs

Revendepro programmā atrod gandrīz visas struktūras (klases, tipus, procedūras utt.) un ģenerē paskālu, procedūras tiks ierakstītas montāžā. Dažu montētāja ierobežojumu dēļ ģenerēto izvadi nevar pārkompilēt. Šī dekompilatora avots ir brīvi pieejams. Diemžēl šis ir vienīgais dekompilators, kuru nevarēju izmantot — tas prasa ar izņēmumu, kad mēģināt dekompilēt kādu Delphi izpildāmo failu.

EMS avota glābējs

EMS Source Rescuer ir viegli lietojama vedņa lietojumprogramma, kas var palīdzēt atjaunot pazaudēto avota kodu. Ja pazaudējat Delphi vai C++Builder projekta avotus, bet jums ir izpildāms fails, šis rīks var glābt daļu no zaudētajiem avotiem. Rescuer ražo visas projekta veidlapas un datu moduļus ar visiem piešķirtajiem īpašumiem un notikumiem. Izveidotajām notikumu procedūrām nav pamatteksta (tas nav dekompilators), bet tām ir koda adrese izpildāmajā failā. Vairumā gadījumu Rescuer ietaupa 50-90% jūsu laika, kas nepieciešams projekta atjaunošanai.

DeDe

DeDe ir ļoti ātra programma, kas var analizēt izpildāmos failus, kas apkopoti ar Delphi. Pēc dekompilācijas DeDe sniedz šādu informāciju:

  • Visi mērķa dfm faili. Tos varēs atvērt un rediģēt ar Delphi.
  • Visas publicētās metodes labi komentētā ASM kodā ar atsaucēm uz virknēm, importētiem funkciju izsaukumiem, klašu metožu izsaukumiem, vienības komponentiem, Try-Except un Try-Finally blokiem. Pēc noklusējuma DeDe izgūst tikai publicēto metožu avotus, taču izpildāmā failā varat apstrādāt arī citu procedūru, ja zināt RVA nobīdi, izmantojot izvēlni Tools|Disassemble Proc.
  • Daudz papildu informācijas.
  • Varat izveidot Delphi projekta mapi ar visiem dfm, pas, dpr failiem. Piezīme: pas faili satur iepriekš minēto labi komentēto ASM kodu. Tos nevar pārkompilēt!