Идея не нова конечно, даже у меня есть поделка построеная на том же принципе... на питоне Хотя метод сохранения нодов в битовую карту оригинальный, правда, не совсем понятен выигрыш: по размеру битовой карты его точно нет, наверное по скорости? И чем снимается покрытие, это интересный момент.
ormoulu, Смотри пример. Пасс проверяется при вводе символа, нужное место быстро находится: Туда останов и в среде появляются строки: - это вероятно хэши в строковом виде. > не совсем понятен выигрыш Причём тут оптимизация.. индексируется битмапа через VA, для одной инструкции нужен всего 1 бит. Если инфу нужно хранить, счётчики всякие, то есть такое. Картирование даёт часть cfg связанную с искомым событием, как минимум с этого можно начинать отладку. > И чем снимается покрытие Когда визор выполняет трансляцию, на каждой итерации проверяет маркер в битмапе; если сброшен проверяет адрес(какому модулю относится и тп), взводит маркер и добавляет адрес в лог.
Ага, только одна инструкция занимает больше одного адреса, логируются только блоки/ветвления, соответственно абсолютное большинство бит не будет задействовано никогда. Визор это некий эмулятор, насколько я понимаю? На каком принципе работает, очевидно это не хардварная виртуализация, верно?
ormoulu, > абсолютное большинство бит не будет задействовано никогда. Для всего ап 86 битмапа имеет размер 2Mb, это ниочём > Визор это некий эмулятор dbi. > хардварная виртуализация Она для юзер апп абсолютно не нужна.
Вот еще что не совсем понятно: если метод построен на сравнении покрытий, то он работает только если при изменении вводимого пароля меняется путь исполнения? А если это хеш который обрабатывает все строки стандартно и потом сравнивает с заданным значением, то не сработает? Либо нужно иметь валидный пароль чтоб найти место проверки. Или я чего-то недопонимаю?
ormoulu, > он работает только если при изменении вводимого пароля меняется путь исполнения? Появляется новый путь. Изменяется это более сложно в реализации и не ясно зачем нужно. Например условие ветвления изменится или положение в cfg.. Хотя может понадобится, при повторениях. > А если это хеш который обрабатывает все строки стандартно и потом сравнивает с заданным значением, то не сработает? Да, тоже самое если вызвать до события(ввода в данном случае) обрабатывающий его код. Так скипнулись некоторые хэндлеры rel'a вот. Из той подборки семплов для pespin'a лог пуст - либо баг в крэкми, либо вызов до проверки.
Спасибо большое за пояснения! Картинка более-менее сложилась. Вот еще любопытно: вы свой dbi сравнивали по производительности с DR, Pin, Frida?
ormoulu, Дий не новый инструмент, ему много лет. Обсуждать конкретно дби не будем, иначе будет большой срач --- Сообщение объединено, 28 фев 2022 --- Глянул что с картами происходит под протекторами. Для чистоты эксперимента взял такой семпл: enigma - .map, 401044 -> 130 jcc. - без .map как в оригинале. obsidium - +1 jcc. pecomp - без изменений. privexeprot - без .map добавил пре/пост обёртку. - .map отморфил в 40 jcc. themida - падает. --- Сообщение объединено, 28 фев 2022 --- enigma^
safeengine - исходная процедура не изменяется, +jcc. Если задать процедуру для морфа: - остаются 3 jcc + 1. Можно выделить: Код (Text): 00D40000 jnz short 00D40008 ; +0(4BC122) 00D40002 call 00D4005B 00D40007 x 00D40008 seto dl 00D4000B mov ebx,eax 00D4000D mov edx,BC2D97FF 00D40012 mul ecx 00D40014 inc al 00D40016 mov eax,edx 00D40018 call 00D4001E 00D4001D x 00D4001E push dword ptr ss:[esp+3] 00D40022 lea esp,dword ptr ss:[esp+1] 00D40026 mov dword ptr ss:[esp],eax 00D40029 lea esp,dword ptr ss:[esp+3] 00D4002D lea esp,dword ptr ss:[esp+4] 00D40031 lea edx,dword ptr ds:[edx+edx*4] 00D40034 add edx,edx 00D40036 cmc 00D40037 sub ebx,edx 00D40039 cmc 00D4003A add bl,30 00D4003D mov byte ptr ds:[esi],bl 00D4003F pushfd 00D40040 lea esp,dword ptr ss:[esp+4] 00D40044 inc esi 00D40045 sub esp,2 00D40048 lea esp,dword ptr ss:[esp+2] 00D4004C test eax,eax 00D4004E push ax 00D40050 push word ptr ss:[esp+1] 00D40055 lea esp,dword ptr ss:[esp+4] 00D40059 jmp short 00D40000 00D4005B lea esp,dword ptr ss:[esp+4] 00D4005F cmp edi,esi 00D40061 jb 00D400EE ; +8(4BC1B6) 00D40067 bswap ebx 00D40069 xchg bx,si 00D4006C pop edi ... Все условия сохраняются. Если же заместо морфа использовать вирту: - одно условие, события не видны из за повторного покрытия. С виртой карты не работают, в простом виде(без счётчиков etc) --- Сообщение объединено, 1 мар 2022 --- Нашёл древний семпл авера. - в карте 6 событий, последнее это проверка валид/невалид, предпоследняя это проверка символов пароля, дальше идут вычисления.
Мне вручную не очень актуально, мне было интересно может строки автоматически выцепляются. Хотя наверное это осуществимо если например подключить статическую базу где отмечены строки и адреса обращения к ним. Не поможет конечно если строка для сравнения генерится автоматически.
ormoulu, Типо так ? Код (Text): if mm_fetch(Ip) if line_addr = effective_addr if [line_addr] = "mystring" if !IcGet(Ip) Log(Ip, line_addr) IcSet(Ip) fi fi fi fi Не проблема строки выцепить, в данном случае это юникод и прямая выборка. Пройти по указателям взятым из среды и поискать. --- Сообщение объединено, 1 мар 2022 --- Rel, Интересно метод доработать, для этого нужно много тестить.
ormoulu, Олли, авера запускал в x32dbg. Со строками сразу проблема появилась и не одна, впрочем она очень старая, помню на прошлом форуме я её поднимал. - результат работы RtlIsTextUnicode()/DbgPrint(). 1. Нужно определить что это читаемые строки. 2. Маркировать начало строк, что бы небыло обращений далее начала буфера. --- Сообщение объединено, 1 мар 2022 --- ormoulu, Забавно, если выводить ascii в семпле выше: --- Сообщение объединено, 1 мар 2022 --- ormoulu, Написал простейшую процедуру маркировки строк: Код (Text): if IcGet(P) ; xS..0 if !IcGet(P - 1) if IsAscii(P) ret TRUE ; 0S..0 fi fi else if IsAsc(P) ; S..0 IcSet([P % (P + Len(P))]) ret TRUE fi fi ret FALSE Такое выводит: Пару семплов решила: Это наверно примеры как не нужно делать крэкми
Введение в реверсинг с нуля используя IDA PRO. Часть 14. - первое с конца событие сравнение хэшей. Если выборку строк посмотреть, то она при вычислении хэшей: Там материал обучающий, но не сказано главное - нет смысла в ручном анпаке, тк пакер сам всё распаковывает, он даже не заметен. Аналогично: --- Сообщение объединено, 3 мар 2022 --- OEP для этого семпла.
Камераден, совершенно ВНЕЗАПНО понадобилось. Чем сейчас модно восстанавливать заголовки, секции и вот это все после дампа? Руками чего-то лениво, писать свою приблуду еще ленивее. Запускать не надо, лишь бы ида нормально сожрала и сойдет.
Ну я руками конечно уже, это оказалось быстрее чем на форуме спросить, но все-таки интересно стало: тут спецы только по кракмисам? Или все тоже ручками правят, или свои инструменты у всех?