![]() |
eXeL@B —› Программирование —› Программно отличить реальный код от мусора, как? |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 25 декабря 2008 14:59 · Личное сообщение · #1 |
|
Создано: 25 декабря 2008 15:05 · Поправил: daFix · Личное сообщение · #2 temp А чем отличается поксоренный код от мусора? Кажется ни чем... Попробуй по энтропии как нибудь, но кажется и это тебе особо не поможет. Если ксор везде на одинаковое число, то попробуй бинарно искать поксоренный болк, если он заведомо известен PUSH xxx // POP xxx RET И то это не выход ----- Research For Food ![]() |
|
Создано: 25 декабря 2008 15:08 · Личное сообщение · #3 |
|
Создано: 25 декабря 2008 15:15 · Поправил: progopis · Личное сообщение · #4 Вообще здесь нужен качественный двиг дизасма. Искать надо всякий бред, типа два префикса замены сегмента подряд (что на самом деле не может быть создано компилятором, потому как первый префикс будет проигнорен процом, а компиляторы делают оптимизацию), конструкции leave/retn и leave/retf (после leave всегда идёт ret, иначе это мусор), если КОПа не существует, а предыдущая команда не Jcc,JMP,CALL - тоже признак мусора. Ну и так далее. P.S. ИМХО универсального лекарства не существует. Длина ключа хоть какая? Там у тебя обычный XOR? Тогда легко. ![]() |
|
Создано: 25 декабря 2008 15:28 · Поправил: temp · Личное сообщение · #5 |
|
Создано: 25 декабря 2008 15:33 · Личное сообщение · #6 temp пишет: прикрепил пример - бинарник: оригиналы нескольких команд поксорены одним байтом ![]() ![]() |
|
Создано: 25 декабря 2008 15:42 · Поправил: temp · Личное сообщение · #7 |
|
Создано: 25 декабря 2008 15:45 · Личное сообщение · #8 |
|
Создано: 25 декабря 2008 15:46 · Личное сообщение · #9 |
|
Создано: 25 декабря 2008 15:54 · Личное сообщение · #10 |
|
Создано: 25 декабря 2008 16:24 · Личное сообщение · #11 была тема у меня , схожая , цель примерно таже. В топике много полезных ссылок Вот смотри --> Link <-- ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 25 декабря 2008 16:44 · Личное сообщение · #12 Если брать что-то конкретное, то в каком-либо отдельном ехе файле - ещё ладно, можно программно сдетектить, надо только знать, какой там мусор, а для этого исследовать конкретную программулину. А если в общем, то фиг - всегда можно написать такой мусор, который вроде бы и не мусор, но и нах не нужен. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 25 декабря 2008 16:45 · Поправил: theCollision · Личное сообщение · #13 |
|
Создано: 25 декабря 2008 16:50 · Личное сообщение · #14 |
|
Создано: 25 декабря 2008 16:52 · Личное сообщение · #15 |
|
Создано: 25 декабря 2008 16:52 · Поправил: daFix · Личное сообщение · #16 theCollision http:/www.exelab.ru/f/action=vthread&topic=13288&forum=6&p age=-1 http://exelab.ru/f/action=vthread&topic=13288&forum=6&page =-1 Ты там в своём файле Hosts.txt ничего не правил, когда были глюки с лабом? Попробуй по этим двум ссылкам зайти ProTeuS +1 Опередил ----- Research For Food ![]() |
|
Создано: 25 декабря 2008 19:56 · Личное сообщение · #17 |
|
Создано: 25 декабря 2008 19:59 · Личное сообщение · #18 |
|
Создано: 25 декабря 2008 20:56 · Личное сообщение · #19 В GCC компиляторе можно найти я думаю всё что надо. Мне, например, не хватает образования чтобы понять как это всё работает. Еще я заметил что проектной документации по компилятору как таковой не существует либо она недоступна. Разумеется для кодеров проекта и так всё понятно, или наверное есть что-то из доки для узкого круга. Если заняться серьёзно и с серьёзнымы знаниями, то делать самому много не придётся. Все давно изобретено. И сделано весьма дальновидно (мое скромное мнение). Так что надо изучить и понять как оно работает, а поняв это, можно собрать движок для какого хочешь процессора. ![]() |
|
Создано: 26 декабря 2008 15:22 · Личное сообщение · #20 temp пишет: К примеру - процедура поксорена одним значением, и чтобы подобрать это значение, нужно как-то идентифицироать "хороший" код от мусора. Бред. С каких пор код после ксора становится мусором? Если в обычном в коде есть мусор, его можно вычистить так же как это делают компиляторы при оптимизации = "код который ничего не делает выкидывается". Если у тебя есть поксоренный (код + мусор), тогда пытаться узнать ключ по мусору тоже самое что узнать цвет волос по цвету мочи. ----- have a nice day ![]() |
|
Создано: 26 декабря 2008 15:25 · Личное сообщение · #21 |
|
Создано: 26 декабря 2008 15:57 · Личное сообщение · #22 Nimnul пишет: Бред. ...... тогда пытаться узнать ключ по мусору тоже самое что узнать цвет волос по цвету мочи. То, что бред - не согласен. Сходу по мусору ключ не определить, это да, но можно делать так: 1) Меняем значение "ксора" 2) "Ксорим" процедуру 3) Проверяем по определенным правилам на выходе мусор или код 4) Если не код, то повторяем с п.1 з.ы. ессеессенно без дизасма не обойтись я пока не вижу ничего другого, как откидывать код содержащий мнемоники типа: fadd, fdiv st, rep push и т.п. ![]() |
|
Создано: 26 декабря 2008 16:04 · Поправил: Nimnul · Личное сообщение · #23 temp пишет: Если не код, то повторяем с п.1 а чем это отличается от брутфорса? И если эта процедура хоть когда-нибудь расшифровывается не проще поставить бряк и посмотреть что за код? или код идет в ключе? temp пишет: То, что бред - не согласен. Значит ты не встречался с кодом, который специально разбавляют мусором. И что ты тут понимаешь под словом "мусор" я хз. ----- have a nice day ![]() |
|
Создано: 26 декабря 2008 16:08 · Поправил: temp · Личное сообщение · #24 Nimnul пишет: а чем это отличается от брутфорса? А я и не говорил, что это не брут, вопрос, как надежнее и быстрее отсеивать мусор Nimnul пишет: или код идет в ключе? код идет в ключе ![]() Nimnul пишет: Значит ты не встречался с кодом, который специально разбавляют мусором. И что ты тут понимаешь под словом "мусор" я хз. Встречался ![]() под "мусором" я понимаю любой другой вариант процедуры, отличный от оригинала или хотя бы был похож на нормальный код. ![]() |
|
Создано: 26 декабря 2008 16:12 · Личное сообщение · #25 |
|
Создано: 26 декабря 2008 16:19 · Поправил: Nimnul · Личное сообщение · #26 temp я понял, ты хочешь написать брут, но не знаешь как проверить результат. Используй дизасм длинн для проверки. Или... Любая функция всегда начинается со стековых команд и заканчивается... дворд под ксором это херня максимум за сутки сбрутишь. если второй вариант будешь использовать тогда используй для брута первые 20 байт, если стековые команды найденны смотри последние. ----- have a nice day ![]() |
|
Создано: 26 декабря 2008 16:21 · Личное сообщение · #27 progopis пишет: Что за программа? Скинь в личку инфу. Если что, скардить можно будет, а всякие там бруты по миллионы лет - не наш метод. не миллионы, а ~50 суток, на одной машине, а у меня есть возможность рулить 20 машинами, так что за недельку точна подберу, если брут сделать с качественным "отсеивателем" ![]() прогу не скажу, причины называть не буду, и выклянчивать помощь не в моих правилах, нет идей или желания делиться, никто никого же не напрягает. ![]() |
|
Создано: 26 декабря 2008 16:27 · Поправил: temp · Личное сообщение · #28 Nimnul пишет: я понял, ты хочешь написать брут, но не знаешь как проверить результат. Используй дизасм длинн для проверки. Или... Любая функция всегда начинается со стековых команд и заканчивается... да, теперь Вы меня поняли верно, тока вот незадача, что стековые команды стоят на месте, а вот потом идет джамп через мусор на конец процедуры(стековые команды), в общем, как в любом коммерческом проте. а так бы еще и по ret XX в конце можно было бы отсеивать, хм..... это в принципе тоже стековая команда ![]() ![]() |
|
Создано: 26 декабря 2008 16:46 · Личное сообщение · #29 Nimnul пишет: С каких пор код после ксора становится мусором +1, ведь дизассемблировать можно в принципе всё, кроме ошибочных инструкций. Алгоритм отсеивания правильных и неправильных инструкций присутствует в --> HDE <-- http://patkov-site.narod.ru/download/hde32-0.25.tar.gz Всё остальное в статике не получится разобрать - надо отлаживать процесс и трассировать. + Нет никаких гарантий того что есть например некий валидный код, а программа во время выполненния его перезаписывает другим валидным кодом. И тот и другой код статический анализ примет за реальный. Выходит что нужно отлавливать обращения к коду и смотреть на предмет его изменения/перезаписи(да ещё и смотреть на динамически выделяемую память, где вообще в гавно мешать можно код и данные ![]() ----- все багрепорты - в личные сообщения ![]() |
|
Создано: 26 декабря 2008 17:21 · Поправил: Nimnul · Личное сообщение · #30 temp если там коммерческий прот, то самое простое это вставить корокий прыг вперед через 1-3 байт, что бы код был не выровнен и тогда никакие сигнатуры тебе непомогут определить валидность расшифрованного кода. Но прыг это тоже команда, если ты предполагаешь что там первым может быть прыг, включи его в условие валидности, а дальше проверяй дизасмом длин или как HandMill подсказал. Если там есть смещение, то проверяй n раз, где n глубина возможного смещения в байтах. Кроме того последние байты функции могут быть только ret, call, jmp || jxx, ищи от конца функции эти команды, потому что за ними может быть мусор. и знай что расширить память под функцию, не так просто, поэтому у коммерческого прота не так много места для маневров, если опять же он не выполняет часть функции в стеке или в куче. ----- have a nice day ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Программно отличить реальный код от мусора, как? |