Сейчас на форуме: Lohmaty (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Stack BT
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 18.9 (новичок), 4thx
Активность: 0.030.05
Статус: Участник

Создано: 12 июля 2018 22:23 · Поправил: Ate
· Личное сообщение · #1

Для удобства захотел добавть в свой обработчик исключений (хотя пригодится и в других кейсах) бэктрейс стека, ну думаю вызову CaptureStackBackTrace и дело сделано, но не тут-то было. Оказывается эта "замечательная" функция просто не видит фреймы, если функция не имеет канонических прологов, эпилогов, итп, возвращая бесполезные крохи инфы.
Уточню - никаких заигрываний с исходниками нет, нужен просто сырой бэктрейс из любого приложения.
Отсюда вопрос номер 1,- есть ли готовые "правильные" решения, в идеале статические lib, на случай, если никто ничего интересного не предложит, фоллбэк такой:

буду делать снапшот всего стэка и постфактум разбираться.
Например читаем из тиба

Code:
  1. mov eax, FS:[0x04] ; Stack Base
  2. mov eax, FS:[0x08] ; Stack Limit (на случай если будет нужно)


В цикле по 4 байта (для х86) копируем в буфер (StackBase-ESP) байт начиная с ESP, потом по желанию можно пройтись по адресам и откоментить для вывода (далее чисто мои размышления и велосипеды),- нули игнорируем, помечаем EBP как текущий фрейм, все что в границах (Stack Limit<-->Stack Base) - адреса стека или параметры, остальные адреса проверяем с помощью GetModuleHandleEx > GetModuleFileName на возможную принадлежности к текущим модулям и добавляем коментарий, была даже идея подтянуть капстоун и проверять предыдущую инструкцию на call чтобы отмаркировать "вручную" фреймы.

В итоге, стоит ли делать так?
Или есть ли готовые lib (на худой конец dll), или грамотные исходники?
Что из моих "фантазий" годно?




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 23 июля 2018 00:26 · Поправил: Bronco
· Личное сообщение · #2

RevCred пишет:
то zydis самый быстрый почти во всём

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 23 июля 2018 01:48
· Личное сообщение · #3

Решил посмотреть, начал с капса, так как его билдить не нужно. Оно не нэйтив, вызываются системные апи выделения памяти, поэтому так тест не получится. Определяем свои колбеки, что бы возвращать указатели на буфер:

Code:
  1. typedef void* (CAPSTONE_API *cs_malloc_t)(size_t size);
  2. typedef void* (CAPSTONE_API *cs_calloc_t)(size_t nmemb, size_t size);
  3. typedef void* (CAPSTONE_API *cs_realloc_t)(void *ptr, size_t size);
  4. typedef void (CAPSTONE_API *cs_free_t)(void *ptr);
  5. typedef int (CAPSTONE_API *cs_vsnprintf_t)(char *str, size_t size, const char *format, va_list ap);


Опция CS_OPT_DETAIL ничего не изменяет по размеру памяти. Первые два раза вызывается cs_malloc: 7.4kB, 12.5kB, это не при инициализации, а на декодере cs_disasm()!. Третий вызов не проходит, отваливается при вызове cs_vsnprintf(), я её не определил. Ставим переходник на _vsnprintf(). 6 раз вызывается " + 0x%llx" etc, это нужно как то отключить .

Затем вызывается realloc, её тоже нужно переопределять. Это не интерфейс, а дичайший изврат.

-----
vx





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 23 июля 2018 01:54 · Поправил: Bronco
· Личное сообщение · #4

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 23 июля 2018 01:58
· Личное сообщение · #5

Bronco

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

-----
vx





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 23 июля 2018 02:14 · Поправил: Bronco
· Личное сообщение · #6

difexacaw пишет:
для тестов на профайл

я вчера до обеда обкатывал нопы вниз после яра, страницу почти в 30 метров, в буфер, это 7200 лямов инстр, буфер на диз, выхлоп через надстройку в список, с фильтрами, из списка на асм в буфер, на всё 25, с копейками сек.
хз мне гонять на профайл не нужно. и так убедительно.
Code:
  1. 1.Select.start->0x130000000::Select.end->0x131ACA9D6::Select.Size->0x1ACA9D7(26.8 Mb)
  2. 2.Total Instr NOPs->1188872::Total other Instr->7187853::WriteBytes->0x19A85CF(25.7 Mb)
  3. 3. - Total Time: 00:00:25.891


-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 23 июля 2018 17:36 · Поправил: difexacaw
· Личное сообщение · #7

Bronco

Взял ксед и капс. При дефолтных настройках, те без смены аллокатора результат - ксед быстрее в 42 раза. Чтобы исключить аллокатор использовал индексируемый массив. Из alloc индекс блока увеличивается, из realloc не изменяется. При этом printf остаётся. Результат - ксед быстрее в 25 раз. Таким образом штатный аллокатор вносит задержку в 1.7 раза.

-----
vx





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 23 июля 2018 21:26 · Поправил: Bronco
· Личное сообщение · #8

difexacaw пишет:
Таким образом штатный аллокатор вносит задержку в 1.7 раза.

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 24 июля 2018 19:11 · Поправил: difexacaw
· Личное сообщение · #9

Bronco

Это понятно всё, но и мои тесты - не корректны. Видимо оно пытается не одну инструкцию раскодировать, а их последовательность. Думаю что профайл будет выше при корректном вызове, но я это сделать не могу - при изменении параметров оно крэшит. Впрочем не важно, никакой годный мотор не должен с собой таскать винапи и иметь хз какие интерфейсы. Но это дело выбора. Ксед в десяток строк вызывается и по профайлу и гибкости/стабу превосходит все, ну кроме zydis. По последнему я ничего сказать не могу, потому что нет билда для теста. Ну и особо нет смысла тестить, просто интересно. Конечно продукт от железячного вендора будет лучшим.

-----
vx





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 24 июля 2018 23:39
· Личное сообщение · #10

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

ну да...куда проще по индексам типов данных, из таблицы, тупо скинуть всё в строку, и *битесь как хотите.
конечно аллокатор не нужен.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 26 июля 2018 12:48
· Личное сообщение · #11

difexacaw пишет: По последнему я ничего сказать не могу, потому что нет билда для теста.

пример использования можешь посмотреть на гхабе, в целом работает быстро, но тайминг с xed'm не сравнивал.

78ae_26.07.2018_EXELAB.rU.tgz - Zydis.7z




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 июля 2018 02:37
· Личное сообщение · #12

shellstorm

dumpbin:
Code:
  1. 059 00000000 UNDEF  notype ()    External     | _ZydisRegisterEncode
  2. 05A 00000000 UNDEF  notype ()    External     | _ZydisRegisterGetWidth
  3. 05B 00000000 UNDEF  notype ()    External     | _ZydisRegisterGetWidth64
  4. 05C 00000000 SECT16 notype ()    External     | _ZydisDecoderInit
  5. 05D 00000000 SECT15 notype ()    External     | _ZydisDecoderEnableMode


Не сбилдится это.

-----
vx





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 июля 2018 06:11
· Личное сообщение · #13

difexacaw пишет:
Не сбилдится это.


difexacaw пишет:
А когда сборка начала являться проблемой ?



-----
Чтобы юзер в нэте не делал,его всё равно жалко..


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

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 27 июля 2018 07:33 · Поправил: VOLKOFF
· Личное сообщение · #14

Потестил Зидис на предложенном в сырках сэмпле на .text секции х64 фотошопа - 16.5 секунд
Ведь афтор предлагает нам итерациями делать fread прямо по ходу дизасма
Для сравнения Distorm (в медленном текстовом режиме) - 9.5
Все компилил в х64 с оптимизацией (режим дизасма Decode64Bits|CS_MODE_64 соответственно)

distorm.lib - 89кб
Zydis.lib - 1024кб
(без оптимизации и приоритета скорости кода размеры будут меньше)

Предлагаю на этом же бинаре протестить остальных "кандидатов".
Спецом использовал штатные сэмплы (имхо показательно). Кто захочет реабилитировать зидис - вэлком




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 июля 2018 07:56
· Личное сообщение · #15

VOLKOFF, дишторм уже стратил, на нопах больше одного байта. -ди с теста вылетает.
зудис разбирает больше наборов команд, чем капстон. - капс с теста вылетает.
по факту два диза на сегодня актуальны - ксед(??? ) и зудис(- 16.5 секунд ).

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 27 июля 2018 08:00 · Поправил: VOLKOFF
· Личное сообщение · #16

Bronco пишет:
и зудис(- 16.5 секунд ).

ну мой "тест" достаточно ироничный, ведь по "штатной" методике у зидиса (точнее сэмпла) большая часть времени уходит на fread
Если прочитать файл в буфер целиком и потом дизасмить, результат будет другой



Ранг: 19.9 (новичок), 16thx
Активность: 0.040.01
Статус: Участник

Создано: 27 июля 2018 09:07 · Поправил: RevCred
· Личное сообщение · #17

VOLKOFF пишет:
Если прочитать файл в буфер целиком и потом дизасмить, результат будет другой

VOLKOFF пишет:
Кто захочет реабилитировать зидис - вэлком

попробуйте-ка ещё такой вариант:
https://github.com/athre0z/disas-bench/blob/master/bench/distorm/main.c
https://github.com/athre0z/disas-bench/blob/master/bench/zydis/main.c
https://github.com/athre0z/disas-bench/blob/master/bench/load_bin.inc

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

мне ж не за себя, мне за державу обидно



Ранг: 18.9 (новичок), 4thx
Активность: 0.030.05
Статус: Участник

Создано: 27 июля 2018 20:51
· Личное сообщение · #18

Кстати о xed, решил попробовать, но он у меня никак не хочет собираться. Гугл нашел в двух местах (втч гит x64dbg) единственную скомпилированную lib, решил использовать ее.
Взял из доков минимальный пример и столкнулся с такой проблемой - функции xed_decoded_inst_set_mode() в той библиотеке нет... остальное есть, а ее в экспорте нет.

Может кто поделится полнофункциональным вариантом libxed_x64.lib ?




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 27 июля 2018 21:22 · Поправил: Boostyq
· Личное сообщение · #19

Ate пишет:
Кстати о xed, решил попробовать, но он у меня никак не хочет собираться.

Xed вообще тяжело собирается (по крайней мере моими кривыми руками).
Там нужен пайтон, плюс они запилили свою систему сборки, которая, как говорит автор, должна была упростить сборку, но все что мне удалось выжать из нее это сгенерированные файлы, пришлось ручками добавлять все в проект и после править все пути, чтобы просто попробовать его.

-----
В облачке многоточия





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 27 июля 2018 22:00 · Поправил: mak
· Личное сообщение · #20

Ate пишет:
Кстати о xed, решил попробовать, но он у меня никак не хочет собираться. Гугл нашел в двух местах (втч гит x64dbg) единственную скомпилированную lib, решил использовать ее.
Взял из доков минимальный пример и столкнулся с такой проблемой - функции xed_decoded_inst_set_mode() в той библиотеке нет... остальное есть, а ее в экспорте нет.

Может кто поделится полнофункциональным вариантом libxed_x64.lib ?


Последний xed можно взять здесь - --> Link <--, качаем Pin 3.7 (May 08, 2018) Kit-97619, заходим в папку extras\xed-intel64\lib или \extras\xed-ia32\lib и берём последний xed.lib, инклуды в соседней папке. Но вот xed_decoded_inst_set_mode там тоже нет

Из инклудов в файле xed-decoded-inst-api.h
Code:
  1. /// @ingroup DEC
  2. /// Zero the decode structure completely. Re-initializes all operands.
  3. XED_DLL_EXPORT void  xed_decoded_inst_zero(xed_decoded_inst_t* p);
  4.  
  5. /// @ingroup DEC
  6. /// Set the machine mode and stack addressing width directly. This is NOT a
  7. /// full initialization; Call #xed_decoded_inst_zero() before using this if
  8. /// you want a clean slate.
  9. static XED_INLINE void
  10. xed_decoded_inst_set_mode(xed_decoded_inst_t* p,
  11.                           xed_machine_mode_enum_t mmode,
  12.                           xed_address_width_enum_t stack_addr_width)
  13. {
  14.     xed_state_t dstate;
  15.     dstate.mmode = mmode;
  16.     dstate.stack_addr_width = stack_addr_width;
  17.     xed_operand_values_set_mode(p, &dstate);
  18. }


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 июля 2018 22:09 · Поправил: Bronco
· Личное сообщение · #21

Boostyq пишет:
Xed вообще тяжело собирается (

поначалу ебала только с кодировками, питон упёртый, ну может это у меня так.
мбилд обязательно берём с сайта,странно он что не подгружается автоматом, один же автор, тыкаем его или к либам в питон, или в дистриб кседа. инстал, и всё нужное в ките лежит.
вот дальше качели, совместимость с и с+, куча не понятных движений.
mak, в пин, не шибко свежий, а либу один хер собирать...
Ate пишет:
единственную скомпилированную lib

угу... Диа красава, попилил ксед не хило, но либы в 2013 собирались, и там по ходу только енкоде.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 27 июля 2018 22:37
· Личное сообщение · #22

Хотел отхватить лойс на халяву, а получил
[EXIT_STATUS ] 399 [STDERR] где-то к середине процесса (при билде некоторых c# файлов)
Притом путь к компилю "/Microsoft Visual Studio 12.0/VC/bin/amd64/cl.exe", похоже это проделки VCForPython27, ибо я снес все студии кроме 2017-ой.

А на линуксе все мухой собралось...



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 27 июля 2018 23:58
· Личное сообщение · #23

VOLKOFF пишет: где-то к середине процесса

в переменные среды нужно добавить пути до windows kits / include или скопировать инклуды в папку инклудов xed'a, а так изи: https://dropmefiles.com/Rhb6i

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

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 июля 2018 01:30 · Поправил: VOLKOFF
· Личное сообщение · #24

shellstorm пишет:
а так изи


mak пишет:
Но вот xed_decoded_inst_set_mode там тоже нет

Ну как бы да, странные они. В первом же сэмпле доков ее сами юзают
В списке функций тоже присутствует, а в бинаре заинлайнили

Надо кодесы смотреть, мб там воркэраунд какой есть, типа инициализации xed_state_t и вызова xed_decoded_inst_zero_set_mode (не смотрел, просто размышляю! Сам сабж не юзал)

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

Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 28 июля 2018 02:02
· Личное сообщение · #25

VOLKOFF пишет: В списке функций тоже присутствует, а в бинаре заинлайнили

Code:
  1. static XED_INLINE void
  2. xed_decoded_inst_set_mode(xed_decoded_inst_t* p,
  3.                           xed_machine_mode_enum_t mmode,
  4.                           xed_address_width_enum_t stack_addr_width)
  5. {
  6.     xed_state_t dstate;
  7.     dstate.mmode = mmode;
  8.     dstate.stack_addr_width = stack_addr_width;
  9.     xed_operand_values_set_mode(p, &dstate);
  10. }

это в pin'e, а в самостоятельной сборке XED_DLL_EXPORT



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 июля 2018 02:19
· Личное сообщение · #26

shellstorm пишет:
это в pin'e

это везде



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 28 июля 2018 03:01
· Личное сообщение · #27

VOLKOFF пишет: это везде

сорян, билдил не из репы и попалась древняя версия.
последняя https://dropmefiles.com/iVaap

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

Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 28 июля 2018 23:08 · Поправил: VOLKOFF
· Личное сообщение · #28

RevCred пишет:
так что может это и правда про zydis...

Похоже такая подача не косяк, ибо даже при прямом чтении из памяти "целым куском" результат получился идентичный (с погрешностью которой можно пренебречь).

Тест на том же коде (по ссылке выше):
16.172 - при полноценном выводе с адекватными настройками форматирования (короче стандартный рабочий кейс)
6.688 - DECODER_MODE_MINIMAL (из выхлопа выпиливаются операнды атрибуты и прочая необходимая инфа)

Имхо второй кейс нужен в очень редких специфических случаях, когда нужно узнать лишь саму инструкцию, или добавить в сырки "красивый" бенч, что мы и имеем

Немного статки:
Code:
  1. По ходу декодирования имеем 8034 ошибки (это почти нормально*, учитывая что в буфере)
  2. 002 - ILLEGAL_LEGACY_PFX
  3. 004 - ILLEGAL_REX
  4. 004 - INSTRUCTION_TOO_LONG ( на '2E 2E 03 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E')  :)
  5. 031 - ILLEGAL_LOCK
  6. 038 - BAD_REGISTER
  7. 054 - MALFORMED_EVEX
  8. 137 - INVALID_MAP
  9. но многие ошибки избыточны и присущи только ему...


Да он поумнее* (по факту зависит от кейса) дисторма и за счет этих "умствований" медленнее.
В целом все норм, километровые трассы разбирать не мой профиль, однако с джанком зидис дружит (внезапно) сильно хуже остальных* и это безусловно лично меня печалит.




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 28 июля 2018 23:46
· Личное сообщение · #29

VOLKOFF пишет:
однако с джанком зидис дружит (внезапно) сильно хуже остальных

Извините за оффтоп, а для каких целей вам нужен настолько стрессоустойчивый дизасм?

-----
В облачке многоточия





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 18 августа 2018 01:18
· Личное сообщение · #30

Bronco

> А когда сборка начала являться проблемой ?

Проблема в размере билдера. Студию я не использую(тк не пишу на си), а она весит больше, чем у меня всего сетевого трафа. Использование этого не имеет смысла в моём случае. Можно собрать каким то иным компилером, но это займёт на допил кучу времени, которое можно потратить на более продуктивные задачи, а не заниматься извратом с кривыми скриптовыми сборщиками. Есть какие то версии студии на диске, но нет желания искать и ставить это, только ради сборки единственного семпла. Так то.

Boostyq

> для каких целей вам нужен настолько стрессоустойчивый дизасм?

Тоесть по вашему нужно юзать кривые и падающие ?

Подробный вывод инфы про невалид инструкции лишь не нужная опция, либо декодировал, либо нет. Это отладочная инфа и она обычно не нужна.

VOLKOFF

По вашему логу получается что вы тестили мотор на данных, а не на коде. Так это и делается, но при этом нужно результат декодера сравнивать с заранее известным и валидным, а это либо штатный код, либо мотор выполняющий раскодировку без ошибок. Под 86 таких два, под 64 мне не известно, но я бы выбрал ксед. От вендора железа несомненно мотор будет лучшим, чем кривые самопальные сборки.

-----
vx



<< . 1 . 2 .
 eXeL@B —› Вопросы новичков —› Stack BT
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати