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

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


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

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

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

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


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

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



Unicorn is a lightweight multi-platform, multi-architecture CPU emulator framework.
Code:
  1. Highlight features:
  2.  
  3. Multi-architectures: Arm, Arm64 (Armv8), M68K, Mips, Sparc, & X86 (include X86_64).
  4. Clean/simple/lightweight/intuitive architecture-neutral API.
  5. Implemented in pure C language, with bindings for Clojure, Visual Basic, Perl, Rust, Haskell, Ruby, Python, Java, Go, .NET, Delphi/Pascal & MSVC available.
  6. Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed).
  7. High performance by using Just-In-Time compiler technique.
  8. Support fine-grained instrumentation at various levels.
  9. Thread-safe by design.
  10. Distributed under free software license GPLv2.
  11. Find in this BlackHat USA 2015 slides more technical details behind Unicorn engine.
  12. Unicorn is based on QEMU, but it goes much further with a lot more to offer.


Version 1.0.1 April 20, 2017
We are excited to announce version 1.0.1 of Unicorn Engine!

The source code & precompiled binaries are available in the download section. See documentation for how to compile and install Unicorn.

A quick tutorial on how to program with Unicorn in C & Python can be found here.

Important changes since v1.0 include:

Properly handle selected-architecture build.
Fix compilation issues on PPC & S390x.
Fix a memory leak on uc_mem_protect().
ARM:
Support big-endian mode.
Correct instruction size of Thumb/Thumb2 code.
Support read/write APSR register.
ARM64:
Support read/write NEON registers.
Support read/write NZCV registers.
Mips: Support read/write Mips64 registers.
X86: Support read/write MSR.
Haskell binding: update to the latest API.
Python: allow not having PATH setup.
Community also provide independent bindings for Pascal, Rust & Perl.

Последний мастер - --> Link <--
Последний релиз - --> 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

Или через файл проектов в Visual Studio 2015 ... в Visual Studio 2017 собрать пока не вышло.

Добавлено спустя 41 минуту
А теперь вопросы - замечания!

После полного перехода на VS2017, прошлые версии все были начисто удалены, первая трудность возникла с новым билдом Unicorn. Либ файлы, как динамические так и статические больше не создавались, появлялось сообщение -
Code:
  1. cmd /"windows_export.bat x64"
  2. Searching for installed visual studio version...
  3. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualS                                                                                                                                                                                                                                                                                           tudio\12.0
  4. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualS                                                                                                                                                                                                                                                                                           tudio\14.0
  5. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualS                                                                                                                                                                                                                                                                                           tudio\15.0
  6. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\12.0
  7. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0
  8. ...trying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\15.0
  9. Could not find an installed visual studio version. Abandoning windows static lib                                                                                                                                                                                                                                                                                            export operation.


После поиска в реестре оказалось, что записи по VisualStudio 15.0 там просто нет Погуглив немного появилась тема - Can't find registry entries for Visual Studio 2017 --> Link <-- в которой хоть и было решение, но проверка реестра показала, что этих ключей нет.

Ответ на вопрос был найден здесь Where does Visual Studio 2017 store its config? --> Link <--

See how empty is the regular HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\15.0 key on my machine and notice that there is no 15.0_Config key:



Fortunately, you can use regedit.exe to load a private hive. You need to select the HKEY_USERS node, and click the File > Load Hive… menu. You select the privateregistry.bin file, give a name to the hive (I entered “VS2017PrivateRegistry”) and now you can see the 15.0_Config key populated as usual (note: use File > Unload Hive when done):



Далее цитирую ..

Using this guide, I was able to load the private registry, do the changes from the SO answer mentioned earlier, unload the hive and start VS 2017 with the Dark Theme!
EDIT: I had to slightly modify the PowerShell script I used to edit the registry, here is the updated version if anyone is interested:
EDIT2: Now modified to include the loading of the private registry automatically as well, including a garbace collection to allow unloading the hive:
NOTE: You have to find your own correct path for the user name (C:\Users\Geir) and VS version (15.0_8165452c).
Code:
  1. New-PSDrive HKU Registry HKEY_USERS
  2.  
  3. reg load 'HKU\VS2017PrivateRegistry' "C:\Users\Geir\AppData\Local\Microsoft\VisualStudio\15.0_8165452c\privateregistry.bin"
  4.  
  5. $HighConstrastTheme = "HKU:\VS2017PrivateRegistry\Software\Microsoft\VisualStudio\15.0_8165452c_Config\Themes\{a5c004b4-2d4b-494e-bf01-45fc492522c7}"
  6. $DarkTheme = "HKU:\VS2017PrivateRegistry\Software\Microsoft\VisualStudio\15.0_8165452c_Config\Themes\{1ded0138-47ce-435e-84ef-9ec1f439b749}"
  7.  
  8. Remove-Item -Path $HighConstrastTheme -Recurse
  9. Copy-Item -Path $DarkTheme -Destination $HighConstrastTheme -Recurse
  10.  
  11. [gc]::collect()
  12.  
  13. reg unload 'HKU\VS2017PrivateRegistry'

The following --> VS2017PrivateRegistry.cmd <-- batch file loads registry keys for all Visual Studio 2017 instances as HKLM_TMPVS_[id], starts Registry Editor for you to make changes in Visual Studio settings and unloads keys when you close Registry Editor:
Code:
  1. for /%%in (%LOCALAPPDATA%\Microsoft\VisualStudio\15.0_*) do reg load HKLM\_TMPVS_%%~nxf "%%f\privateregistry.bin"
  2. regedit
  3. for /%%in (%LOCALAPPDATA%\Microsoft\VisualStudio\15.0_*) do reg unload HKLM\_TMPVS_%%~nxf

Note: first close running Visual Studio 2017 instances with background processes and then run this file with administrator rights

Можно загрузить конечно эту ветку, но наверное я поищу другой способ модификации скрипта, чтобы собирать либ файлы. Даже если собрать как релиз, так и последний мастер архив, мои длл к сожалению не компатибельны со старыми инклуд файлами, в чём конкретно проблема ещё не известно. Проблема ли это хидер файлов или проблема сборки, это стоит ещё выяснить. Интересно то, что даже если собрать билд последнего релиза, то он вновь не работает, если же взять уже готовые бинарники, то они отлично работают со старыми инклуд файлами, т.е. никаких ошибок нет, это наводит на мысли. В итоге нормально собрать как раньше Уникорн у меня не вышло, после успешной сборки файлы отсутствуют (lib) или нерабочие (dll)

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



Ранг: 298.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



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



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

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

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

прежде чем постить, конечно же погрузился в талмуд..))
но мониторить на хуке, по ходу в первую очередь надо не саму инструкцию "XGETBV", а то что раньше переключало контекст AVX(XSAVE/XRSTOR). А в стыренном теле под виртой этого нет.
если с первым битом регистра xcr0 понятно, при саппорте проца и ОС, он всегда равен зеро, то со вторым битом я пока не разобрался. В энуме uc_x86_insn, набор AVX есть, но видимо это тупо пошло прицепом из энума диза.
Собственно для полноценной эмуляции цпу в юникорне дофуя чего ещё нужно, а у меня задача тупо хапнуть трассу с конкретного стыренного тела. Чтобы процесс эмуля не завершался, чего то надо тыкнуть в EDX, и переступить инструкцию...
<< . 1 . 2 . 3 . 4 .
 eXeL@B —› Софт, инструменты —› Unicorn - The ultimate CPU emulator

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

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