PDA

Просмотр полной версии : Быстрое самоуничтожение



Barmaley_m
21.09.2007, 01:10
Задача - как можно быстрее затереть содержимое памяти (чтобы хакер не успел нажать NMI).

Вот так решил ее ASC:

SELF_DESTRUCT:
LD DE,0D5D5H
LD HL,DESTRU
LD SP,HL
LD BC,-4
DESTRU:
PUSH DE
PUSH DE
ADD HL,BC
JP (HL)

Команды PUSH DE заполняют память кодами D5 (PUSH DE). С каждым проходом цикла команд PUSH DE становится все больше. Таким образом, память затирается практически непрерывной серией команд PUSH, которые на Z80 являются наиболее быстрым способом записи в память.

Можно заметить, что команд PUSH DE этим фрагментом генерируется больше, чем используется. Андрей Гетало (FOCAL Soft) придумал, как это оптимизировать:

SELF_DESTRUCT:
LD SP,DESTRU
LD DE,0D5D5H
DESTRU:
PUSH DE
LD HL,0
ADD HL,SP
JP (HL)

Теперь все коды D5 (PUSH DE), которыми заполняется память, выполняются при каждом последующем проходе цикла. Их количество растет экспоненциально (как 3^n). 64кб адресного пространства Z80 перетираются (если пренебречь последними командами цикла) за 32768*11 = ~360448 тактов. При частоте 3.5МГц это ~0,1 секунды.

Lethargeek
21.09.2007, 08:43
Прыкольно! Только для практической применимости (затереть только что отработавший кусок допустим защиты, "пока хакер не успел нажать NMI") нужно остановку предусмотреть. Типа dec+retz на #D5D5...

Barmaley_m
21.09.2007, 16:30
Этот фрагмент срабатывает только тогда, когда обнаружена чрезвычайная ситуация (например, код обработки NMI в ПЗУ бейсика нестандартный) - в этом случае приходится жертвовать работоспособностью программы ради защищенности :)

char
21.09.2007, 18:04
инструкции в DE занести POP'ом.

psndcj
21.09.2007, 20:37
может я и чайник - но почему бы не стирать PUSH'ами с конца подпрограммы? без всякого ADD.. быстрее же на порядок

himik
21.09.2007, 20:45
щас вспомню, блин, я уже и код то забыл, как команды правильно писать :)


ld sp,sux_1
sux_1 pop hl
ex (sp),hl

такты и прочее считайте сами, мну не помнит ни фига.

char
21.09.2007, 22:33
psndcj, расшифруй - что сказал?

himik, у тебя медленно (29 тактов на 2 байта) забивает вперед память и сбрасывается на 0 адресе пзу ;)

himik
21.09.2007, 23:20
psndcj, расшифруй - что сказал?

himik, у тебя медленно (29 тактов на 2 байта) забивает вперед память и сбрасывается на 0 адресе пзу ;)

зато коротко :)
в STS обман хорошо вставлять, пока страницу не обновишь при трассировке фиг увидишь подмену...

valeron
21.09.2007, 23:50
зато коротко :)
в STS обман хорошо вставлять, пока страницу не обновишь при трассировке фиг увидишь подмену...

Хитр! А главное - коварен!:v2_wink2:
Только к чему эти подстраховки если в эмуляторе, в том же Анрыле можно посмотреть все что хочешь и сохранить снапшот. В чем актуальность?

himik
21.09.2007, 23:54
Хитр! А главное - коварен!:v2_wink2:
Только к чему эти подстраховки если в эмуляторе, в том же Анрыле можно посмотреть все что хочешь и сохранить снапшот. В чем актуальность?

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

psndcj
23.09.2007, 19:53
ld sp,end_programma
ld hl,loop
loop push hl
jp (hl)

для скорости можно поставить в цикл не одеу команду push, а несколько
при необходимости можно выставить какоенить условие цикла (например счетчик)
ну и так далее

насчет варианта Химика - реально зачотное решение - то что медленно неправда (топикстартер медленнее раза в 2) а то что сбрасывается - дык опять же а что получится в результате работы первого метода?

char
23.09.2007, 21:18
ну и в чем оригинальность? обычный цикл.

а вот первоначальные варианты с самоускорением (самоувеличением числа PUSH'ей) - это зачот и быстрей всего ;)

Добавлено через 17 минут
...подытожим:

destrupko:
xor a
ld sp,loopko
pop de
loopko:
push de
push de ; при желании - можно и больше первоначальных push de
ld h,a
ld l,a
add hl,sp
jp (hl)

Barmaley_m
25.09.2007, 02:29
Количество первоначальных push большой роли не играет, так как мы имеем дело с геометрической прогрессией.

Для иллюстрации предлагаю решить следующую задачу.

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

Известно, что если поместить в стакан одну бактерию, то через минуту бактерии полностью заполнят стакан, так что дальше им размножаться будет некуда.

Вопрос: за какое время бактерии заполнят стакан, если их поместить туда сразу 2?

Vitamin
25.09.2007, 09:20
Вопрос: за какое время бактерии заполнят стакан, если их поместить туда сразу 2?
За то же самое минус фактическое время деления :)