Map and projects (the most frequently updated page of this blog)

2010/04/02

Lutte contre les mots faciles, lutte contre la haine des ...

user-mode opcodes cheat sheets
I mostly work on user-mode code, or kernel-mode code that actually uses a very limited amount of privileged opcodes, just to access CR0 and IF. Besides, FPU/MMX/SSE are usually used as junk or pure calculation that I can ignore.

So, from that limited perspective, the amount of opcodes is much reduced.

A Perspective of two-byte opcodes
After my overview of one-byte opcodes, I made a graph of two-byte opcodes according to that perspective.
It makes it much more readable than expected!

Opcodes' reminders
Also, I checked every user-mode opcode, and wrote a one-liner to describe them, as well as a small example. I put together an executable with all the examples, just to see them in action - and test your favorite emulator ;)

It makes them small opcodes' reminders, in printable text and executable code formats.

All obvious opcodes are naturally included, but also (since ALL user-mode opcodes are present):
ARPL, BOUND, LDS, LAR, STR, XADD, SYSENTER,
XLAT, VERR, SALC, AAA, CMPXCHG, SIDT...
aka 'all the ones I forget too quickly'.

Opcodes (One-byte overview, two-byte perspective, opcodes' description)
Opcodes test executable (source)

The executable may not work on (older?) AMD cpus (because of SYSENTER), and may fail under virtualization or other OS but XP (SIDT, STR, etc...)

Thanks to Costin Ionescu and BeatriX.

Sysenter Anti-stepping
I noticed that, like Int2E, Sysenter behaves differently if stepped or ran over.
for example, with EAX = 0:
if stepping,
ECX, EDX = 1, -1.
If ran normally,
ECX, EDX = esp - 4, @KiFastSystemCallRet.




Penses-bêtes pour instructions en mode utilisateur
Je travaille principalement avec du code en mode utilisateur, ou du code noyau qui n'utilise en fait qu'un nombre très limité d'instructions privilégiées, juste pour accéder a CR0 et IF. De plus, FPU/MMX/SSE sont utilisés d'habitude comme code pourri, ou comme calcul pur que je peux ignorer.

Donc, avec cette perspective limitée, le nombre d'instructions est bien réduit.

Une perspective des instructions sur deux octets
Après ma vue d'ensemble sur les instructions sur un octet, j'ai fait un graphe des instructions sur 2 octets selon cette perspective.
Ça rend les choses beaucoup plus lisibles que je ne l'imaginais!

Penses-bêtes d'instructions
De plus, j'ai regardé chaque instruction utilisateur, et écrit une courte description pour chacun, avec un petit exemple. J'ai fait un exécutable avec tous ces exemples, juste pour voir ces instructions en action - et tester votre émulateur favori ;)

Ça donne 2 petits pense-bêtes pour instructions, l'un en texte imprimable, et l'autre en code exécutable.

Toutes les instructions évidentes sont bien évidemment présentes, mais aussi (puisqu'elles y sont TOUTES):
ARPL, BOUND, LDS, LAR, STR, XADD, SYSENTER,
XLAT, VERR, SALC, AAA, CMPXCHG, SIDT...
autrement dit, 'celles que j'oublie toujours trop vite'.

Opcodes (One-byte overview, two-byte perspective, opcodes' description) (ANGLAIS)
le fichier de test des opcodes (source)

L'exécutable peut ne pas fonctionner sur les (vieux?) processeurs AMD à cause de SYSENTER, et échouer sur une VM ou un OS autre que XP (SIDT, STR, etc...)

Merci à Costin Ionescu et BeatriX.

Anti-pas-à-pas SYSENTER
J'ai remarqué que, comme Int2E, SYSENTER se comporte différemment si lancé ou exécuté pas-à-pas.
Par exemple, avec EAX = 0:
en pas-à-pas,
ECX, EDX = 1, -1.
en exécution normale,
ECX, EDX = esp - 4, @KiFastSystemCallRet.

No comments:

Post a Comment