AAA ajustement ascii de AL après une addition AAD ajustement ascii de AX avant une division AAM ajustement ascii de AL après multiplication AAS ajustement ascii de AL après soustraction ADC addition avec retenu CF ADD addition sans retenu AND allez, chercher ... ARPL ajuste le niveau de privilège en mode protégé BOUND teste un nombre par rapport à des limites BSF cherche 1 bit de droite à gauche BSR cherche 1 bit de gauche à droite BSWAP conversion d'un registre au format INTEL BT charge 1 bit en CF BTC charge 1 bit en CF et complément BTR charge 1 bit en CF puis le met à 0 dans la source BTS la même chose mais il le met à 1 dans la source CALL appel de sous programme CBW convertit l'octet en AL en un mot en AX CDQ convertit un mot en EAX en un quadruple mot en EDX:EAX CLC met l'indicateur à 0 dans CF CLD met l'indicateur à 0 dans DF CLI met l'indicateur à 0 dans IF CLTS met à 0 l'indicateur de changement de contexte en mode protégé CMC complémente l'indicateur CF CMP comparaison logique CMPSB, CMPSW comparaison de chaînes de caractères CMPSD comparaisons pour les chaines de caractères du 386 CMPXCHG compare l'accumulateur avec AL, AX ou EAX CWD convertit le contenu de AX en un double mot DX:AX CWDE convertit le contenu de AX en un double mot dans EAX DAA ajustement décimal de AL après une addition DAS ajustement décimal de AL après une soustraction DEC décrémentation DIV division non signée ENTER construit un cadre de pile pour une procédure de haut niveau ESC accès au coprocesseur (pour les bêtes de l'optimisation) HLT arrêt du processeur en attente d'un évênement externe IBTS insère une chaine de bits en mode protégé IDIV division signée IMUL multiplication signée IN lit un octet sur le port spécifié INC incrémentation INSB, INSW lit une chaine sur un port INT interruption logicielle INTO active l'interruption 4 si l'indicateur OF est armé IRET retour d'interruption IRETD retour d'interruption depuis un segment 32 bit JA saut si supérieur JAE saut si supérieur ou égal JB saut si inférieur JBE saut si inférieur ou égal JC saut si CF est à 1 JNC saut si CF est à 0 JCXZ saut si CX est à 0 JECXZ saut si ECX est à 0 JE saut si égal JG saut si arithmetiquement supérieur ou égal JMP saut à l'adresse indiquée JNA saut si non supérieur JNAE saut si non supérieur ou égal JNB saut si non inférieur JNBE saut si non inférieur ou égal JNE saut si non égal JNG saut si arithmetiquement non supérieur JNGE non ! je l'ecris pas, devinez :) JNL saut si non inférieur arithmetiquement JNLE devinez JNO saut si l'indicateur OF est à 0 JNP saut si parité impaire ou précisement PF à 0 JNS saut si positif JNZ saut si différent JO saut si OF est à 1 JP saut si parité paire JPE idem JPO idem que JNP JS saut si négatif JZ saut si égalité LAHF charge en AH la partie basse du registre des indicateurs LDS charge une adresse physique en DS:registre LEA charge une adresse effective LEAVE libère la pile LES charge une adresse physique en ES:registre LFS charge une adresse physique en FS:registre LGDT charge le registre de la table des descripteurs globaux en mode protégé) LGS charge une adresse physique en GS:registre LIDT charge le registre de la table des descripteurs d'interruption en mode protégé LLDT charge le registre de la table des descripteurs locaux LMSW charge (encore) le mot d'état de la machine en mode protégé LOCK verrouile le bus LODSB, LODSW charge en AL ou AX le contenu de DS:SI LODSD charge en EAX le contenu de DS:SI LOOP saut tant que CX <> 0 LOOPE saut tant que CX<> 0 et ZF=1 LOOPNZ saut tant que CX<>0 et ZF=0 LOOPZ comme LOOPE LSL charge une limite de segment en mode protégé LSS charge une adresse physique en SS:registre LTR charge le registre de tâche en mode protégé MOV transfert de donnée MOVS transfert une chaine de caractère de DS:SI en ES:DI MOVSD transfert une chaine de caractère double mot par double mot MOVSX transfert avec le signe MOVZX transfert avec une extension de 0 MUL multiplication non signée NEG négation NOP ne fait rien (et oui !) (NB par Le_Magicien : en réalité, exécute l'instruction XCHG AX, AX (c'est à dire échange les contenus respectifs des registres AX et AX). En gros, une instruction qui fait quelque chose, mais qui ne change rien. Très utilisée en cassage de protections de sharewares, mais pas très utile dans la programmation de virii) NOT opération logique NON OR opération logique OUT transmet un octet ou un mot à un périphérique OUTSB, OUTSW transmet une chaine de caractères à un port OUTSD transmet un double mot à un port POP dépile un mot POPA dépile les registres POPAD dépile tout les registres 32 bits POPF dépile un mot et le transfère vers le registre des indicateurs POPFD pareil que POPF avec un double mot sur 32 bits PUSH place sur le haut de la pile une valeur PUSHA empile tous les registres PUSHAD empile tout les registres 32 bits PUSHF empile le registre des indicateurs PUSHFD empile le registre des indicateurs 32 bits RCL rotation à gauche à travers CF RCR rotation à droite à travers CF REPZ, REPNZ préfixe de repétition REPE, REPNE traîtement des chaîne de caractères en association avec CX et les indicateurs RETN, RETF retour d'un sous-programme ROL rotation à gauche ROR rotation à droite SAHF copie de AH dans la partie basse du registre des indicateurs SAL décalage à gauche avec introduction de 0 SAR décalage à droite avec signe SBB soustraction non signée avec prise en compte de CF SCASB, SCASW compare une chaîne avec le contenu de AL ou AX SCASD compare une chaine avec EAX SETA initialisation à 1 si CF et ZF sont à 0, sinon initialisation à 0 SETAE idem seulement si CF est à 0 SETB idem si CF est à 1 SETBE pareil si CF ou ZF est à 1 SETE idem si ZF est à 1 (sinon toujours initialisation à 0) SETG pareil si ZF=0 et SF=OF SETGE pareil si SF=OF (Ndrl : tout le monde a du lacher là) SETL idem si SF<>OF SETLE pareil si ZF=1 et SF<>OF SETNA pareil que SETBE SETNAE comme SETB SETNB comme SETAE SETNBE comme SETA SETNE initialisation à 1 si ZF=0 sinon initialisation à 0 SETNG comme SETLE SETNGE comme SETL SETNL comme SETGE SETNLE comme SETG SETNO initialisation si OF=0 sinon init à 0 SETNP idem si PF=0 SETNS si SF=0 SETNZ si ZF=0 SETO si OF=1 SETP si PF=1 SETPE comme SETP SETPO si PF=0 SETS si SF=1 SETZ si ZF=1 SGDT sauvegarde le registre de la table des descripteurs globaux en mode protégé SHL aller voir SAL SHLD décalage double à gauche SHR décalage droite avec introduction à 0 SHRD décalage double à droite SIDT sauvegarde le registre de la table d'interruption en mode protégé SLDT pareil pour la table des descripteur locaux SMSW sauvegarde le mot d'état de la machine en mode protégé STC met à 1 l'indicateur CF STD pareil pour DF STI idem pour IF STIOSB, STIOSW transfert du contenu de AL en ES:DI STOSD transfert de EAX en ES:DI STR sauvegarde le registre de tâche (mode protégé) SUB soustraction non signée TEST teste si un bit est à 1 VERR teste l'autorisation de lecture d'un segment sous le mode protégé VERW teste l'autorisation d'écriture dans un segment en mode protégé WAIT attend que la ligne busy ne soit pas active XADD addition signée XBTS prend une chaine de bit (mode protégé) XCHG échange le contenu de 2 registres (comme swap en basic) XLAT charge en AL l'octet de la table DS:BX+AL XOR opération logique très connue (ou exclusif) RRRRRaaaaaaahhhhhhhh !!! C'était très long :)
|
Offset Taille Contenu Description 00h | 2 | 5a4dh='MZ' | signature d'un fichier exe 02h | 2 | long fichier mod 512 | Taille de la dernière page 04h | 2 | long fichier div 512 | Compteur de page 06h | 2 | | Nombre d'entrées dans la table de relogement 08h | 2 | multiple de 16 | Taille de l'en-tête en paragraphes 0Ah | 2 | | Nombre minimal de paragraphes nécessaires 0Ch | 2 | | Nombre maximal de paragraphes nécessaires 0Eh | 2 | SS initial | valeur initiale du segment de pile 10h | 2 | SP initial | 12h | 2 | | Checksum du header (souvent inutilisé) 14h | 2 | IP initial | Valeur initiale du pointeur d'instruction 16h | 2 | CS initial | Valeur initiale du segment de code 18h | 2 | Offset de la table | offset du début de la table de relogement 1Ah | 2 | Overlay | au début, cette valeur est fixé à 0 1Ch | 2 | | Variable mémoire tampon |
VIRII segment VIRUS: mov ax, cs ; on transfère le segment de code dans ax mov ds, ax ; donc ds=cs ... ... ; votre virus ici ... cli ; indicateur d'interruption est mis à 0 (désactivation des interruptions externes) mov ss, cs:[HOTEP] ; replace les valeur initiales de la pile du prog hôte mov sp, cs:[HOTEP+2] ; remet la valeur initiale de SP du prog hôte sti ; l'indicateur d'interruption est remis à 1 jmp dword ptr cs:[HOTEC] ;saut vers le début du prog hôte HOTEP dw ?,? ; valeur initiale du segment de la pile HOTEC dw ?,? ; valeur initiale du segment de code |