Grundlæggende reverse engineering-teknikker
Anvend Deres debugging- og disassembly-færdigheder til at analysere simple binære filer, identificere funktioner og forstå programlogik uden kildekode.
Grundlæggende reverse engineering-teknikker er en gratis Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Assembly-sprog og x86-systemprogrammering på lavt niveau, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.
Hvad er reverse engineering?
Reverse engineering (RE) er processen, hvor software analyseres for at forstå dens indre funktioner uden adgang til den oprindelige kildekode. Tænk på det som at være detektiv for programmer!
Det indebærer, at du tager et kompileret program (en binærfil) og arbejder baglæns for at finde ud af, hvad det gør, hvordan det gør det og nogle gange hvorfor.
Dit værktøjssæt til RE
Til reverse engineering bruger du primært to slags værktøjer:
- Dekodere: Disse værktøjer omdanner maskinkode (et programs rå bytes) tilbage til assemblysprog, som mennesker kan læse. Populære eksempler er
objdump, IDA Pro og Ghidra. De er dine "øjne" ind i programmets instruktioner. - Fejlfindere: Værktøjer som GDB (GNU Debugger) lader dig køre et program trin for trin, sætte udførelsen på pause og undersøge indholdet af registre og hukommelse på ethvert tidspunkt. De er dine "hænder", når du interagerer med det kørende program.
Mød målprogrammet
I denne lektion analyserer du et enkelt x86-assemblyprogram. Forestil dig, at du kun har den kompilerede version og skal finde frem til logikken!
Programmet simulerer et grundlæggende "adgangskodetjek" ved at sammenligne to hardkodede værdier og udskrive en meddelelse baseret på resultatet.
section .data
msg_access db "Access granted!", 0xA
len_access equ $ - msg_access
msg_denied db "Access denied.", 0xA
len_denied equ $ - msg_denied
section .text
global _start
_start:
; Simulate checking a "password" value
mov eax, 1234 ; Our "secret" password value
mov ebx, 5678 ; A "user-provided" value
cmp eax, ebx ; Compare secret with user input
je .access_granted ; If equal, jump to access granted
.access_denied:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg_denied
mov edx, len_denied
int 0x80
jmp .exit
.access_granted:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg_access
mov edx, len_access
int 0x80
.exit:
mov eax, 1 ; sys_exit
mov ebx, 0 ; Exit code 0
int 0x80Kompilering og dekodning
Først kompilerer vi vores assemblyprogram til en eksekverbar fil. På Linux indebærer det typisk en assembler (som NASM) og en linker (som LD).
nasm -f elf32 program.asm -o program.old -m elf_i386 program.o -o program
Derefter bruger vi en dekoder som objdump for at se maskinkoden omdannet tilbage til assembly:
objdump -d program
Her er et udsnit af det, du muligvis ser:
08048060 <_start>:
8048060: b8 d2 04 00 00 mov $0x4d2,%eax
8048065: bb 36 16 00 00 mov $0x1636,%ebx
804806a: 39 d8 cmp %ebx,%eax
804806c: 74 1c je 804808a <.access_granted>
Identifikation af startpunkter
Når du udfører reverse engineering, er programmets startpunkt noget af det første, du leder efter. Det er her, udførelsen begynder.
For Linux-eksekverbare filer, der er kompileret fra assembly, hedder startpunktet ofte _start. I vores dekodede output kan du se etiketten <_start> på adressen 08048060.
Det fortæller dig præcis, hvor CPU'en begynder at udføre instruktioner, når programmet indlæses.
Sporing af programflow og spring
For at forstå et programs logik skal du følge dets udførelsesforløb. Instruktioner med betingede spring er afgørende for at forstå beslutninger, f.eks. if/else-sætninger.
I vores eksempel ser vi efter sammenligningen af eax og ebx med cmp %ebx,%eax je 804808a <.access_granted>.
cmp: Sammenligner to værdier og indstiller CPU-flag.je(Jump if Equal): Hvis sammenligningen gav et lighedstegn, springer udførelsen til adressen0804808a(vores blok.access_granted).- Hvis værdierne ikke er ens, fortsætter udførelsen med den næste instruktion i rækkefølgen (blokken
.access_denied).
Forståelse af systemkald
Programmer interagerer med operativsystemet gennem systemkald. På Linux x86 (32-bit) startes de typisk med instruktionen int 0x80.
Før int 0x80 indlæses bestemte registre med værdier:
eax: Indeholder systemkaldets nummer, f.eks.4forsys_writeog1forsys_exit.ebx, ecx, edx: Indeholder argumenter til systemkaldet, f.eks. fildeskriptor, bufferadresse og længde forsys_write.
Ved at observere disse mønstre kan du identificere handlinger som at skrive til konsollen eller afslutte programmet.
Udtrækning af strenge og data
Meddelelser og andre statiske data gemmes i datasektioner i binærfilen. Du kan ofte se dem med objdump -s -j .data program eller objdump -s -j .rodata program.
I assemblykoden ser du instruktioner, der indlæser adressen på disse strenge i et register, f.eks. mov ecx, 0x8049080, hvor 0x8049080 peger på en streng.
I vores eksempel findes meddelelserne "Access granted!" og "Access denied." i sektionen .data, og deres adresser sendes til sys_write.
Genskabelse af den oprindelige logik
Ved at samle alle disse observationer kan vi genskabe programmets oprindelige logik:
- Det starter ved
_start. - Det indlæser to bestemte heltalsværdier i
eaxogebx. - Det sammenligner disse to værdier.
- Hvis de er ens, springer det til en sektion, der udskriver "Access granted!" i konsollen.
- Hvis de ikke er ens, fortsætter det til en sektion, der udskriver "Access denied." i konsollen.
- Efter udskrivningen afsluttes programmet korrekt.
Dette er essensen af reverse engineering: at forstå programmets hensigt og adfærd ud fra dets kompilerede form.
Hurtigt tjek
Se på følgende deassemblerede x86-udsnit. Antag, at 0x402000 indeholder strengen "Yes\n", og at 0x402008 indeholder "No\n".
0x401000: mov eax, 0x5
0x401005: mov ebx, 0x5
0x40100a: cmp eax, ebx
0x40100c: jne 0x401018
0x40100e: mov edi, 0x402000 ; "Yes\n"
0x401013: call 0x401040 <puts@plt>
0x401018: mov edi, 0x402008 ; "No\n"
0x40101d: call 0x401040 <puts@plt>
Opsummering af lektionen
I denne lektion har du lært de grundlæggende teknikker inden for reverse engineering:
- At forstå, hvad RE er, og hvorfor det er vigtigt.
- At identificere vigtige værktøjer som deassembleringsværktøjer (
objdump) og fejlfindere (GDB). - At finde programmets startpunkt (
_start). - At følge programmets forløb ved hjælp af betingede spring (
cmp,je). - At genkende systemkald (
int 0x80) og deres parametre. - At udtrække meningsfulde strenge og data fra den binære fil.
Ved at anvende disse teknikker kan du begynde at genskabe programmers logik og funktionsmåde, selv uden deres oprindelige kildekode!
Lær Assembly med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Grundlæggende reverse engineering-teknikker” gratis?
Ja — hele teksten til “Grundlæggende reverse engineering-teknikker” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset, skal du opgradere til CoddyKit PRO. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Grundlæggende reverse engineering-teknikker”?
Anvend Deres debugging- og disassembly-færdigheder til at analysere simple binære filer, identificere funktioner og forstå programlogik uden kildekode. Du øver dig i Assembly-sprog og x86-systemprogrammering på lavt niveau med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Assembly-sprog og x86-systemprogrammering på lavt niveau?
Der kræves ingen tidligere erfaring. Assembly-sprog og x86-systemprogrammering på lavt niveau på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Grundlæggende reverse engineering-teknikker”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion?
Ja. Alle Assembly-sprog og x86-systemprogrammering på lavt niveau-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Brug af GDB til Assembly-debugging
- Introduktion til disassembly-værktøjer
- Grundlæggende reverse engineering-teknikker
- Dynamisk analyse med tracing og hooking