eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: panlik (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Софт, инструменты —› Unicorn - The ultimate CPU emulator
<< . 1 . 2 . 3 . 4 .
Посл.ответ Сообщение


Ранг: 655.4 (! !)
Статус: Участник
CyberMonk

Создано: 19 октября 2017 13:52 · Поправил: mak New!
Цитата · Личное сообщение · #1



Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator framework based on QEMU.

Unicorn offers some unparalleled features:

Multi-architecture: ARM, ARM64 (ARMv8), M68K, MIPS, SPARC, and X86 (16, 32, 64-bit)
Clean/simple/lightweight/intuitive architecture-neutral API
Implemented in pure C language, with bindings for Crystal, Clojure, Visual Basic, Perl, Rust, Ruby, Python, Java, .NET, Go, Delphi/Free Pascal, Haskell and Pharo.
Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed)
High performance via Just-In-Time compilation
Support for fine-grained instrumentation at various levels
Thread-safety by design
Distributed under free software license GPLv2


Последний мастер - --> Link <--
Последний релиз Version 1.0.2-rc1 - --> Link <--

Сборка - следуем указанию в --> Link <--

Code:
  1.  MINGW64 /n
  2. $ cd msys64/unicorn
  3.  
  4. @PC MINGW64 /n/msys64/unicorn
  5. $ ./make.sh cross-win64
  6. cd qemu && \
  7. ./configure --cc="x86_64-w64-mingw32-gcc" --extra-cflags="-DUNICORN_HAS_X86 -DUNICORN_HAS_ARM -DUNICORN_HAS_M68K -DUNICORN_HAS_ARM64 -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL -DUNICORN_HAS_SPARC " --target-list="x86_64-softmmu, arm-softmmu, m68k-softmmu, aarch64-softmmu, mips-softmmu, mipsel-softmmu, mips64-softmmu, mips64el-softmmu, sparc-softmmu,sparc64-softmmu," --disable-stack-protector

*Если MINGW64 Портабельный то здесь нужно указать полный путь с названием диска $ cd c:/msys64/unicorn

| Сообщение посчитали полезным: plutos, Isaev



Ранг: 312.4 (мудрец)
Статус: Участник

Создано: 28 августа 2019 08:30 · Поправил: DenCoder New!
Цитата · Личное сообщение · #2

Bronco
Примерно, как я эмулил VMOV. Читаем доку на проц по инструкциям, пишем декодинг, ставим хук на каждую инструкцию, где по опкодам выделяем содержащую регистр инструкцию, эмулим, регистр запоминаем где-нить внутри. Костыль, конечно, но временная мера, если очень надо
Code:
  1. #coding=iso-8859-1
  2.  
  3. from __future__ import print_function
  4. from unicorn import *
  5. from unicorn.arm_const import *
  6. #from capstone.arm_const import *
  7. #from allins import *
  8. #import idaapi
  9. #import idautils
  10. #import idc
  11. from cmnFuncs import *
  12.  
  13. #A1 encoding
  14.  
  15. def getDwField(dw, e, s = -1):
  16.          if(== -1): return (dw >> e) & 1
  17.                  
  18.          if(< s or s < 0): return 0
  19.                  
  20.          return (dw >> s) & ((2 << (- s)) - 1)
  21.  
  22. #own version of Replicate()
  23. def Replicate(val, bits):
  24.          return val | (val << bits)
  25.  
  26. def Rep8Bit8Times(imm8, n = 0):
  27.          if(== 7): return (imm8 & 1) * 0xff
  28.          return (Rep8Bit8Times(imm8 >> 1, n + 1) << 8) | (imm8 & 1) * 0xff
  29.  
  30. def AdvSIMDExpandImm(op, cmode, imm8):
  31.          if((cmode & 0xe) == 0): return Replicate(imm8, 32)
  32.          if((cmode & 0xe) == 2): return Replicate(imm8 << 8, 32)
  33.          if((cmode & 0xe) == 4): return Replicate(imm8 << 16, 32)
  34.          if((cmode & 0xe) == 6): return Replicate(imm8 << 24, 32)
  35.          if((cmode & 0xe) == 8): return Replicate(Replicate(imm8, 16), 32)
  36.          if((cmode & 0xe) == 0xa): return Replicate(Replicate(imm8 << 8, 16), 32)
  37.          if(cmode == 0xc): return Replicate((imm8 << 8) | 0xff, 32)
  38.          if(cmode == 0xd): return Replicate((imm8 << 16) | 0xffff, 32)
  39.  
  40.          if(cmode == 0xe):
  41.                  if(op == 0): return Replicate(Replicate(Replicate(imm8 << 8, 8), 16), 32)
  42.                  return Rep8Bit8Times(imm8)
  43.          
  44.          if(op == 0):
  45.                  #imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,5):imm8<5:0>:Zeros(19)
  46.                  imm32 = (((imm8 & 0x80 | 0x40) << 24) - ((imm8 & 0x40) << 19)) | ((imm8 & 0x3f) << 19)
  47.                  return Replicate(imm32, 32)
  48.          
  49.          #imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,8):imm8<5:0>:Zeros(48)
  50.          return (((imm8 & 0x80 | 0x40) << 56) - ((imm8 & 0x40) << 48)) | ((imm8 & 0x3f) << 48)
  51.          
  52. #return value:
  53. #        1 - test passed
  54. #        0 - test not passed
  55. #        -1 - UNDEFINED
  56. #надо реализовать аналогичную версию с возвращением типа инструкции, а не тестом, та или нет инструкция
  57. #под код по маске попадают сразу несколько инструкций, не только VMOV
  58. #зависит от op и cmode
  59. #но пока так
  60. def emu_vmov_imm(dw, mu = None):
  61.          code = 0xf2800010
  62.          mask = 0xfeb80090
  63.          
  64.          if((dw & mask) != code): return 0
  65.                  
  66.          op = getDwField(dw, 5) #op = dw<5>
  67.          cmode = getDwField(dw, 11, 8) #cmode = dw<11:8>
  68.          
  69.          if(op == 0):
  70.                  if((cmode & 1) and (cmode & 0xc) != 0xc): # VORR imm
  71.                         return 2
  72.          elif(cmode != 0xe): # other encodings
  73.                  return 3
  74.          
  75.          Q = getDwField(dw, 6) #Q = dw<6>
  76.  
  77.          Vd = getDwField(dw, 15, 12) #Vd = dw<15:12>
  78.          if(== 1 and (Vd & 1) == 1):
  79.           return -1
  80.          
  81.          if(mu is None): #тест пройден
  82.                  return 1
  83.          
  84.          #эмуляция
  85.          D = getDwField(dw, 22) #D = dw<22>
  86.          d = (<< 4) + Vd
  87.  
  88.          #i = dw<24>, imm3 = dw<18:16>, imm4 = dw<3:0>
  89.          i = getDwField(dw, 24)
  90.          imm3 = getDwField(dw, 18, 16)
  91.          imm4 = getDwField(dw, 3, 0)
  92.          imm8 = (<< 7) | (imm3 << 4) | imm4
  93.          imm64 = AdvSIMDExpandImm(op, cmode, imm8)
  94.          
  95.          #In AArch 32 state
  96.          #Smaller registers are packed into larger registers
  97.          #D16-D31 pack into Q8-Q15. For example, D16 and D17 pack into Q8
  98.          mu.reg_write(UC_ARM_REG_D0 + d, imm64)
  99.          if(== 1):
  100.                  mu.reg_write(UC_ARM_REG_D0 + d + 1, imm64)
  101.                  imm128 = Replicate(imm64, 64)
  102.                  print("VMOV Q%d, 0x%x" %(/ 2, imm128))
  103.                  val = (mu.reg_read(UC_ARM_REG_D0 + d) << 64) | mu.reg_read(UC_ARM_REG_D0 + d + 1)
  104.                  if(val != imm128): print("Values distincts")
  105.          else:
  106.                  print("VMOV D%d, 0x%x" %(d, imm64))
  107.                  val = mu.reg_read(UC_ARM_REG_D0 + d)
  108.                  if(val != imm64): print("Values distincts")
  109.  
  110.          return 4
  111.  
  112. #res = emu_vmov_imm(Dword(ScreenEA()))
  113.  
  114. #if(res == 1): print("This is VMOV")
  115. #elif(res == 0): print("This is not known Advanced SIMD instruction")
  116. #elif(res == 2): print("This is VORR")
  117. #elif(res == 3): print("This is Advanced SIMD instruction of other encoding")
  118. #elif(res == 4): print("VMOV emulation done")
  119. #elif(res == -1): print("Undefined")

| Сообщение посчитали полезным: plutos



Ранг: 655.4 (! !)
Статус: Участник
CyberMonk

Создано: 28 августа 2019 11:11 New!
Цитата · Личное сообщение · #3

Bronco пишет:
хз как это эмулить, получать то не от куда


Code:
  1. /* 0F 01 D0 */
  2. void BX_CPP_AttrRegparmN(1) BX_CPU_C::XGETBV(bxInstruction_c *i)
  3. {
  4. #if BX_CPU_LEVEL >= 6
  5.   if(! BX_CPU_THIS_PTR cr4.get_OSXSAVE()) {
  6.     BX_ERROR(("XGETBV: OSXSAVE feature is not enabled in CR4!"));
  7.     exception(BX_UD_EXCEPTION, 0);
  8.   }
  9.  
  10.   // For now hardcoded handle only XCR0 register, it should take a few
  11.   // years until extension will be required
  12.  
  13.   if (ECX != 0) {
  14.     if (ECX == 1 && BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_XSAVEC)) {
  15.       // Executing XGETBV with ECX = 1 returns in EDX:EAX the logical-AND of XCR0
  16.       // and the current value of the XINUSE state-component bitmap.
  17.       // If XINUSE[i]=0, state component [i] is in its initial configuration.
  18.       RDX = 0;
  19.       RAX = get_xinuse_vector(BX_CPU_THIS_PTR xcr0.get32());
  20.     }
  21.     else {
  22.       BX_ERROR(("XGETBV: Invalid XCR%d register", ECX));
  23.       exception(BX_GP_EXCEPTION, 0);
  24.     }
  25.   }
  26.   else {
  27.     RDX = 0;
  28.     RAX = BX_CPU_THIS_PTR xcr0.get32();
  29.   }
  30. #endif
  31.  
  32.   BX_NEXT_INSTR(i);
  33. }

| Сообщение посчитали полезным: plutos



Ранг: 269.3 (наставник)
Статус: Участник
Advisor

Создано: 28 августа 2019 15:55 New!
Цитата · Личное сообщение · #4

DenCoder пишет:
если очень надо

прежде чем постить, конечно же погрузился в талмуд..))
но мониторить на хуке, по ходу в первую очередь надо не саму инструкцию "XGETBV", а то что раньше переключало контекст AVX(XSAVE/XRSTOR). А в стыренном теле под виртой этого нет.
если с первым битом регистра xcr0 понятно, при саппорте проца и ОС, он всегда равен зеро, то со вторым битом я пока не разобрался. В энуме uc_x86_insn, набор AVX есть, но видимо это тупо пошло прицепом из энума диза.
Собственно для полноценной эмуляции цпу в юникорне дофуя чего ещё нужно, а у меня задача тупо хапнуть трассу с конкретного стыренного тела. Чтобы процесс эмуля не завершался, чего то надо тыкнуть в EDX, и переступить инструкцию...


Ранг: 269.3 (наставник)
Статус: Участник
Advisor

Создано: 23 октября 2019 19:05 New!
Цитата · Личное сообщение · #5

хм...обновился

| Сообщение посчитали полезным: DenCoder, mak

<< . 1 . 2 . 3 . 4 .
 eXeL@B —› Софт, инструменты —› Unicorn - The ultimate CPU emulator

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS