[ protector1990 @ 09.08.2010. 17:12 ] @
Zdravo svima,
Imam jedan problemcic oko projektnog zadatka. Zadatak mi je da istrazim IRET funkciju u izvrsnim fajlovima, za sta bih malo trebao da se "igram" sa exe fajlovima, odnosno da vidim kako ce se ponasati ako izbrisem iz exe fajla IRET na nekom mestu i slicno.

Problem mi je u tome sto nemam pojma kako da prepoznam procesorske instrukcije u exe fajlovima (da bih uopste mogao da vidim gde je IRET da bih bilo sta mogao sa njim da radim), niti kako da fajl nateram da radi nakon sto modifikujem nesto u njemu.

Any help?
[ burex @ 09.08.2010. 18:37 ] @
Potreban ti je neki dissasembler (IDA, PEExplorer, npr.), ili neki HEX editor (mada prepoznavanje željenog koda sa njime ide mnogo-mnogo teže).
Svakoj procesorskoj instrukciji, kao što je to IRET, odgovara određeni OPCODE (instrukcija u heksadecimalnom obliku koji procesor razume). Za IRET, sudeći po ovome dokumentu je to "CF", ali to ni nećeš morati znati da prepoznaš ako budeš koristio gore navedene programe, pošto to oni čine za tebe.

Ukoliko izbrišeš iz EXE fajla negde IRET komandu (tj. na njegovo mesto staviš par NOP komandi), program će nastaviti da izvršava sve što dolazi posle tog iret-a i najverovatnije će da pukne :)
[ protector1990 @ 13.08.2010. 18:30 ] @
Hvala puno, ovo je pomoglo, ali sada imam jedan drugi problem - potreban mi je izvrsni fajl koji ce u sebi da ima rutinu za hendlovanje interapta. Kako da to napravim da radi? Pretpostavljam da bi to moglo da se uradi u C-u, ali ono sto ne znam je kako da neku C funkciju "stavim" u Interrupt Descriptor Table kako bi mogla da bude pozvana na neki interrupt.

P.S. Hocu da napravim softverski interrupt, naravno.
[ burex @ 16.08.2010. 11:16 ] @
Potrebno je da linkuješ jedan kompajlovani ASM file koji reaguje na interapte sa kompajlovanim C fajlom koji sadrži potrebne funkcije za reagovanje na interapt.

Prvo kod koji reaguje na interapt u ASM-u:
Code:
isr0:
 pusha
 call _nas_interrupt_c
 popa
 iret


Iznad toga, instrukcija za povezivanje sa funkcijom u eksternom C fajlu (obratiti pažnju na donju crtu ispred imena funkcije - obavezna je, iako ne postoji u C kodu):
Code:
[extern _nas_interrupt_c]


Evo primer kako bi 1 član IDT tabele trebao da izgleda:
Code:
dw isr0 ;dakle, pokazujemo na adresu gde je isr0 rutina, pa kada interapt opali, idemo pravac tamo
dw 0x08
dw 1000111000000000b
dw 0


Sledi kod za reagovanje na interapt u C-u:
Code:
void nas_interrupt_c() {/* Tralala */}


E, sad... pitanje je koliko tebi zapravo treba da taj kod bude u C-u? Pitam zbog toga što ne verujem da si već ušao u protected mode (32bit), a nisam siguran da li GCC podržava kompajliranje koda u 16bitnom mode-u niti da li je vredno baš bakćati se u tolikoj meri za to. Lakše bi ti možda bilo da umesto onog "call _nas_interrupt_c" staviš tvoj kod po potrebi u ASM-u.
[ burex @ 16.08.2010. 11:39 ] @
Zaboravio sam da odgovorim na:
Citat:
P.S. Hocu da napravim softverski interrupt, naravno.

Samo nemoj koristiti brojeve 0-31 u IDT-u za sopstvene interapte (rezervisani su), i već imaš softverski interapt. (pazi i da ne preusmeriš programmable interrupt timer ili tastaturu na tvoj specijalni interapt, ukoliko programiraš OS, da ne bi bilo belaja). Interapt naravno pozivaš sa komandom "int".