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

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


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

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

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

 eXeL@B —› Софт, инструменты —› Capstone - The Ultimate Disassembler
. 1 . 2 . 3 . 4 . >>
Посл.ответ Сообщение


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

Создано: 3 марта 2017 00:47 New!
Цитата · Личное сообщение · #1

2 марта 2017 года, была выпущена версия 3.0.5-rc2 дизассемблера Capstone.

Предыдущий релиз был в 2015 году.

Скачать:
www.capstone-engine.org/download.html

Компактный пример на питоне:
Code:
  1. # test1.py
  2. 2 from capstone import *
  3. 3 
  4. 4 CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"
  5. 5 
  6. 6 md = Cs(CS_ARCH_X86, CS_MODE_64)
  7. 7 for i in md.disasm(CODE, 0x1000):
  8. 8     print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))

Запуск и выхлоп:
Code:
  1. $ python test1.py
  2.  
  3. 0x1000: push    rbp
  4. 0x1001: mov rax, qword ptr [rip + 0x13b8]


Описание изменений:
www.capstone-engine.org/changelog.html

Version 3.0.5-rc2

March 2, 2017
Release 3.0.5-RC2 is a release candidate version, with important fixes in the core & several bindings.

Library

Fix build for Visual Studio 2012
Fix X86_REL_ADDR macro
Add CS_VERSION_MAJOR, CS_VERSION_MINOR, CS_VERSION_EXTRA
Better support for embedding Capstone into Windows kernel drivers
Support to embedded Capstone into MacOS kernel
Support MacOS 10.11 and up
Better support for Cygwin
Support build packages for FreeBSD & DragonflyBSD
Add a command-line tool "cstool"
Properly handle switching to Endian mode at run-time for Arm, Arm64, Mips & Sparc

X86

Some random 16-bit code can be handled wrongly.
Remove abundant operand type X86_OP_FP
Fix instructions MOVQ, LOOP, LOOPE, LOOPNE, CALL/JMP rel16, REPNE LODSD, MOV *AX, MOFFS, FAR JMP/CALL
Add X86_REG_EFLAGS for STC and STD
Fix instruction attributes for SYSEXIT, MOVW, ROL, LGS, SLDT
Rename registers ST0-ST7 to be consistent with asm output

Arm

Properly handle IT instruction
Fix LDRSB
Fix writeback for LDR
Fix Thumb BigEndian setup
Fix arith extender
Fix writeback for LDR
Rename enum arm64_mrs_reg to arm64_sysreg

PowerPC

Print 0 offset for memory operand

Sparc

Fix POPC instruction

Python binding

Better PyPy support
Add __version__
Better support for Python 3
Fix CS_SKIPDATA_CALLBACK prototype
Cast skipdata function inside binding to simplify the API

Java binding

Better handle input with invalid code

PowerShell binding

New binding

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



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

Создано: 3 марта 2017 01:14 New!
Цитата · Личное сообщение · #2

Jupiter пишет:
Сегодня, 2 марта 2017 года,

ага... теперь понятно под какое событие, тебя ждать в следующий раз.
с возвращением кстати...


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

Создано: 3 марта 2017 01:38 New!
Цитата · Личное сообщение · #3

Спасибо, Jupiter!
Очень, на мой взгляд, полезная тема!
Хотелось бы, чтобы участники форума, имеющие опыт использования этого инструмента, поделились им (опытом): теория, практика, примеры использования, выводы и заключения, ну и т.д. в этом роде.


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

Создано: 3 марта 2017 01:45 New!
Цитата · Личное сообщение · #4

plutos
Ну как быстрый ответ на твой вопрос: есть твик использования движка на конкретной платформе.
Если двиг будет использоваться только для x86 (например), то имеет смысл собрать специальную "diet" версию, которая будет содержать только то, что необходимо на конкретной платформе. Это позволяет значительно сократить размер библиотеки.

Пример сборки:
Code:
  1. $ CAPSTONE_ARCHS="x86" ./make.sh
  2. $ ./make.sh
  3. $ sudo ./make.sh install

Пример проверки поддержки архитектуры:
Code:
  1. if (cs_support(CS_ARCH_X86)) {
  2.     // X86 is supported.
  3.     // ...
  4. else {
  5.     // X86 was not compiled-in, thus unsupported.
  6.     // ...
  7. }

Подробнее:
capstone-engine.org/compile.html


Ранг: 134.0 (ветеран)
Статус: Участник
Qt Developer

Создано: 3 марта 2017 02:04 New!
Цитата · Личное сообщение · #5

Хорошая библиотека, всё работает быстро и без ошибок. Использую её в нескольких проектах.

Единственный минус - большой размер всей библиотеки(примерно 3 мб).

Есть еще интересные вещи от той же группы координаторов:

--> Link <-- Эмулятор на основе QEMU. Работает, но нестабильно и с костылями(версия 0.9). Написал на нём анализатор-распаковщик.
Последнее обновление библиотеки(1.0), было настолько радикальным, что старые костыли перестали работать. Нужно всё переписывать.

--> Link <-- Ассемблерный фреймворк. Описание интересное, но пока тесно с ним не общался.

Ранг: 30.2 (посетитель)
Статус: Участник

Создано: 3 марта 2017 03:09 New!
Цитата · Личное сообщение · #6

hors пишет:
Написал на нём анализатор-распаковщик.


как интегрируются capstone и unicorn? Я простейщий пример на уникорне написал, ну выполняет код, да,
а чтобы получить дизасм текущей выполняемой инструкции, получалось что надо было ещё капстоновский
cs_disasm вызывать, что видимо добавляет тормозов.


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

Создано: 3 марта 2017 03:17 · Поправил: difexacaw New!
Цитата · Личное сообщение · #7

hors

> всё работает быстро и без ошибок.

Задачи дизасма две - раскодировка инструкций или выхлоп текста(мнемоник). Профайл важен для первой задачи, тогда чем это лучше кседа, проводили тесты ?

На стабильность тесты проводятся не на системном коде, а на спец конструкциях не корректных или на рандом буфере.

Ранг: 30.2 (посетитель)
Статус: Участник

Создано: 3 марта 2017 03:32 New!
Цитата · Личное сообщение · #8

difexacaw пишет:
На стабильность тесты проводятся не на системном коде


ну да, так то авторы капстоуна конечно об этом не знали, на calc.exe быстро пару раз прогнали и в паблик
выдали.


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

Создано: 3 марта 2017 03:48 New!
Цитата · Личное сообщение · #9

oldman пишет:
на calc.exe быстро пару раз

ну как это быстро, 2 года гоняли, и на блокноте так же...


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

Создано: 3 марта 2017 03:53 New!
Цитата · Личное сообщение · #10

Интересно потестить, но нечем собрать. Я не помню, но вроде я прошлую версию тестил, можно тут поискать где то моя тема была.


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

Создано: 3 марта 2017 04:11 New!
Цитата · Личное сообщение · #11

difexacaw пишет:
но нечем собрать


Windows - Core engine
* The Capstone header files (*.h) for C programming.
* 32-bit/64-bit DLLs & static libraries for Microsoft Windows 32-bit/64-bit.
* A test file (test.exe)

Win32
capstone-3.0.5-rc2-win32.zip

Win64
capstone-3.0.5-rc2-win64.zip

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


Ранг: 0.0 (гость)
Статус: Участник

Создано: 3 марта 2017 04:13 New!
Цитата · Личное сообщение · #12

difexacaw пишет: а на спец конструкциях не корректных или на рандом буфере

Как и xed проверялся процессором, на данный момент один из самых стабильных и удобных движков, xed слишком громоздкий, а остальное либо сырое или же вообще школьное творчество.
собрал но без кернел варианта, нет инклудов на этой машине.

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



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

Создано: 3 марта 2017 04:13 New!
Цитата · Личное сообщение · #13

Jupiter

File not found


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

Создано: 3 марта 2017 04:14 New!
Цитата · Личное сообщение · #14

difexacaw пишет:
File not found


Заменил ссылкой на GitHub, проверь


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

Создано: 3 марта 2017 05:10 · Поправил: difexacaw New!
Цитата · Личное сообщение · #15

Спасибо.

.lib файл там кривой, не содержит прототипов.
В хидерах описание кривое, какой прототип у cs_disasm ?

Code:
  1. size_t CAPSTONE_API cs_disasm(csh handle,
  2.                  const uint8_t *code, size_t code_size,
  3.                  uint64_t address,
  4.                  size_t count,
  5.                  cs_insn **insn);


4-й аргумент:
> @address: address of the first instruction in given raw code buffer.

Это виртуальный адрес или это относительно начала буфера смещение, не понятно. Если смещение, то зачем 64-битное.. тогда вероятно что это всё же адрес(VA).

Куда статус возвращается, size_t это не cs_err судя по дефейну, вероятно какой то размер.

Передаю адрес rdtsc/ret. Возвращает Eax = 1, в буфер ссылку на выделенный буфер в хипе, в котором число 0x254.
Если предположить что возвращается cs_err, то это CS_ERR_MEM - страничного нарушения нет, это бага.

Как это заюзать ?

Ранг: 0.0 (гость)
Статус: Участник

Создано: 3 марта 2017 05:50 New!
Цитата · Личное сообщение · #16

difexacaw пишет: Как это заюзать ?

собранный пример и исходный код примера.
Судя по соседней теме, для вашей задачи нужно немного переписать код движка, это значительно ускорить работу и уменьшит размер.


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

Создано: 3 марта 2017 07:01 · Поправил: difexacaw New!
Цитата · Личное сообщение · #17

shellstorm

У вас в импорте 8 либ типо api-ms-win-crt-heap-l1-1-0, я их гуглом нашёл, но всё равно не запускается - видимо это сишное дерьмо меняется в версиях. Зачем такой компиль нужен не понятно..

> нужно немного переписать код движка

Ксед для той задачи заюзать не получилось, так как он винапишный, а тот прожект нэйтивный.

Ранг: 299.1 (наставник)
Статус: Модератор
CrackLab

Создано: 3 марта 2017 10:03 · Поправил: SReg New!
Цитата · Личное сообщение · #18

difexacaw пишет:
У вас в импорте 8 либ типо api-ms-win-crt-heap-l1-1-0, я их гуглом нашёл,

инде, семпл выше не воркает на хп
на 7 норм


Ранг: 598.5 (!)
Статус: Модератор
Research & Development

Создано: 3 марта 2017 10:44 New!
Цитата · Личное сообщение · #19

difexacaw пишет:
4-й аргумент:
> @address: address of the first instruction in given raw code buffer.

Это виртуальный адрес или это относительно начала буфера смещение, не понятно. Если смещение, то зачем 64-битное.. тогда вероятно что это всё же адрес(VA).


Это виртуальный адрес (я в первом посте привёл сорс на питоне, там по выхлопу понятно):
Code:
  1. # test1.py
  2. 2 from capstone import *
  3. 3 
  4. 4 CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"
  5. 5 
  6. 6 md = Cs(CS_ARCH_X86, CS_MODE_64)
  7. 7 for i in md.disasm(CODE, 0x1000):
  8. 8     print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))

Запуск и выхлоп:
Code:
  1. $ python test1.py
  2.  
  3. 0x1000: push    rbp
  4. 0x1001: mov rax, qword ptr [rip + 0x13b8]


На сях вызов:
Code:
  1. cs_disasm(handle, CODE, sizeof(CODE)-1, 0x1000, 0, &insn);


По сути этот параметр задаёт базовое абсолютное смещение для использования движком при расчёте абсолютных адресов


Ранг: 134.0 (ветеран)
Статус: Участник
Qt Developer

Создано: 3 марта 2017 11:46 · Поправил: hors New!
Цитата · Личное сообщение · #20

oldman пишет:
как интегрируются capstone и unicorn? Я простейщий пример на уникорне написал, ну выполняет код, да,
а чтобы получить дизасм текущей выполняемой инструкции, получалось что надо было ещё капстоновский
cs_disasm вызывать, что видимо добавляет тормозов.


Полный дизасм текущей инструкции или только длины? Если полный, то да, нужно Capstone подключать.
Подключается стандартно, никаких проблем не было замечено.

Если нужна только длина и адрес, то можно без Capstone.

Ставится хук на область памяти:

Code:
  1. addHook(&traceCode,UC_HOOK_CODE,(void *)hookCode,this,0,0x1000)


Теперь на каждой инструкции в этой области памяти вызывается функция:

Code:
  1. void hookCode(uc_engine *uc, uint64_t address, uint32_t size, void *user_data)
  2. {
  3. // ...
  4. }


address адрес текущей инструкции
size длина текущей инструкции.

Но останавливаться на каждой инструкции долго(с Capstone или без).
Поэтому намного быстрее сканировать текущую память на предмет нужных сигнатур и ставить в нужных местах брейкпойнты.
То есть по сути тоже самое что мы делаем при трассировке/распаковке в обычном отладчике.

Добавлено спустя -50 минут
difexacaw пишет:

Задачи дизасма две - раскодировка инструкций или выхлоп текста(мнемоник). Профайл важен для первой задачи, тогда чем это лучше кседа, проводили тесты ?


Лучше Кседа тем, что больше поддерживаемых архитектур.

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


Ранг: 0.0 (гость)
Статус: Участник

Создано: 3 марта 2017 21:02 New!
Цитата · Личное сообщение · #21

difexacaw пишет: Зачем такой компиль нужен не понятно

Я собрал "как есть", без настройки сборки, при необходимости подобный мусор отключается, а по хорошему там нужно переписать аллокатор и вообще выкинуть crt.


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

Создано: 3 марта 2017 21:23 · Поправил: difexacaw New!
Цитата · Личное сообщение · #22

shellstorm

А зачем тогда такой пример выкладывать вообще, если это невозможно запустить без установки IDE, которым вы это собрали. И я это не на XP запускал, а на x64-w8. Мне просто надоело копировать на варю скачанные либы..

Ранг: 0.0 (гость)
Статус: Участник

Создано: 3 марта 2017 22:16 New!
Цитата · Личное сообщение · #23

difexacaw пишет: А зачем тогда такой пример выкладывать

Вы действительно думаете, что я после каждой сборки бегу проверять секции с импортом?
Открыл проектный файл, нажал кнопку собрать, залил результат на обменник, все.
Нужно еще компилятор обновить, последнее обновление оказалось бажным, не отключается security check.


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

Создано: 4 марта 2017 19:13 New!
Цитата · Личное сообщение · #24

Хороша вещь. В плане анализа кода - хорошая альтернатива иде, может помочь обойти трудности в скриптах иды быстрее, есть такая теоретическая возможность.

Под "В плане анализа кода" я имел в виду автоматический анализ. Большинство конструкций кода, применяемых техник шаблонные. И можно упростить себе анализ, разгрузив мозг от рутинных операций по анализу. А двиг на кэпстоуне хорош тем, что может позволить анализировать быстрей и легче код и под x86/x64, и под мипс, и под арм. Ну это моё мнение.


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

Создано: 13 марта 2017 02:41 · Поправил: DenCoder New!
Цитата · Личное сообщение · #25

hors пишет:
addHook(&traceCode,UC_HOOK_CODE,(void *)hookCode,this,0,0x1000)

На своём любимом си так пока не попробовал. Решил ради освоения питона, заюзать unicorn на нём. Хорошее дело - хуки. Вот только по-разному себя ведёт функция reg_read() внутри хука и вне её

Например, определили функцию
Code:
  1. def print_common_regs():
  2.          print(" pc: %x" %mu.reg_read(UC_ARM_REG_PC))
  3.          print(" sp: %x" %mu.reg_read(UC_ARM_REG_SP))
  4.          print(" r0: %x" %mu.reg_read(UC_ARM_REG_R0))
  5.          print(" r1: %x" %mu.reg_read(UC_ARM_REG_R1))
  6.          print(" r2: %x" %mu.reg_read(UC_ARM_REG_R2))
  7.          print(" r3: %x" %mu.reg_read(UC_ARM_REG_R3))
  8.          print(" r4: %x" %mu.reg_read(UC_ARM_REG_R4))
  9.          print(" r5: %x" %mu.reg_read(UC_ARM_REG_R5))
  10.          print(" r6: %x" %mu.reg_read(UC_ARM_REG_R6))
  11.          print(" r7: %x" %mu.reg_read(UC_ARM_REG_R7))
  12.          print(" r8: %x" %mu.reg_read(UC_ARM_REG_R8))
  13.          print(" r9: %x" %mu.reg_read(UC_ARM_REG_R9))
  14.          print("r10: %x" %mu.reg_read(UC_ARM_REG_R10))
  15.          print("r11: %x" %mu.reg_read(UC_ARM_REG_R11))
  16.          print("r12: %x" %mu.reg_read(UC_ARM_REG_R12))
  17.          print("lr: %x" %mu.reg_read(UC_ARM_REG_LR))


Внутри функции хука:
Code:
  1. def hook_code(uc, address, size, user_data):
  2.          insn_type = idautils.DecodeInstruction(address).itype
  3.          if(insn_type == ARM_INS_bl or insn_type == ARM_INS_blx1 or insn_type == ARM_INS_blx2 or insn_type == ARM_INS_bx or insn_type == ARM_INS_bxj):
  4.                  print(">>> break on branch at 0x%x, block size = 0x%x" %(address, size))
  5.                  print_common_regs()
  6.                  uc.emu_stop()


и в конце модуля
Code:
  1. try:
  2.          mu.emu_start(pc, 0x32318)
  3.  
  4.          print("Emulation done. Below is the CPU context")
  5.  
  6. except UcError as e:
  7.          print("Error: %s" %e)
  8. finally:
  9.          print_common_regs()


По остановке на одной из инструкций из
Code:
  1. BL
  2. BLX
  3. BX
  4. BXJ

будет 2 вывода основных регистров ARM.

Они должны бы быть одинаковые, но это не так:
Code:
  1. >>> break on branch at 0x31fa0, block size = 0x4
  2.  pc: 31fa0
  3.  sp: 1fe9b8
  4.  r0: 0
  5.  r1: 1fea0c
  6.  r2: 10006
  7.  r3: 0
  8.  r4: 1
  9.  r5: 2
  10.  r6: 0
  11.  r7: 3
  12.  r8: 0
  13.  r9: 1
  14. r10: 0
  15. r11: 1
  16. r12: 0
  17. lr: adb4c
  18. Emulation done. Below is the CPU context
  19.  pc: 31f88
  20.  sp: 1fe9b8
  21.  r0: 0
  22.  r1: 1fea0c
  23.  r2: 10006
  24.  r3: 0
  25.  r4: 1
  26.  r5: 2
  27.  r6: 0
  28.  r7: 3
  29.  r8: 0
  30.  r9: 1
  31. r10: 0
  32. r11: 1
  33. r12: 0
  34. lr: adb4c


Отличается PC


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

Создано: 26 сентября 2017 05:31 · Поправил: Bronco New!
Цитата · Личное сообщение · #26

hors пишет:
Лучше Кседа тем, что больше поддерживаемых архитектур.

+1
отличный дизасм, описание инструкций в структурах, иногда даже слишком "глубоко"
для X86_OP_IMM (__int64) не мешало бы добавить размер константы в байтах, размер операнда указывает только на макси значение.
Code:
  1. MOV EDI, D8468294
  2. ADD DI, DI


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

Создано: 26 сентября 2017 19:21 · Поправил: difexacaw New!
Цитата · Личное сообщение · #27

Bronco

У дизасма есть две совершенно не связанные задачи. Первая это декодер инструкций, который предоставляет базовую инфу - наличие MRM, SRC/DST операндов, флаги и регистры(IN/OUT) etc. Вторая это текстовый вывод мнемоник. Обычно нужна вторая задача, но для неё подходит вообще любой дизасм, лучше/хуже оценивается по текстовому выхлопу. Для первой задачи важен профайл и гибкость мотора, что он может раскодировать. Есно для первой задачи никакая портабельность смысла не имеет. Для второй задачи смысла не и имеет профайл.


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

Создано: 28 сентября 2017 05:01 New!
Цитата · Личное сообщение · #28

Пытаюсь установить CAPSTONE на FreeBSD.

./make.sh install =>

install -m0755 cstool/cstool /usr/bin
install: cannot stat 'cstool/cstool': No such file or directory

Похоже, что вот эта строчка в Makefile $(INSTALL_LIB) cstool/cstool $(BINDIR)
вызывает ошибку.

в google есть упоминание о подобной ошибке, но у них она каким-то образом исчезла сама по себе

Ранг: 141.4 (ветеран)
Статус: Участник

Создано: 28 сентября 2017 11:42 New!
Цитата · Личное сообщение · #29

plutos
sudo же. Или ты из тех, кто до сих пор под рутом сидит?


Ранг: 539.0 (!)
Статус: Участник
_Вечный_Студент_

Создано: 29 сентября 2017 00:12 New!
Цитата · Личное сообщение · #30

$ sudo ./make.sh install => абсолютно идентичная ошибка.

Я FreeBSD установил три дня назад и для меня это темный лес. Кое-что из Unix'a помню, но давно не пользовался. Так что, если кто может помочь, то обьясните пожалуйста подробно.

Кроме того, куда устанавливается Capstone? и как убедится, что он установлен?

пытался ./tests/test*, но валится на первом же файле: ./test_arm.c Permission denied, хотя я вроде как root.
. 1 . 2 . 3 . 4 . >>
 eXeL@B —› Софт, инструменты —› Capstone - The Ultimate Disassembler

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

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