Просмотр полной версии : Быстрое самоуничтожение
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 в ПЗУ бейсика нестандартный) - в этом случае приходится жертвовать работоспособностью программы ради защищенности :)
инструкции в DE занести POP'ом.
может я и чайник - но почему бы не стирать PUSH'ами с конца подпрограммы? без всякого ADD.. быстрее же на порядок
щас вспомню, блин, я уже и код то забыл, как команды правильно писать :)
ld sp,sux_1
sux_1 pop hl
ex (sp),hl
такты и прочее считайте сами, мну не помнит ни фига.
psndcj, расшифруй - что сказал?
himik, у тебя медленно (29 тактов на 2 байта) забивает вперед память и сбрасывается на 0 адресе пзу ;)
psndcj, расшифруй - что сказал?
himik, у тебя медленно (29 тактов на 2 байта) забивает вперед память и сбрасывается на 0 адресе пзу ;)
зато коротко :)
в STS обман хорошо вставлять, пока страницу не обновишь при трассировке фиг увидишь подмену...
зато коротко :)
в STS обман хорошо вставлять, пока страницу не обновишь при трассировке фиг увидишь подмену...
Хитр! А главное - коварен!:v2_wink2:
Только к чему эти подстраховки если в эмуляторе, в том же Анрыле можно посмотреть все что хочешь и сохранить снапшот. В чем актуальность?
Хитр! А главное - коварен!:v2_wink2:
Только к чему эти подстраховки если в эмуляторе, в том же Анрыле можно посмотреть все что хочешь и сохранить снапшот. В чем актуальность?
ну это же не сию минуту придумано :)
я это из недр башни своей вытащил, давным давно, когда писюков еще столько не было, когда свопились софтом через снейл мейл, а интернет был чем-то заоблачным...
мы все разбирали в ручную в том же STS, и вот чтоб обходить таких умельцев мы делали разного рода защиты. Сей код кусочек защиты, троссируя которую на обычном реале, ты не замечаешь подвоха, а он есть :)
ld sp,end_programma
ld hl,loop
loop push hl
jp (hl)
для скорости можно поставить в цикл не одеу команду push, а несколько
при необходимости можно выставить какоенить условие цикла (например счетчик)
ну и так далее
насчет варианта Химика - реально зачотное решение - то что медленно неправда (топикстартер медленнее раза в 2) а то что сбрасывается - дык опять же а что получится в результате работы первого метода?
ну и в чем оригинальность? обычный цикл.
а вот первоначальные варианты с самоускорением (самоувеличением числа 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?
Вопрос: за какое время бактерии заполнят стакан, если их поместить туда сразу 2?
За то же самое минус фактическое время деления :)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot