émulateur de Licorne: savoir si le registre est indéfini


0

Peut-être que je suis stupide, mais je ne vois vraiment rien dans leur documentation. Dire que je émulent ce code

mov eax, 1 
mov ecx, 2 

Ensuite, je peux obtenir le résultat comme ceci:

int rr; 
uc_reg_read(uc, UC_X86_REG_ECX, &rr); 

Maintenant, je dois me demander - ce qui se passe quand je lis d'un registre non défini, par exemple ESI?

uc_reg_read(uc, UC_X86_REG_ESI, &rr); 

réponse est rr == 0. Mais comment puis-je détecter que ce registre est indéfini, plutôt que « 0 »?

0

un émulateur nécessite votre entrée pour émuler si vous n'avez pas défini quelque chose que vous évidemment obtenir ce qu'il a été initialisé avec

commence apparemment licorne initialisés avec 0 pour tous les registres, il semble

src lire tous registres à l'aide du api donné

:\>cat testumu.cpp 
#include "unicorn.h" 
#pragma comment(lib,"unicorn.lib") 
#define REG_NUMS 9 
void main (void) { 
    uc_engine *uc; 
    int regs[REG_NUMS] = { 
     UC_X86_REG_EAX,UC_X86_REG_EBX,UC_X86_REG_ECX, 
     UC_X86_REG_EDX,UC_X86_REG_EBP,UC_X86_REG_ESP, 
     UC_X86_REG_ESI,UC_X86_REG_EDI,UC_X86_REG_EIP 
    }; 
    int bugs[REG_NUMS] = {1,2,3,4,5,6,7,8,9}; 
    void *vals[REG_NUMS]; 
    for(int i =0; i<REG_NUMS;i++) { 
     vals[i] = &bugs[i]; 
    } 
    printf("values before reading\n\n"); 
    for(int i =0 ; i< REG_NUMS; i++) { 
     printf("%x\t%x\n" , regs[i],*(int *)vals[i]); 
    } 
    if((uc_open(UC_ARCH_X86, UC_MODE_32, &uc)) == UC_ERR_OK) { 
     uc_reg_read_batch(uc,regs,vals,9); 
    } 
    printf("values after reading\n\n"); 
    for(int i =0 ; i< REG_NUMS; i++) { 
     printf("%x\t%x\n" , regs[i],*(int *)vals[i]); 
    } 
} 

compilé et lié avec la communauté de vc2017 cmd invite x86

:\>cl /nologo /Zi /W4 /analyze /Ox testumu.cpp /link /release 
testumu.cpp 

:\> 

résultats exécutable compilé

:\>testumu.exe 
values before reading 

13  1 
15  2 
16  3 
18  4 
14  5 
1e  6 
1d  7 
17  8 
1a  9 
values after reading 

13  0 
15  0 
16  0 
18  0 
14  0 
1e  0 
1d  0 
17  0 
1a  0 

:\> 
  0

ce que je veux savoir est essentiellement si un émulé asm Snipped modifié/a établi un registre donné. Pour cela, je pourrais mettre tout le registre à une valeur magique et ensuite vérifier après l'émulation ceux qui diffèrent. Je me demande s'il existe une meilleure méthode. 19 nov.. 172017-11-19 23:19:47