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

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

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


Ранг: 663.2 (! !)
Статус: Участник
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



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

Создано: 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



Ранг: 663.2 (! !)
Статус: Участник
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



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

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

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

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


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

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

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

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



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

Создано: 27 декабря 2019 01:42 New!
Цитата · Личное сообщение · #6

Unicorn Engine tutorial - --> Link <--

In this tutorial you will learn how to use Unicorn Engine by solving practical exercises. There are 4 exercises and I will solve the first exercise for you. For the others I am providing hints and solutions, which you can obtain by clicking the spoiler buttons.

Fast FAQ:

What is Unicorn Engine?
It is an emulator. Not usual though. You don’t emulate whole program or system. Also, it doesn’t support syscalls. You have to map memory and write data into it manually, then you can start the emulation from a chosen address.

When is it useful?
You can call an interesting function from the malware, without creating a harmfull process
CTF’s
Fuzzing
Plugin for gdb that predicts the future, for example further jumps.
Emulating obfuscated code.
What do I need to have installed for this tutorial?
Unicorn Engine with python binding
A disassembler

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

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

Видеокурс ВЗЛОМ