Pitanje:
Kako se kodiraju x86 upute za CPU?
Henry Heikkinen
2013-03-20 00:30:22 UTC
view on stackexchange narkive permalink

Pišem malu uslužnu knjižnicu za povezivanje funkcija u vrijeme izvođenja. Moram saznati duljinu prvih nekoliko uputa jer ne želim ništa pretpostavljati ili zahtijevam od programera da ručno unese količinu bajtova za premještanje i prepisivanje.

Postoji mnogo sjajnih resursa za naučite montažu, ali čini se da niti jedna od njih ne ulazi u detalje o tome kako se mnemotehnika montaže pretvara u sirove binarne upute.

Ne vidim kako se ovo odnosi na obrnuti inženjering, osim što biste mogli rabiti rastavljač da vam obavi posao.
Ovaj ulazak na blog trebao bi biti donekle relevantan u vezi s funkcijama povezivanja u vrijeme izvođenja: http: //blogs.msdn.com/b/oldnewthing/archive/2011/09/21/10214405.aspx
Nažalost, iz mog iskustva, odgovor je "na zaista užasan i proizvoljan način". Sretno :)
Do sada moj omiljeni vodič: http://www.c-jump.com/CIS77/CPU/x86/lecture.html Ne pokriva sve, ali je dobar početak.
Sedam odgovori:
#1
+19
Peter Andersson
2013-03-20 01:02:18 UTC
view on stackexchange narkive permalink

Ako želite detaljno razumjeti kodiranje uputa, trebate proučiti Priručnik za programere softvera Intel® 64 i IA-32 Arhitekture, svezak 2 (Referenca skupa uputa, A-Z). Imajte na umu da su Intel IA-32 i AMD64 vrlo složeni skupovi uputa i kako biste priključili funkciju koja nije posebno dizajnirana za priključivanje ubrizgavanjem skoka, naletjet ćete na velik broj različitih uputa. Ne postoji jamstvo da funkcija ima čak i postavljen okvir sloga.

Postoje biblioteke koje mogu izvršiti rastavljanje i spajanje umjesto vas, poput Zaobilaznica tvrtke Microsoft Research.

Hvala! Čini se da je upravo to ono što tražim. Zaobilaznice su gotovo isto što i ja, ali izmišljam kotač u obrazovne svrhe.
Oprezno, EULA za zaobilaznice nije baš ono što bi netko nazvao liberalnim. Znam da se na njega odnosi svugdje, ali licenca koja je priložena diskvalificira ga zbog mnogih stvari.
#2
+10
Tyilo
2013-03-20 00:35:23 UTC
view on stackexchange narkive permalink

Možete koristiti rastavljač za prelazak s binarnih opkodova na sklopni kod.

Na primjer, naredba ndisam to može učiniti.

Ako imaju sljedeće binarne opkodove (heksadecimalni prikaz datoteke):

  31C0FFC0C3  

Sljedeći izlaz dobit ćete prilikom rastavljanja s ndisasm kod>:

  00000000 31C0 xor ax, ax00000002 FFC0 inc ax00000004 C3 ret  

Gdje je prvi stupac odmak datoteke, drugi su binarni kodovi a posljednji redak je kod sklopa.

Tada biste mogli dobiti drugi stupac i dobiti njegovu duljinu niza i podijeliti s 2 i imali biste duljinu upute u bajtovima.

Iako ovo objašnjava kako to učiniti ručno na naredbenom retku, mislim da to nije prikladan pristup za uslužnu biblioteku koja u vrijeme izvođenja spaja proizvoljan kôd. Ako je ndisasm dostupan kao knjižnica, možda bi mogao funkcionirati, ali tada biste to trebali dodati svom odgovoru.
U osnovi sam koristio biblioteke [udis86] (http://udis86.sourceforge.net/) i [opdis] (http://mkfs.github.com/content/opdis/). Obje rade prilično dobro i (iirc) će duljinu svake instrukcije izložiti kao člana strukture, umjesto da mora analizirati asm izlaz.
@SeanB. pregledavajući brzo "udis86", vidim da se prebacio na [github] (https://github.com/vmt/udis86).
#3
+6
Dougall
2013-03-20 07:14:41 UTC
view on stackexchange narkive permalink

Mnogi su ljudi spomenuli Intelove priručnike koji su neprocjenjiva referenca, ali prilično pozamašni. Predložio bih da pogledate ovu wiki stranicu OSDev-a kako biste dobili ideju o tome kako su upute kodirane na jednostavnijoj razini.

Za sve praktične probleme s traženjem dužine uputa, savjetovao bi upotrebu rastavljača.

Povezivanje funkcija zanimljiv je izazov. Ovaj MSDN blog dobro objašnjava neke poteškoće. Ovisno o zahtjevima, možda bi bilo poželjno upotrijebiti funkciju otklanjanja pogrešaka operacijskog sustava za pričvršćivanje na proces, "prekidanje" funkcija i implementaciju vaše udice u zasebnom procesu.

To izgleda kao izvrstan pregled. Hvala!
#4
+4
Artelius
2015-09-23 12:00:30 UTC
view on stackexchange narkive permalink

Ovaj članak CodeProjekta izvrstan je prikaz x86 formata uputa na visokoj razini (s dijagramima!). Nakon što ovo pročitaju, detaljnije reference imat će više smisla.

Zbog mnogih godina unatrag kompatibilnog razvoja, format x86 instrukcija prilično je složen, sa svim vrstama neobaveznih prefiksa i polja ovisnih o uputama, pa pomalo je nezgodno razraditi duljinu instrukcije. Ako želite nešto robusno, savjetovao bih da prilagodite postojeći softver, a ne da ga sami valjate. Ali razumijevanje ovih koncepata bit će, naravno, od velike pomoći.

#5
+3
Andrew
2013-03-20 00:56:02 UTC
view on stackexchange narkive permalink

Osnovnu istinu o dekodiranju uputa možete pronaći u priručniku za procesore za programere softvera. Autori asemblera to moraju znati, tako da informacije postoje. Za Intel je to na početku sveska 2A (mislim da sam se izgubio, jer su sve priručnike strpali u jedan PDF). Postoji velika tablica koja definira kako se kodiraju prefiksi, kako kodiraju opkodovi i kako se kodiraju operandi. Nije najlakše čitati, ali ima ...

Hmm, kad je to bilo? Čak i prije samo nekoliko tjedana svi su bili lijepo odvojeni u zasebne PDF datoteke ...
#6
+3
WPrecht
2013-03-20 01:02:40 UTC
view on stackexchange narkive permalink

Priručnik IA-32 Intel® Architecture Software Developer's Priručnik sv. 2 u svoj svojoj umnoženoj slavi.

#7
  0
Milhous
2015-09-21 06:25:22 UTC
view on stackexchange narkive permalink

Možete upotrijebiti knjižnicu Capstone za rastavljanje uputa na adresi koju gledate. Ima mogućnost da za vas utvrdi koliko je uputa u bajtovima, a zatim to možete koristiti u svom kodu.

http://www.capstone-engine.org/



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...