:: Игры Разума
Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Эта задачка, конечно, весьма специфическая, но может быть, кому-нибудь и придется по вкусу.
В прицепленном файле очень маленький экзешник, состоящий из одного prg файла длиной в пару десяток строчек. Задание: объяснить, почему этот экзешник выдает именно то, что он выдает.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
medstrax
Забанен

Сообщений: 5964
Дата регистрации: 23.03.2007
Люди, выложите кто-нибудь ссылки на либы фоксовского рантайма. Самого фокса нет.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Snick

Сообщений: 5949
Откуда: Москва
Дата регистрации: 21.05.2001
Да у Миши Дроздова на сайте должны быть.


------------------
www.sngsnick.com

Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
medstrax
Люди, выложите кто-нибудь ссылки на либы фоксовского рантайма.
ftp.prolib.de
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Pa7r1ck

Сообщений: 188
Дата регистрации: 11.01.2007
Рефокс падает при декомпиляции (хотя результат есть), скорее всего exe-шка пропатчена после сборки )
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Забавно. Думаю, что exe был "доработан" вручную, вот только каким образом? Рефокс, ксати, у меня не падал, все аккуратно извлек. Попробовал собрать exe заново и сравнить, но отличий много, даже в размере (получился больше на 18 байт). Глубже копать не стал.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
А что за Рефокс? У меня XI совершенно нормально берет.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Pa7r1ck

Сообщений: 188
Дата регистрации: 11.01.2007
Refox X
Version 2003-05-13 / 10:00:05
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привет Леонид!
Потому что ты поменял имя одного из идентификаторов на недопустимое
Было нечто вроде
SET TALK OFF
LOCAL a1__a2, a3
STORE 1 TO a1__a2
a3 = f1(a1__a2)
IF a3 <> 2
MESSAGEBOX("Hello, world!", 0, "Success")
ELSE
MESSAGEBOX("Sorry, I have been Refoxed", 0, "Error")
ENDIF
ENDPROC
FUNCTION f1
LPARAMETERS b1, b2, b3
DO CASE
CASE PCOUNT() = 0
RETURN 0
CASE PCOUNT() = 1
RETURN b1
CASE PCOUNT() = 2
RETURN b1 + b2
CASE PCOUNT() = 3
RETURN b1 + b2 + b3
ENDCASE
ENDFUNC
А ты после компиляции поменял в объектном модуле "a1__a2" на "a1, a2" - объектному модулю в принципе по барабану какое имя у переменной - он работает грубо говоря по "номеру переменной" (за исключением конечно макро, EVALUATE() и тому подобных конструкций, где именно имя объекта имеет значение), а после декомпиляции это "кривое имя" превращается в якобы 2 отдельных имени - соответственно при повторной сборке изменяется логика.
Кстати, этот приём не используется в твоём обфускаторе?
P.S. У меня нету адекватного UnFoxAll-а (тот что есть не могёт main file декомпилировать, а баловаться с 2-мя разными файлами как-то лениво было), зато Corso 5.2 очень чётко это показывает - он для объектных модулей не только p-код каждой команды выделяет, но ещё и "таблицу имён" показывает - там видно это хитрое имя


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 02.02.09 16:10
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Igor Korolyov
Привет Леонид!
Потому что ты поменял имя одного из идентификаторов на недопустимое
Было нечто вроде
SET TALK OFF
LOCAL a1__a2, a3
STORE 1 TO a1__a2
a3 = f1(a1__a2)
IF a3 <> 2
MESSAGEBOX("Hello, world!", 0, "Success")
ELSE
MESSAGEBOX("Sorry, I have been Refoxed", 0, "Error")
ENDIF
ENDPROC
FUNCTION f1
LPARAMETERS b1, b2, b3
DO CASE
CASE PCOUNT() = 0
RETURN 0
CASE PCOUNT() = 1
RETURN b1
CASE PCOUNT() = 2
RETURN b1 + b2
CASE PCOUNT() = 3
RETURN b1 + b2 + b3
ENDCASE
ENDFUNC
А ты после компиляции поменял в объектном модуле "a1__a2" на "a1, a2" - объектному модулю в принципе по барабану какое имя у переменной - он работает грубо говоря по "номеру переменной" (за исключением конечно макро, EVALUATE() и тому подобных конструкций, где именно имя объекта имеет значение), а после декомпиляции это "кривое имя" превращается в якобы 2 отдельных имени - соответственно при повторной сборке изменяется логика.
Кстати, этот приём не используется в твоём обфускаторе?
P.S. У меня нету адекватного UnFoxAll-а (тот что есть не могёт main file декомпилировать, а баловаться с 2-мя разными файлами как-то лениво было), зато Corso 5.2 очень чётко это показывает - он для объектных модулей не только p-код каждой команды выделяет, но ещё и "таблицу имён" показывает - там видно это хитрое имя

Точно, получилось! Меняются всего два байта, и Refox красиво ошибается.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Привет Игорь!
Igor Korolyov
А ты после компиляции поменял в объектном модуле "a1__a2" на "a1, a2"
Точно!

Цитата:
объектному модулю в принципе по барабану какое имя у переменной - он работает грубо говоря по "номеру переменной"
Не совсем так. В новом - имени не должно быть chr(0).

Цитата:
Кстати, этот приём не используется в твоём обфускаторе?
У меня в обфусуаторе было два варианта (там переключатель есть). В первом имена переменных заменялись на вполне нормальные имена состоящие из букв "О" и нулей "0". Рефоксом это можно было декомпилировать и получалась вполне адекватная программа, только трудно читаемая. Во втором имена локальных переменных заменялись на смесь из "невидимых" символов chr(9), chr(10), chr(13) и пробел. Полсле декомпиляции Рефоксом получалася сплошная некомпилируемая чушь. Правда китайцы быстро написали антиобфускатор, который заменял подобные имена на имена типа c001, c002, ... Здесь я хотел продемострировать как раз другую идею, когда Рефокс все нормально декомпилирует, фокс потом может откомпилировать, никто не ругается, а логика программы становится другой. Подобных примеров можно придумать великое множество. Приведенный пример далеко не самый простой. Можно, например, откомпилировать следующий код
LOCAL a1, a2, a3
a1_a2=a3
IF !a1
MESSAGEBOX("Hello, world!", 0, "Success")
ELSE
MESSAGEBOX("Sorry, I have been Refoxed", 0, "Error")
ENDIF
а затем в экзешнике поменять a1_a2 на a1=a2.
Кстати, эту идею вполне можно использовать для защиты программ от Рефокса. Если где-нибудь в глубине приличной по объему программы вставить подобную конструкцию и время от времени к ней обращаться, то она вполне отличит рефоксировнную программу от оригинальной. А те, кто ее рефоксировал врядли полезут изучать ее всю, если они не подозревают, что там есть такие примочки. Им как правило всего-то и нужно - подсмотреть пароль, или снять защиту от копирования.

Цитата:
зато Corso 5.2 очень чётко это показывает - он для объектных модулей не только p-код каждой команды выделяет, но ещё и "таблицу имён" показывает - там видно это хитрое имя
А вот Corso 5.2 у меня под ХР не работает, а Corso 6 "таблицу имён" не показывает (или я не умею ее посмотреть).
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привет Леонид!

В Corso6 тоже есть - сначала "открыть exe", потом Analyse Fox File, затем даблклик по имени модуля (main.fxp) в новом окне "строки кода и имена" по центру внизу находятся - дерево там, не список... Только что-то процедуру он не нашёл - только "основной" код
Да и вообще прога оставляет впечатление пре-альфы Типа того "разборщика" что я для себя рисовал когда-то да забросил.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Привет Игорь!
Igor Korolyov
затем даблклик по имени модуля (main.fxp)
Вот этого я не знал, хотя помнится, в Corso 5 что-то подобное видел. Еще, кстати, у меня кнопка Save App не работает, а порой могла бы быть весьма полезна.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привет Леонид!

Зато работает кнопка Extract App, та что крайняя справа сверху
Документация конечно не помешала бы, а то никак не догадаться что стоит за некоторыми кнопками... И очень жаль что написана утилита не на фоксе (с возможными С/asm-вставками для скорости)...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Привет Игорь!

Igor Korolyov
Зато работает кнопка Extract App, та что крайняя справа сверху
Кнопка то работает, только делает не то, что хотелось бы. Насколько я понимаю, она вытаскивает арр-ку из экзешника напрямую, никак не реагирую на те изменения, которые делались уже в Corso. А вот кнопка Save App по идее должна была сохранять арр-ку с уже внесенными изменениями. А вот это у меня не получается, хотя, насколько я помню, в Corso 5.2 такая кнопка была и работала.
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привет Леонид!

Никогда не делал в самом корсо никаких изменений Как-то раз помнится попробовал что-то этакое сотворить, так он мне файл запорол напрочь... С тех пор только смотрю им, ну и "извлекаю" куски по возможности. Опять же, без инструкции очень сложно додуматься что и как там можно/нужно делать... Интерфейс что в 5.2, что в 6 очень далёк от "интуитивно понятного". Ну да оно и не удивительно - тулза то явно не для простого юзера писана.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вот ещё несколько простых примеров, которые "обманывают" Рефокс (они достаточно примитивны, поэтому я просто приведу исходник).
Кстати, очень интересно реагирует на LINENO() UnfoxAll Хитрые китайцы просто подставляют реальный номер строки (он по любому есть в объектном модуле, даже при компиляции с отключенным DebugInfo).
В отличие от твоего примера, никаких манипуляций с объектным кодом не требуется
l1=10.0000000000000045
l2=10.00000000000000449
IF TRANSFORM(l1)=TRANSFORM(l2)
MESSAGEBOX("I'v been refoxed!")
ELSE
MESSAGEBOX("I'm OK")
ENDIF

* Simple Refox protection
* Don't work for UnFoxAll
* All comment lines must be present
* Line 4
* Line 5
* Line 6
* Line 7
l1 = LINENO(1)
IF l1 = 8
MESSAGEBOX("I'm OK")
ELSE
MESSAGEBOX("I'v been refoxed!")
ENDIF

Конечно же все эти трюки очень просто обнаружить - но с другой стороны, если программа достаточно массивна, и подобных трюков в ней понабросать в разных местах... То взломщику придётся как минимум пройти под отладчиком весь код - а это уже совсем иное дело по сравнению с примитивным "декомпилировал, нашёл строчку Demo version restrictions, убрал, скомпилировал снова"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Трюк с lineno я знал, и уже приводил
forum.foxclub.ru
а во втором примере, там что, Refox на точности представления чисел обламывается?
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привет Леонид!

Да, на точности - я сначала думал что для трюка потребуется бинарная модификация, а оно оказалось что и так можно "обмануть".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как обмануть Рефокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В продолжение темы:

Приложенный fxp работает совсем не так, как восстановленный с помощью Refox или UnFoxAll исходник.
Конечно же, довольно просто найти в чём тут дело - но это только если заранее знать, что декомпилятор обманут

2 Leonid - тоже неплохой жучок-закладка для защиты
[attachment 7795 a.zip]


------------------
WBR, Igor




Исправлено 2 раз(а). Последнее : Igor Korolyov, 05.04.09 17:51
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика