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

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


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

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

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

 eXeL@B —› Софт, инструменты —› Плагины к отладчику Mr.eXoDia x64/x32 dbg
<< . 1 . 2 . 3 . 4 . 5 . >>
Посл.ответ Сообщение


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

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

#ifdef
немного оффтопика, шапка всё таки.
Отладчик набирает потихоньку обороты, базовая платформа достаточно гибкая.
Сам проект опен сорс, как и остальные крос платформенные движки в нём из пользованные.
Неплохой pluginsdk, к сожалению мало описания в help, но по хидерам разобраться довольно не сложно.
Собственно в чём вопрос ?
Парни всё есть, но никто ничего не пишет.
//Для OllyDbg на тутсях целый раздел и с плагинами и с скриптами.
Вот по случаю решил пополнить копилку. Хз что, но пока мутил было интересно.
Рассчитываю, что это даст старт, более практичным обсуждениям и в плане программирования и в плане решения разных задач.
Топик для всех плагинов, которые либо есть, либо будут.
Многие из тех что есть так же опен сорс.
В общем не Грааль конечно, но лудоманить на этом не приветствую.
#else
О плагине !
Из того что в разработке, но частично готово.
Меню отладчика
- Чистим историю открытия приложений, скриптов и командной строки:
Меню отладчика //- Зарегистрировано пока 9 новых команд для скриптового движка.
- RipAsmCode - описание в мсг
- RipAsmInstruction - описание в мсг
- FindAsmInstruction - описание в мсг
- FunctionAsmEnd - описание в мсг
- FunctionLogClear
- FunctionLabelClear
- FunctionScriptAbort
- FunctionFindPointer - описание в мсг
- FunctionGetTime
Меню отладчика
- Параметры Деобфускатора//сохраняются в ини
Меню отладчика
-- Параметры "обхода лапши"//сохраняются в ини
Меню отладчика
-WannabeUIF под обе архитектуры
Меню диззасма:
- Деобфускатор // бетка
- В выделеном листинге перемещаем все нопы вниз.
- Обходим лапшу из jmp&jcc//статик трассировка в выделенную страницу
- Освобождаем память от выделенной страницы, и удаляем все записи в лейбах.
#endif
Под х86 тестировалось инерциально, под х64 пока только на паре тройке семплов..))
Из нерешённого, это кьют_виджеты, идея перетащить табшиты лога и скрипта в окно дампа как то не решается.
И пройтись по элементам дальше хендлов дочерних окон с ClassName Qt5QWindowIcon, пока не получается.
--> Эта <-- тема актуальна, оптимизация по шаблонам(потернам) довольна реальна, но как организовать базу данных для них, пока не решалась.
Линк запостил.
--> от 24 июля 2017<--
Дальше посмотрим, что из этого топа выйдет.
//ахах топ потыхеньку умирает, сколько бы не постил

| Сообщение посчитали полезным: mak, zNob, Haoose-GP, v00doo, jinoweb, ClockMan


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

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

difexacaw пишет: Блок" это ветвь.
В данном случае блок это блок, а остальное незнание тобой матчасти.
https://ru.wikipedia.org/wiki/Граф_потока_управления
По поводу же ошибки то ее нет, анализатор\корректировщик не имеет отношение к самому графу чуть более чем полностью, это отдельная сущность.

Добавлено спустя 4 минуты
Bronco пишет: в смысле, трассировка в живую?

Да. Кто то испльзует пин, кто то динамо рио, кто то пишет свое, например: https://github.com/K2/EhTrace
В статике нормальный анализ невозможен, та же IDA вполне себе зацикливается.

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

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

shellstorm

Ты сам матчасть не знаешь и себе противоречишь:

> точка, на которую выполняется переход, является первой инструкцией в базовом блоке;
> базовый блок завершается инструкцией перехода.

По твоему же линку. Это та самая ветвь

> По поводу же ошибки то ее нет, анализатор\корректировщик не имеет отношение к самому графу
> Блок это промежуток между бранчами, смотрим вхождение адреса в блок

Хорошо, для перекрывающегося(для определённого диапазона адресов существует несколько ветвей) кода пример приведите.

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

Создано: 18 мая 2017 00:15 New!
Цитата · Личное сообщение · #4

difexacaw пишет: По твоему же линку. Это та самая ветвь

В приличном обществе не пиши подобного, засмеют. Записывай: node, edge, vertex, деревья с ветвями применимы к другим алго.
Как нибудь расширь горизонты https://ru.wikipedia.org/wiki/Глоссарий_теории_графов.
Это ссылка\дуга, это блеадь не дерево которое частный случай графа, а граф с вполне конкретной имплементацией алгоритма, avl, вот это дерево, осиль разницу.

difexacaw пишет: кода пример приведите

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

Добавлено спустя 14 минут
У отладчика и с окном графов проблема, по крайне мере у меня.
open dbg => open file => G => I = crash
При сохранении графа, отладчик зависает, приложение запускается и в общем финита.

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

Создано: 18 мая 2017 00:31 New!
Цитата · Личное сообщение · #5

shellstorm

Это всё формальная математика, не имеющая отношения к имплементации. Как не назови, а это всё равно ветвь. И эти формальности никак не позволят реализовать частный алгоритм.

> Открой исходники отладчика и обчитайся

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

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

Создано: 18 мая 2017 00:37 New!
Цитата · Личное сообщение · #6

difexacaw пишет: Это всё формальная математика, не имеющая отношения к имплементации. Как не назови, а это всё равно ветвь.

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

difexacaw пишет: Мне твоя реализация в данном случае интересна

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

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

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

shellstorm

Хорошо, вот простейший пример:

Code:
  1. +0       B8 EB 04 90 90          mov eax,909004EB
  2. +5       74 FA                  je +1
  3. --
  4. +1       EB 04                  jmp +7
  5. +3       90 90                  data dw


В #31 вы даёте следующий метод:

> смотрим вхождение адреса в блок, если его нет, значит это мусор

В виде потока инструкций(граф) этот код будет таким: mov - je - jmp. При этом дворд данных будет в пределах инструкции, таким образом по вашему методу это не данные. Хотя любой конструктор их не затронет при построении графа, если конечно не привязан к адресам каким то образом. И при последующей сборке поток инструкций сохранится.

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

Создано: 18 мая 2017 01:31 New!
Цитата · Личное сообщение · #8

difexacaw пишет: Хорошо, вот простейший пример

mov .. является вершиной графа, вершина продолжается до первого бранча или ret.
je начало блока и заканчивается на jmp, крч блок из одной инструкции, далее начинается блок с jmp, этот блок тоже из одной инструкции, потому что нет условия, переходим к блоку по адресу семь, если там нет бранчей указывающих на адрес 3 или где то далее указывающий на него, это мертвый блок, данные или мусор, размер блока легко получить, берем адрес 4 и ищем ближайшее к этому адресу вхождение, если таких нет, между 4 и 7 мертвый блок, итд.
это в простейшем случае, а если рассматривать отладчик, он ориентируется на контекст.

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

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

shellstorm

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

> если там нет бранчей указывающих на адрес 3 или где то далее указывающий на него, это мертвый блок

Очевидно что если на какой то адрес нет ветвления(и адрес не указывает на начало инструкции), то это данные. Но такое утверждение так же смысла не имеет, так как граф строится по ветвлениям и естественно что данные, на которые нет ветвления не будут описаны

Добавлено спустя 6 минут
> если рассматривать отладчик, он ориентируется на контекст.

Сабж отладчик последней версии имеет ту же проблему - он не отображает куда ведёт ветвление, так как возникает коллизия с началом блока. По нормальному должен быть второй листинг дизасма с отвязкой от адресов таким образом. А для пересекающихся инструкций без прохода по бранчу нельзя увидеть его код

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

Создано: 18 мая 2017 02:14 New!
Цитата · Личное сообщение · #10

difexacaw пишет: А причём тогда предыдущее утверждение про адреса - данные в пределах инструкции

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


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

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

//ого сколько букаф.
======
--> разные форки<--

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

Создано: 19 мая 2017 11:02 · Поправил: shellstorm New!
Цитата · Личное сообщение · #12

Bronco пишет: --> разные форки<--

Ponce хорошая штука, хотя на вещах посложнее начинает обламываться, как в принципе и все универсальное, подобные фреймворки все же делаются для написания кода под задачу, как и тот же pin.
dynamorio не смотря на все костыли проще собирать чем pin, последний очень капризный и при сборки компилятором свежее указанной версии начинаются хождения по мукам, совсем не VC френдли, с mingw жить немного проще.


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

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

shellstorm пишет:
Блок это промежуток между бранчами

тыкну пятак, уже наблюдения из практики..
По структуре инфо об инструкции, в бранч входят не только усл и безусл переходы, а деление на некст_блок в большей части после них и по дистанции вхождения в другой блок. Инструкция вызова может быть в любой позиции внутри блока. И есть блоки, которые выполняя условие, оператор обходит, они могут быть без бранчей.
Но...хотел спросить совершенно о другом. По блокам собирать довольно весело, для графы то оно сымпатышно.
а вот для сборки весьма кучеряво..
чисто пример:
Code:
  1. start:
  2. 0000000145BAA1B0
  3.      sub rsp, 0x28
  4.      cmp byte ptr [r8], 0
  5.      mov rax, r8
  6.      jne 0x145bad6a3
  7. next_bk:0000000145BAA1C1
  8. 0000000145BAA1BB
  9. end.
  10.  
  11. start:
  12. 0000000145BAD6A3
  13.      mov r8, rdx
  14.      mov rcx, rax
  15.      lea rdx, [0x141cc4648]
  16.      call 0x1400a5a90
  17.      cmp eax, 1
  18.      sete al
  19.      add rsp, 0x28
  20.      ret
  21. next_bk:0000000000000000
  22. 0000000145BAD6BF
  23. end.
  24.  
  25. start:
  26. 0000000145BAA1C1
  27.      test r9b, r9b
  28.      jne 0x145baa1ca
  29. next_bk:0000000145BAA1C6
  30. 0000000145BAA1C4
  31. end.
  32.  
  33. start:
  34. 0000000145BAA1CA
  35.      mov al, 1
  36.      add rsp, 0x28
  37.      ret
  38. next_bk:0000000000000000
  39. 0000000145BAA1D0
  40. end.
  41.  
  42. start:
  43. 0000000145BAA1C6
  44.      xor ecx, ecx
  45.      mov dword ptr [rdx], ecx
  46. next_bk:0000000000000000
  47. 0000000145BAA1C8
  48. end.
  49.  
  50.  

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

Создано: 19 мая 2017 16:43 New!
Цитата · Личное сообщение · #14

Bronco

Это вам shellstorm пыли напускал со своими блоками. Что это такое конкретно ?
Участок между ветвлениями, окончание ветви - а если ветвь заканчивается ветвлением безусловным.. или это линейный участок кода, без промежутков или быть может это часть между двумя ссылками ?
Чушь полная такое. Есть понятие ветви и оно достаточно, всё остальное просто фигня.

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

Создано: 19 мая 2017 16:45 New!
Цитата · Личное сообщение · #15

Bronco пишет: а вот для сборки весьма кучеряво

Судя по листингу, все верно. Je\Jnz зависят от условия и вершиной блока условия является этот самый переход.
Остается пробежаться по всем ссылкам и посчитать расстояние между блоками, если оно больше нуля, значит там мертвый код, вот для последнего желательно завести отдельный список, поскольку в дальнейшем могут появится jmp,je,jnz,etc на мертвый блок, в таком случае его удалить из списка и добавить в основной граф.
Задача на поиск путей и расстояния, в гугле полно готовых реализаций.
Остальное опишите подробней, что не получается и что именно хотелось бы получить.


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

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

difexacaw

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

блок с мёртвым кодом остался в источнике.
если бы из него листинг не ломался, собрать можно было быстрей , опираясь только на 2 значения старт_энд.
дистанции переходов отдельный цикл

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

Создано: 19 мая 2017 16:47 New!
Цитата · Личное сообщение · #17

difexacaw пишет: а если ветвь заканчивается ветвлением безусловным

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

Добавлено спустя 43 минуты
Bronco пишет: дистанции переходов отдельный цикл

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

difexacaw пишет: Чушь полная такое. Есть понятие ветви и оно достаточно, всё остальное просто фигня.

Дружище, это все очень интересно, но расскажи нам, чем отличается дерево от графа?


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

Создано: 19 мая 2017 18:57 New!
Цитата · Личное сообщение · #18

shellstorm пишет:
Так вот для того и промежуточный список с мертвыми блоками

тут немного другое, и повторюсь что деадкоде уже нет, просто опять нужна стата и прогон, чтобы понять какова логика визуализации блоков с инструкциями у Диа. Я повторю пример, дополнив его исходными адресами инструкций и в той последовательности, в которой приходят стартовые адреса блоков.
Code:
  1. 1 start:
  2. 0000000145BAA1B0 sub rsp, 0x28
  3. 0000000145BAA1B4 cmp byte ptr [r8], 0
  4. 0000000145BAA1B8 mov rax, r8
  5. 0000000145BAA1BB jne 0x145bad6a3
  6. next_block: 0000000145BAA1C1
  7. end.
  8.  
  9. 2 start:
  10. 0000000145BAD6A3 mov r8, rdx
  11. 0000000145BAD6A6 mov rcx, rax
  12. 0000000145BAD6A9 lea rdx, [0x141cc4648]
  13. 0000000145BAD6B0 call 0x1400a5a90
  14. 0000000145BAD6B5 cmp eax, 1
  15. 0000000145BAD6B8 sete al
  16. 0000000145BAD6BB add rsp, 0x28
  17. 0000000145BAD6BF ret
  18. end.
  19.  
  20. 3 start:
  21. 0000000145BAA1C1 test r9b, r9b
  22. 0000000145BAA1C4 jne 0x145baa1ca
  23. next_block: 0000000145BAA1C6
  24. end.
  25.  
  26. 4 start:
  27. 0000000145BAA1CA mov al, 1
  28. 0000000145BAA1CC add rsp, 0x28
  29. 0000000145BAA1D0 ret
  30. end.
  31.  
  32. 5 start:
  33. 0000000145BAA1C6 xor ecx, ecx
  34. 0000000145BAA1C8 mov dword ptr [rdx], ecx
  35. end.

по дистанциям переходов лучше решение чем у Микаела в его плаге не придумать. Но вот как на лету слинковать *.asm предстоит ещё решать.

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

Создано: 19 мая 2017 19:43 New!
Цитата · Личное сообщение · #19

Без прогона и коррекции конечно никак, в отладчике тоже запилин корректор и с первого раза бывает выдает какую то хню вместо ожидаемого графа. Что касается 4 и 5 блока:

Code:
  1. 0000000145BAA1C4 jne 0x145baa1ca
  2. next_block: 0000000145BAA1C6
  3. end.
  4.  5 start:
  5. 0000000145BAA1C6 xor ecx, ecx
  6. 0000000145BAA1C8 mov dword ptr [rdx], ecx
  7. 4 start:
  8. 0000000145BAA1CA mov al, 1
  9. 0000000145BAA1CC add rsp, 0x28
  10. 0000000145BAA1D0 ret
  11. end.
  12. end.


je\jnz\etc в одном случае образуют фигуру /\ , а в другом случае все линейно | на концах палочек воображением нарисовать узлы\начало блоков, расставлять блоки с учетом адресации, один переход может быть вершиной двух блоков, один из блоков может не иметь никаких бранчей, это нормально, вот оба сразу не могут, если в одном из блоков нет бранчей, значит концом этого блока служит больший адрес ссылки из двух возможных, а вершиной служит сам переход, то бишь переход может является началом двух блоков и концом одного из блоков, а с ret это отдельный вопрос. Сумбурно конечно описал, но если не понятно, добавлю уточнений. По поводу корректности самого асм листинга, хз, не вчитывался и не компилировал в уме.

Добавлено спустя 6 минут
Кстати, у вас практически все готово для создания паттернов на базе графа, осталось убрать всякую зависимую от конкретного exe ерунду, адреса, избыточные инструкции, после чистки пройтись fuzzy hash-ром и сигнатура готова, таким способом можно искать библиотечный код или стандартные компоненты регистрации, например протекторов. Вообще для полного счастья не хватает одной штуки, нет перегона в IR, мб mrexodia когда нибудь прикрутит llvm, от этого будет больше пользы чем от недодекомпилятора.


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

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

shellstorm пишет:
Что касается 4 и 5 блока:

Диа своим анализом, для рендера сразу распределяет блоки влево_вправо.
Отсюда и та последовательность которая нарушает линейность исходного кода.
Между блоками 1_3_5_4 и 2, есть зазорчик в 34D3 байт, это таблица с индексами, которые защита юзает для своего свитч конструктора. в целом она ломает листинг в источнике , и есть шанс шагая там, пропустить какую-то стартовую инструкцию в блоке. Пока непонятно почему после пятого блока, поле brfalse = 0.
Асм листинг подразумевался с метками, чтобы не пересчитывать дистанции переходов.
Тоже наверное сумбурно.
shellstorm пишет:
когда нибудь прикрутит llvm

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

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

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

Bronco пишет: это таблица с индексами, которые защита юзает для своего свитч конструктора. в целом она ломает листинг в источнике

Capstone нормально разбирает этот блок? Глянул сурсы, анализ с графами завязан на capstone, если он фейлит результат как бы ясен, что поедет и сам граф.

difexacaw пишет: Ладно, открою вам тайну shellstorm это сацура с васмру

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


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

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

shellstorm пишет:
Capstone нормально разбирает этот блок?

тут любой дизасм листинг поломает.
так что на капстон нет смысла грешить, так же как и на дефолтное алго построение графы.
в моём случае, достаточно отсортировать свой вектор по структуре, и всё пучком
Code:
  1. 1 start:
  2. 0000000145BAA1B0 sub rsp, 0x28
  3. 0000000145BAA1B4 cmp byte ptr [r8], 0
  4. 0000000145BAA1B8 mov rax, r8
  5. 0000000145BAA1BB jne 0x145bad6a3
  6. next_block: 0000000145BAA1C1
  7. end.
  8.  
  9. 2 start:
  10. 0000000145BAA1C1 test r9b, r9b
  11. 0000000145BAA1C4 jne 0x145baa1ca
  12. next_block: 0000000145BAA1C6
  13. end.
  14.  
  15. 3 start:
  16. 0000000145BAA1C6 xor ecx, ecx
  17. 0000000145BAA1C8 mov dword ptr [rdx], ecx
  18. end.
  19.  
  20. 4 start:
  21. 0000000145BAA1CA mov al, 1
  22. 0000000145BAA1CC add rsp, 0x28
  23. 0000000145BAA1D0 ret
  24. end.
  25.  
  26. 5 start:
  27. 0000000145BAD6A3 mov r8, rdx
  28. 0000000145BAD6A6 mov rcx, rax
  29. 0000000145BAD6A9 lea rdx, [0x141cc4648]
  30. 0000000145BAD6B0 call 0x1400a5a90
  31. 0000000145BAD6B5 cmp eax, 1
  32. 0000000145BAD6B8 sete al
  33. 0000000145BAD6BB add rsp, 0x28
  34. 0000000145BAD6BF ret
  35. end.

difexacaw пишет:
Ну так это вы же спрашиваете

Конфабуля́ция

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


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

Создано: 20 мая 2017 00:01 New!
Цитата · Личное сообщение · #23

Bronco пишет: в моём случае, достаточно отсортировать свой вектор по структуре, и всё пучком

Теперь ясно, я не так понял, думал двиг потерял какие то инструкции которые должны были попасть в блок. Трудности донесения мысли и понимания, бывает.
Когда ждать релиз?

difexacaw пишет: Я вижу какие то куски кода выдранные рандомно.

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


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

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

shellstorm пишет:
Когда ждать релиз?

вот как на лету слинковать *.asm порешаю_обкатаю. , так бетку можно и закидывать.
остальное обкатал. Хотя есть ещё в планах ребилд иат и переходников_указателей в неё, с переносом таблицы на другое место.

Добавлено спустя 8 часов 28 минут
Multiline Ultimate Assembler v2.3.6 (May 20, 2017)
--> Link <--
Added the following commands for x64dbg: multiasm_show, multiasm_disasm_selection, multiasm_close.
Fixed a scrolling direction bug with the 64-bit version of RAEdit.


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

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

Bronco пишет:
как на лету слинковать *.asm порешаю_обкатаю

до линковки дело не дошло, всё на много проще выходит.
для обкатки, пока выделяю страницу, но есть не большой дискомфорт, при асембле инструкций переходов в выделенной странице, отладчик выдаёт мсг , по кол-ву вершин:
- мол юзать тут такое низЯ, но при этом саму инструкцию пишет.
Причина банальная - отключён гуй для скрипта, во время выделении страницы.
сдк_апи результата не приносят, пришлось чисто скриптовыми командами:
Code:
  1. if (vpage == NULL)
  2. {
  3. Module::InfoFromAddr(address_for, &Minfo);
  4. sprintf_s(message, "guiupdateenable");
  5. Cmd(message);
  6. sprintf_s(message, "alloc 0x2000,%p", Minfo.base - 0x10000000);
  7. Cmd(message);
  8. vpage = Eval("$result");
  9. //vpage = Memory::RemoteAlloc(Minfo.base - 0x10000000, 0x2000);
  10. const char* rights = "ERWC-";
  11. DbgFunctions()->SetPageRights(vpage, rights);
  12. sprintf_s(message, "guiupdatedisable");
  13. Cmd(message);
  14. cur_alloc = vpage;
  15. }

проверять дистанцию приходиться только для длинных переходов. пока вроде ничего.
--------------
На 100% не уверен, но на том материале что есть, под х64 выделять страницу ближе к образу, ничего не мешает. В х32 ситуация немного другая, там вокруг образа всё зарезервировано системой. Собственно вопрос.
Если страница выделяется рандомно, и возможно по низким адресам, будут ли в ней ломаться статик указатели и дистанции колов? если да, то как тогда лучше выделить страницу по нужному адресу?


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

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

ох ох ох...с ответом на вопрос прямо навалились...
© Сократ Софронискович : - "Если тебе ответили молчанием, это не значит что не ответили" .
х* с ним, мне х32 не в приоритете, а возникнет проблема, доберёмся_порешаем.
кста, хороший индикатор конъюнктуры харизмы к топу, а ведь топтуны есть
ну не будем всё время о хорошем.
первый контрольный фулл тест драйв плага, результ:
Code:
  1. Target : - SGW3.exe
  2. Target size : - 128 mb 
  3. Total processing time: 04.23 
  4. Total Find JMP: - 17468
  5.  - ToCODE 17189
  6.  - ToVM   279
  7.  - TotalBadCodeSize 19 - BAD 
  8.  - TotalRipByteCodeSize 2E3272
  9.  - Not pointer 67
  10. For Tables INIT:
  11.  - Total Pointer in .data 41536
  12.  - Total Pointer in .bss 200
  13.  

основная потеря времени на подсчётах в скрипте интов.
Code:
  1. count_int3:
  2. //считаем кол-во интов.
  3. prolog = addr+5 < размер инстр. перехода
  4. w1:
  5. cmp 4:[prolog],CCCCCCCC < кампарить можно маски 8, но так мы проскочим, если ниже некст переход.
  6. jne w2
  7. add prolog,3
  8. jmp w1
  9. w2:
  10. sub prolog,3
  11. w3:
  12. cmp 1:[prolog],CC
  13. jne w4
  14. prolog++
  15. jmp w3
  16. w4:
  17. vm_int3 = prolog - addr
  18. ret

а есть и тела монстры:
Code:
  1. code 00000001418E8E00 | JMP 0x000000014A973100 | | m_size - 38A0 | int3 - 3A10

остаток - TotalBadCodeSize 19 - тел, только для ручной работы Мультилайном.
в тыкнуть не дают изменёные переходы на длинные, с дистанцией : - "0х0f847e"
дополнительно теряем время из-за нагрузки чемодана регистрации и сортировки патченных байтов.
Состояние отладчика терпимо. Пока отлаживал плаг вычленением доступных ему тел, дбг дышал ровно:
- проц 30 %
- память макси 500, мин 70 мб
на фулл тест драйве при том же коде в плагине, в дбг пошли скачки:
- проц мин 28%, макси 60 %
- память макси 2.5 гб, с середины общего времени мин 500 мб.
Поставленную задачу выдохнул и не грохнулся, автору респект за это.
Для сборки юзаю 2 метода, второй либо с одним, либо с двумя проходами, он в 4 раза медленней основного.
Решение загнать обработку 2 метода в потоки, пока не реализована.
Лог результата в подробностях, приатачил.
пыс.пыс
чёрной инструкции кторая бы крашнула все три двига не выявлено.

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


Ранг: 505.2 (!)
Статус: Модератор

Создано: 27 мая 2017 20:52 New!
Цитата · Личное сообщение · #27

Bronco пишет:
Лог результата в подробностях, приатачил.пыс.пыс


аттач потерялся
хорошо еще б шапку обновить последними наработками
спс

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

Создано: 27 мая 2017 22:14 · Поправил: shellstorm New!
Цитата · Личное сообщение · #28

Bronco пишет: ох ох ох...с ответом на вопрос прямо навалились...

Занят сейчас, а писать, абы что то писать не вижу смысла, мб завтра найдется пара часов

> cmp 4:[prolog],CCCCCCCC < кампарить можно маски 8, но так мы проскочим, если ниже некст переход.

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

Добавлено спустя 2 минуты
готовая библиотека, остается только прибить к движку. https://github.com/a4lg/ffuzzypp

Добавлено спустя 19 часов 56 минут
Bronco пишет: sprintf_s(message, "guiupdateenable");

void GuiUpdateEnable(bool updateNow); разве не работает? alloc находится в _scriptapi_misc.h
На остальное нужно больше кода.


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

Создано: 28 мая 2017 20:08 · Поправил: Bronco New!
Цитата · Личное сообщение · #29

sendersu пишет:
хорошо еще б шапку обновить последними наработками

добавил FunctionGetTime, сбрасывает в лог текущее время до милисек.
привёл в стандартный вид команды с аргументами, название переменных значение не имеет, главное чтобы по скрипту, где нить тыкнули в них данные.
если под наработками что то другое подразумевается, то это только слабые места асм двигов.
Предпочтение отдал основному XEDParse, и дополнительно AsmJit, Keystone в аутсайдерах, если и он не справляется хапаю инструкцию бинарём, и мечу лейбой адрес, в которой оригинальная мнемоника.
У XEDParse 12 опкодов для записи и кодирования недоступны+
Code:
  1. //XEDParse портят константу и в целом саму инструкцию "imul reg, reg, const", поэтому юзаем двиг асмжт
  2. strncpy_s(buffer, soursedata.instruction, 4);
  3. if (!strcmp(buffer, "imul"))
  4. {
  5. BridgeSettingGetUint("Engine", "Assembler", &setting);
  6. setting = (duint)2;
  7. BridgeSettingSetUint("Engine", "Assembler", setting);
  8. DbgSettingsUpdated();
  9. DbgAssembleAt(new_cur_alloc, soursedata.instruction);
  10. setting = (duint)0;
  11. BridgeSettingSetUint("Engine", "Assembler", setting);
  12. DbgSettingsUpdated();
  13. alloc_cur += soursedata.size;
  14. DbgDisasmFastAt(new_cur_alloc, &newdata);
  15. new_cur_alloc += newdata.size;
  16. continue;
  17. }
  18. //увеличивают размер инструкций с опкодом  логических "И" и "ИЛИ"
  19. strncpy_s(buffer, soursedata.instruction, 3);
  20. if (!strcmp(buffer, "and"))
  21. {
  22. BridgeSettingGetUint("Engine", "Assembler", &setting);
  23. setting = (duint)2;
  24. BridgeSettingSetUint("Engine", "Assembler", setting);
  25. DbgSettingsUpdated();
  26. DbgAssembleAt(new_cur_alloc, soursedata.instruction);
  27. setting = (duint)0;
  28. BridgeSettingSetUint("Engine", "Assembler", setting);
  29. DbgSettingsUpdated();
  30. alloc_cur += soursedata.size;
  31. DbgDisasmFastAt(new_cur_alloc, &newdata);
  32. new_cur_alloc += newdata.size;
  33. continue;
  34. }
  35. strncpy_s(buffer, soursedata.instruction, 2);
  36. if (!strcmp(buffer, "or"))
  37. {
  38. BridgeSettingGetUint("Engine", "Assembler", &setting);
  39. setting = (duint)2;
  40. BridgeSettingSetUint("Engine", "Assembler", setting);
  41. DbgSettingsUpdated();
  42. DbgAssembleAt(new_cur_alloc, soursedata.instruction);
  43. setting = (duint)0;
  44. BridgeSettingSetUint("Engine", "Assembler", setting);
  45. DbgSettingsUpdated();
  46. alloc_cur += soursedata.size;
  47. DbgDisasmFastAt(new_cur_alloc, &newdata);
  48. new_cur_alloc += newdata.size;
  49. continue;
  50. }

sendersu пишет:
аттач потерялся

Максимальный размер аттача: 500KB.
а лог --> 2.4 мб <--
до турбо далеко конечно, но уже с той же богадельней, но на час быстрее, проц до 50,%, память до гига.
shellstorm пишет:
готовая библиотека

разве что отдельной командой для скрипта, но в сам метод сборки пока не понял зачем.
+ поиск патерна до первого совпадения есть.
клянчить или фиксить формат строки надоело, искал указатели таким способом.
Code:
  1. rax = rip
  2. bswap rax
  3. FunctionFindPattern rip, rax
  4. log "{p:$result}"
  5. ret

надо так же и для мнемоники сделать, чтобы без рефов и в своём цикле.
shellstorm пишет:
GuiUpdateEnable(bool updateNow); разве не работает?

вот сколько вершин в функции вот столько и мсг, апишки не спасают.

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

Создано: 28 мая 2017 20:19 New!
Цитата · Личное сообщение · #30

Bronco пишет: но в сам метод сборки пока не понял зачем

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


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

Создано: 28 мая 2017 20:32 New!
Цитата · Личное сообщение · #31

shellstorm пишет:
Скрипт нельзя пустить в несколько потоков

если отдельная скрипт_команда для поиска по хешу, и она надёжна и быстрее, то почему бы не сделать.
из 19 тел, 7 пропустили из-за текущего подсчёта интов, не проскочили инструкции выравнивания нопами, пока не потяно для чего там прописаных.
остальные 13 достаточно в Multiline Ultimate Assembler на помеченный переход тыкнуть шорты, и асемблить пакетом.
<< . 1 . 2 . 3 . 4 . 5 . >>
 eXeL@B —› Софт, инструменты —› Плагины к отладчику Mr.eXoDia x64/x32 dbg

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

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