04. december 2002 - 12:24Der er
13 kommentarer og 1 løsning
ASCII koder vs. maskinkode
Jeg sidder også skriver semester-rapport til universitetet, og blev lige i tvivl om et par ting.
Der er ialt 256 ASCII-koder, med hex-værdier fra 00H til FFH. Jeg skriver noget om hvordan en CPU forstår disse tegn når de befinder sig en programfil (exe/com). F.eks. skal bogstaverne MZ stå i starten af enhver eksekverbar fil, men hvad gør disse instruktioner? Hvad hedder de i assembler.
Kan CPU'en forstå alle værdier fra 00H til og med FFH?? kan de alle refereres til en instruktion i assembler-sproget??
Eksempelvis hedder er JNE=75H (en slags metode) og NOP=90H. Disse eksisterer i de udvidede ascii-karakterer. Bruges alle værdier mellem 00H til FFH til CPU-instruktioner??
Så hut jeg visker - bruger du hex. til at beskrive de forskellige steder i de forskellige registre som din cpu bruger... Du skal også regne med at alt det bliver compilet til binære tal -
Du gør dig skyldig i en meget stor og forvirrende misforståelse, hvis du forveksler maskininstruktions-koder med ASCII-koder.
Der er tale om de mulige værdier, der kan rummes i en 8-bit byte. Værdiområdet går, som du også nævner, fra 00H til FFH.
Hvis indholdet i en 8-bit byte skal opfattes som en maskin-instruktion, afhænger det af den pågældende CPU, hvilke værdier der er lovlige. Dette kan normalt læses i processor-håndbogen for CPU'en. Der er ingen begrænsninger i, hvilke dele af området 00H til FFH, der kan være lovlige.
ASCII-kode er en måde at indkode tekst, for at kunne gemme teksten i lageret, med 1 byte per tegn. Den er meget udbredt, men det er dog ikke den eneste. Fx vil teksten
jexpernaur> Jeg ved ikke om misforstår noget overhovedet. Men det eneste jeg spørger om, er om værdi området kan gå fra 00H til FFH?? Jeg nævnte også at jeg fokuserer på pentium 1. Her snakker jeg nok også om grund-instruktionerne siden 386'eren...
Jeg er godt klar over at ASCII-kodernes repræsentation i symboler (i tegnkode-tabellen) slet ikke har at noget at gøre med maskin-instruktionerne. Men dette er nok den eneste måde af forklare det på... At eksempelvis É (90H=ascii 144)faktisk betyder instruktionen NOP.
Bloomniveauet for rapporten er sat til højst 3.
soreno> Du nævner at "mov, ax" er = B8H de næste 2 byte er derefter 2301 pga. af reverse sequence til værdien 0123H. Dette forstår jeg udemærket.
Hvad så med instruktionerne "mov, eax", "mov, ebx" og "add eax, ebx" - hvordan ser disse ud i ren maskinkode??
Lige et hurtigs spørgsmål som kræver et hurtigt svar :)
Jeg bruger også W32Dasm for at belyse hvordan en cracker arbejder. Jeg er med på hvordan offsets virker. Men hvorfor står der 0040 foran hver eneste offset/adress i filen (i W32Dasm)???
soreno> Takker. Men det er bare mystisk hvordan logikken er. I W32Dasm står der før den egentlige assembler-kode starter, at "Program entrypoint" er ved adressen 00401000 og file offset er 00004E00.
>>Starter alle exe-filer ved offset 400H?? Det finder jeg lidt mystisk. Windows bruger jo en flad memory model til allokering af memory. Derfor formoder jeg at alle user-processer starter ved 0h - de har jo hvert deres virtuelle hukommelses område.
Hvis du prøver lidt forskellige filer vil du observere at "File Offset" og "Program Entry Point" ikke altid er ens. Der står, som det øverste, hvordan fordelingen er - jeg vil gå udfra at denne fordeling bestemmes i den tidligere omtalte header som exe filer har.
F.eks. "rmiregistry.exe" Disassembly of File: C:\Program Files\jdk1.4.1\bin\rmiregistry.exe Code Offset = 00001000, Code Size = 00003000 Data Offset = 00005000, Data Size = 00002000
Number of Objects = 0003 (dec), Imagebase = 00400000h
Altså begynder code ved: Imagebase(?) + Code Offset = 00401000h
Men hvad den "Imagebase" er for'n fætter, ja - det kunne jeg da også godt tænke mig at vide.
Jeg ved ikke om du stadig er interesseret i hvilke opcodes der findes og hvilke værdier de har, men jeg er netop stødt ind i følgende som muligvis kunne være interessant: http://www2.dgsys.com/~raymoon/faq/gen1.html#5
soreno> Takker for info om opcodes. Fandt du nogensinde ud af hvad imagebase er for noget? Hvorfor fylder den 4Megabyte i selve disassembler koden? Er det selve hukommelses segmentet programmet ligger sig i, der får den adresse-struktur med 4MB data i starten...eller what?? :)
Hvordan skal adresser forstås i W32Dasm hvis det ikke er offsets??
Intel4004
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.