В отличие от стандартной процедуры загрузки, после детекта пилотирующего сигнала, ожидания и считывания синхроимпульсов, загрузчик защищенной программы СРАЗУ СЧИТЫВАЕТ ОДИН БИТ, значение которого, как мы видим, теряется, и только затем читает биты упаковками по 8 штук.Код:LD_SYNC: ld b, 0C9h call LD_EDGE_1 ; первый фронт синхроимпульса jr nc, LD_BREAK ld a, b cp 0D4h jr nc, LD_SYNC call LD_EDGE_1 ; второй фронт синхроимпульса jr nc, LD_ERROR ld b, 9Ch call LD_EDGE_2 ; (!) считывание бита ld h, 0 ld b, 0B0h jr LD_MARKER LD_ERROR: rst 0 LD_LOOP: ex af, af'
То есть логически на ленте биты записываются так:
1 12345678 12345678 ... 12345678
Что произойдет если попытаться загрузить их копировщиком? А вот что.
11234567 81234567 ... 81234567 8
Копировщик заранее не знает длину (в байтах) загружаемого блока. Поэтому огромный тайминг после последнего одиночного бита, который он воспримет за начало нового байта, будет для него настоящим сюрпризом.
Прикол в том, что если даже проигнорить эту ошибку (некоторые копировщики это умеют), и записать результат как есть, то копия все равно не будет работать. Потому что нормальные копировщики записывают целыми байтами.
11234567 81234567 ... 81234567
Прочитаем это загрузчиком защищенной прграммы.
1 12345678 12345678 ... 1234567X
То есть на последнем байте загрузчик не досчитается одного бита. Что с этого будет? См. метку LD_ERROR.![]()





Ответить с цитированием