Scrierea pe Delfi kriptor (kriptora sursa)

În acest articol, voi oferi un exemplu de rulare executabil simplu
fișiere. În timpul acționării codului sursă va produce
explicațiile necesare.

Deci, teoria și condițiile necesare

Să începem cu formatul parsare fișiere executabile PortableExecutable (PE). Ceea ce acest format este vorba.

Structura de fișiere este după cum urmează:

Acesta conține un vechi DOS-header + DOS program

Acesta conține informațiile necesare cu privire la PE-fișier

Să conțină informațiile necesare despre secțiunile din dosar

Acesta conține doar codul în sine, informații, resurse, și altele.

Orice date atribuite la sfârșitul PE-fișier (nu poate fi prezent)

Nu este nimic complicat aici. DOS-cap - este doar DOS
Programul, care afișează de obicei un mesaj, cum ar fi: «Acest program trebuie să fie
rula sub Win32 »sau ceva de genul asta și se închide.

PE-antet conține informații de proprietate în procesul de a scrie o mulțime de ori îl vom folosi.

Titlurile secțiunilor din fișierul program conține informații despre locul unde, respectiv, secțiunea corespunzătoare.

secțiunea Sami este bucăți de cod, date, resurse, informații de serviciu,
cum ar fi: masa de import / export, relocari, informații de depanare și
și colab.

Suprapunere toate acestea este faptul că, după încheierea PE-fișier. suprapunerile de multe ori
Nu există fișiere regulate, dar aproape întotdeauna în arhive și SFX-
distribuții.

Cred că totul este clar, prin urmare, vom proceda la o mai detaliată
Studiul format PE-antet și secțiuni. În PE-antet voi explica numai
acele domenii care avem nevoie.

Pentru a găsi începutul fișierului PE-antet trebuie să fie citite dintr-un fișier
Valoarea DWORD la offsetul $ 3C. Este stocat compensat de la început
fișier înainte de PE-antet.

Câmpurile necesare PE-header:

secțiunea steaguri biți

Există, de asemenea, nu e mare. După toate antetele, aliniere
ori mai mare de fișiere se aliniază merge direct la secțiunea fișierului executabil.
Dacă nu înțelegeți ce este scris mai sus, sau doresc mai multe detalii
să examineze formatul PE, recomand să citiți documentația, de exemplu,
„PortableExecutables format de fișier» executabile de la Înțelepciune greu.

Ei bine, acum vom începe să scrie direct benzii de rulare noastre.

Pentru a porni fișierul de intrare, avem nevoie pentru a verifica dacă acesta este executabil,
chiar și în formatul PE. Cei care au citit cu atenție este deja scris mai sus
poate ghici că ar trebui să ia.

În primul rând, verificați dacă primul cuvânt (Word), file = 'ZM' ($ 5A4D), în cazul în care nu, nu e pe orice program.

În al doilea rând, cuvântul din tura de $ 18 ani trebuie să fie> = $ 40, dacă și numai dacă DWORD câmp la offset-ul $ 3C are sens.

Apoi, verificați semnătura în PE-antet, care ar trebui să fie egală cu $ 00004550.

În cazul în care sunt îndeplinite toate aceste condiții, atunci, în principiu, putem încerca să se ocupe de dosar.

Pentru comoditate, vom crea un prototip al functiei care se va ocupa de dosar.

szFileName - calea către fișierul, dwFlags - parametri suplimentari. Apoi, doar pentru a verifica validitatea fișierului

Deci, suntem capabili de a verifica fișierul de valabilitate. Acum puteți începe
scris direct codul benzii de rulare. Dar, mai întâi, un pic din nou
teorie.

Protector - este un program care înseamnă că ar trebui să conțină codul executabil.
Prin urmare, trebuie să adăugați acest cod la fișierul de pre-compilate.
După cum este bine cunoscut în codul PE-fișier este stocat în secțiunea (deși nu este
cod obligatoriu, de exemplu, pot fi stocate în antet). Pentru aceasta noi
nevoie doar de una dintre următoarele: pentru a adăuga codul de la ultima secțiune
fișier sau creați o nouă secțiune. Prima opțiune este mai ușor, iar noi suntem calea ușoară
Nu cauta, asa ca am ales a doua.

Pentru a adăuga o secțiune pentru următorii pași pentru a executa fișierul:

1) Creșterea valorii unui antet câmp NumOfObjects PE-1.

2) este adăugat la sfârșitul ultimului antet secțiune este un alt titlu din această secțiune

3)
Setați atributele secțiunii noastre, astfel: VirtualSize = PhysicalSize =
4096 (această valoare pentru că noi nu avem nimic
alinia, după cum Acest câmp este o egalizare valoare multiplă, și 4 kilobytes
codul nostru ar fi de ajuns). PhysicalOffset = PhysicalOffset ultima
sectiunea + PhysicalSize ultima secțiune. VirtualAddress = VirtualAddress
ultima secțiune + VirtualSize ultima secțiune, atunci această valoare
trebuie să instalați SectionAlignment multiple la o valoare mai mare.
Atributele secțiune este cel mai bine pentru a seta citească și să scrie, de exemplu, sunt -
$ E0000040. Alte domenii de ciocănire zerouri. Un nume de secțiune poate atribui
orice.

4) Append chiar la sfârșitul secțiunii la dosar. Dimensiunea acesteia ne-am predeterminat deja și este PhysicalSize

5)
Este necesar să se corecteze valoarea câmpului PE-antet SizeOfImage și creșterea
dimensiunea sa la dimensiunea virtualului aliniate noua noastră secțiune.

După toate acestea, o nouă secțiune va apărea în fișierul program, în nostru
caz egală cu dimensiunea unei pagini în memorie. Rămâne ultima
întrebarea cum codul nostru să preia controlul. pentru a face acest lucru,
Am stabilit valoarea câmpului PE-antet egal punctul de intrare
VirtualAddress secțiunea noastră. Asta e tot. Acum, când începe programul
Managementul va primi codul nostru.

Acum, că am adăugat codul lor într-un fișier, avem nevoie de el la ceva
efectuate. În cel mai simplu caz, ar trebui să ne transfere imediat
programul gazdă. Acest lucru este realizat printr-o pereche de
instrucțiuni procesor.