PDA

Просмотр полной версии : Нужна помощь в расксорке части кода (ПЗУ atm turbo2)



Andrey_K
07.06.2015, 14:05
Здравствуйте. Хочу понять принцип расксоривания части кода из пзу ATM-2. Из исходных данных есть исходник на ассемблере и зашифрованная фраза. Не могу понять как формируется ключ для xor... Прошу не пинать ногами в живот, так как мои познания в данном вопросе крайне скудны.



;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; Protection
rom_chk::
ld bc,3fffh
xor a
ld h,a
ld l,a
rc_lp: add a,(hl)
adc a,0
inc hl
rrca
xor 0b9h
dec bc
ld d,a
ld a,b
or c
ld a,d
jr nz,rc_lp
dec a
ret z
ld a,r
ld l,a
ld h,0dch ; is BDOS adress
inc (hl)
and 7fh
ret nz
; Вот тут вроде A=0
ld hl,mes_rck ; загружаем шифросимвол
rc_plp:xor (hl) ; ксорим
inc hl ; след. символ?
call nz,conout ; А это вроде вывод на экран
jr nz,rc_plp ; повторяем
ld a,1
rst 18h
rc_hlt:ld hl,PAL_BUF
ld b,16
rc__1: inc (hl)
inc hl
djnz rc__1
call SET_PAL
ld b,25
ei
rc__2: halt
djnz rc__2
jr rc_hlt
mes_rck:
db 0Dh,16h,0Ah,58h,69h,43h,11h,13h,02h,08h,0Eh,01h,4A h,0Eh
db 69h,69h,48h,09h,0Dh,18h,11h,01h,4Ah,0Eh,70h,22h,17 h,16h
db 00h,53h,72h,17h,16h,16h,11h,74h,54h,1Bh,4Fh,43h,0C h,01h
db 1Ah,1Dh,07h,1Bh,10h,4Bh,00h,00h,2Eh
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Под db скрывается надпись "I cracked. I halted. Press RESET to continue..."
Прямым перебором ключа расшифровать текст не удается. Пытаюсь понять что я делаю не так...
Откуда появляется ключ в Аккумуляторе...

Andrey_K
07.06.2015, 14:45
Какой ключ? При печати символ = предыдущий xor (hl).

получается 0 xor 0d, 0d xor 16, 16 xor 0a и так далее?

Сам алгоритм не понятен.

Под ключем имел ввиду содержимое аккумулятора.

Andrey_K
07.06.2015, 15:17
Почти:
0 xor od=0d
0d xor 16=1b
1b xor 0a=11
и т д
Убивает сразу 2 зайцев, с нахрапу не найдешь строку в памяти и экономия 1 байт в цикле :)

Почему тогда у меня указанный текст не получается?

Andrey_K
07.06.2015, 18:21
Это риторический вопрос?
И почему у меня получается а у Вас нет? Прошагал 5 байт, получилась управляющих 3 байта и "I "... далее скорее всего по тексту.
Спасибо
:) я как раз до 3 и прошагал и решил что не то что то...

Andrey_K
09.06.2015, 04:04
А вот еще часть кода- технический дизассемблер ПЗУ ATM TURBO1. В нем, как и в ATM 2 с версией прошивки 6.4 часть информации (та что относится к cpm) заксорена. И алгоритмы похоже что одинаковые. Так вот я как раз и хочу расшифровать этот код и собрать нормальное ПЗУ. Кроме меня я так понимаю это мало кому интересно, а мои познания в ассемблере на двоечку :-)
Автор комментариев к этой части кода не я.

;- Блок процедур расксорки -
l1fba ld bc,#1b0f
l1fbd push bc
;Вызов последующих 2-х процедур в итоге приводит к возникновению
;неизвестного числа в HL
call l1fff ;вызов процедуры, формирующей неизвестное число в #5F74
call l2035 ;вызов процедуры, формирующей неизвестное число в HL
defb #2E,#03,#01,#01,#82,#00
ld c,#00
exx
pop bc
ld de,#d400 ;расксорка блока по адресу #22B3
ld hl,l22b3 ;для того, чтобы его расксорить нужно всего-лишь
l1fd4 ld a,(hl) ;знать код расксорки в HL, а это 65536 вариантов
exx
xor c
xor l
ld c,a
add hl,hl
jr nc,l1fdd
inc hl
l1fdd exx
ld (de),a
inc de
cpi
jp pe,l1fd4
ret


Если за ключ принять неизвестное число в HL (пусть будет KEY), обозначить искомый байт- XX, предыдущий расшифрованный-ZZ, а байт для дешифровки УУ получается следующая картина:
XX=((УУ)XOR(ZZ))XOR(n*KEY) где n увеличивается с каждым циклом на 1.
Ничего я не упустил?
Если я прав, то в комментариях к коду упоминание о 65 тыс вариантов не верно тк из HL используется только L?

jerri
09.06.2015, 10:04
Andrey_K, бро, давай я тебя процитирую


Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит

вот где листинг вот этих двух процедур?
call l1fff ;вызов процедуры, формирующей неизвестное число в #5F74
call l2035 ;вызов процедуры, формирующей неизвестное число в HL

вот это что такое?
defb #2E,#03,#01,#01,#82,#00

косяк или данные передаются через стек?


;- Блок процедур расксорки -
l1fba ld bc,#1b0f
l1fbd push bc
;Вызов последующих 2-х процедур в итоге приводит к возникновению
;неизвестного числа в HL

call l1fff ;вызов процедуры, формирующей неизвестное число в #5F74
call l2035 ;вызов процедуры, формирующей неизвестное число в HL
defb #2E,#03,#01,#01,#82,#00
;ld l,03 #2e03
;ld bc #8201 #010182
;nop #00
;скорее всего данные для ключа который формируется именно в l2035

ld c,#00 ;зануляем ключ С
;в HL вторая часть ключа
exx
pop bc ;количество байтов на расксорку - где задается?
ld de,#d400 ;адрес куда расксориваем блок
ld hl,l22b3 ;адрес откуда расксориваем блок

decr_l0 ld a,(hl) ;берем зашифрованные данные
exx

xor c
xor l
ld c,a
add hl,hl
jr nc,decr_1
inc hl
decr_1

exx
ld (de),a ;сохраняем расшифрованные данные
inc de
cpi
jp pe,decr_l0 ;крутим цикл пока в BC не будет 0

ret

короче данных недостаточно для расшифровки

Andrey_K
09.06.2015, 15:34
Andrey_K, бро, давай я тебя процитирую

:-)

вот где листинг вот этих двух процедур?
call l1fff ;вызов процедуры, формирующей неизвестное число в #5F74
call l2035 ;вызов процедуры, формирующей неизвестное число в HL

Листинг этих процедур я не стал приводить тут умышленно, чтобы акцентировать внимание только лишь на процедуре расксорки. По большому счету он ничего не даст, так как ключик получается аппаратно, по прерываниям микросхемы ХЛ8 (так называемый z сигнал, на котором и построена вся защита от копирования платы и который формируется крайне хитрым способом)

вот это что такое?
defb #2E,#03,#01,#01,#82,#00
косяк или данные передаются через стек?

Что это, если честно, я не знаю. Листинг с комментариями не мой...
А сам я пока не дошел, что это...

Так же не понял зачем в #5F74 формируется неизвестное число,- тут вроде не используется, может где в другом месте...



;- Блок процедур расксорки -
l1fba ld bc,#1b0f
l1fbd push bc
;Вызов последующих 2-х процедур в итоге приводит к возникновению
;неизвестного числа в HL

call l1fff ;вызов процедуры, формирующей неизвестное число в #5F74
call l2035 ;вызов процедуры, формирующей неизвестное число в HL
defb #2E,#03,#01,#01,#82,#00
;ld l,03 #2e03
;ld bc #8201 #010182
;nop #00
;скорее всего данные для ключа который формируется именно в l2035

ld c,#00 ;зануляем ключ С
;в HL вторая часть ключа
exx
pop bc ;количество байтов на расксорку - где задается?
ld de,#d400 ;адрес куда расксориваем блок
ld hl,l22b3 ;адрес откуда расксориваем блок

decr_l0 ld a,(hl) ;берем зашифрованные данные
exx

xor c
xor l
ld c,a
add hl,hl
jr nc,decr_1
inc hl
decr_1

exx
ld (de),a ;сохраняем расшифрованные данные
inc de
cpi
jp pe,decr_l0 ;крутим цикл пока в BC не будет 0

ret

короче данных недостаточно для расшифровки

;количество байтов на расксорку - где задается?
Разве не в самом начале?
l1fba ld bc,#1b0f
l1fbd push bc

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

Полный текст кода:
http://zx-pk.ru/attachment.php?attachmentid=52451&stc=1&d=1433853236

Andrey_K
09.06.2015, 15:41
add hl,hl ролит и h и l поэтому по факту все 16 бит используются, просто не все сразу а в цепочке.

Переполнение L увеличивает H, разве нет? А куда денется переполнение H?

Andrey_K
09.06.2015, 15:54
переполнение в флаг С потом по условию в нулевой разряд L путем inc. Надеюсь понятно почему inc даст set 0,l ?

Я конечно рад помочь новичку, но правда надо немного почитать, такие вещи должны пониматься на автомате.

http://www.z80.info/ и (мой не знаю почему любимый) http://clrhome.org/table/

Я читаю, но все схватить сразу не успеваю...

jerri
09.06.2015, 15:59
Переполнение L увеличивает H, разве нет? А куда денется переполнение H?


xor c
xor l
ld c,a
add hl,hl
jr nc,decr_1
inc hl
decr_1

ммм?

уйдет во флаг С


имеем
C HL
0 10000000 0000000

add hl hl
C HL
1 00000000 0000000

jr nc....
inc hl

C HL
1 00000000 0000001



считаем скорость - заодно отсекаем дебаггеры и прочее

на самом деле

│INC HL │23 │- - - - - -│ 6│

не более 70000/6 = 12000


;Процедура установки прерываний для расксорки
l1fe6 di ;запрещение прерываний
pop hl ;берем адрес возврата в HL
ld a,#03 ;вкл. 3-ю страницу
rst #18
push af ;сохраняем номер предыдущей
ld bc,(#f9ff) ;берем старый вектор прерываний (I=#F9)
push bc ;сохраняем его
ld bc,l201c
ld (#f9ff),bc ;устанавливаем его на адрес #201C
push hl ;восстанавливаем адрес возврата
ld hl,#0001 ;HL=1
im 2 ;второй режим прерываний
ret ;возврат


l1fff call l1fe6 ;вызов процедуры установки прерываний
ei ;вкл. прерывания
halt ;ждем прихода прерывания
ld b,#14 ;пропускаем несколько тактов
l2006 djnz l2006
or a ;очищаем флаг C
ei ;вкл. прерывания (пропускаем еще 4 такта)
l200a inc hl ;в цикле увеличиваем HL на 1, пока не придет прерывание
jr nc,l200a
ld (#5f74),hl ;сохраняем HL по адресу #5F74
;Процедура восстановления старого режима прерываний
l2010 di ;запрещаем прерывания
im 1 ;устанавливаем 1-й режим
pop de ;берем из стека старый вектор прерывания
ld (#f9ff),de ;восстанавливаем его
pop af ;восстанавливаем страницу памяти
rst #18
ei ;прерывания вкл.
ret ;возврат
l201c scf ;обработчик прерываний для расксорки
ret ;он просто сигнализирует о приходе прерывания


;проверяем состояние портов



;Хитрая процедура, формирующая в HL неизвестное число
l201e call l1fe6 ;вызов процедуры установки прерываний
ld hl,#0001 ;HL=1
ei ;вкл. прерывания
halt ;ждем прерывания
nop ;пропуск 4 такта
l2027 dec de ;уменьшаем DE до тех пор, пока DE не станет равным 0
ld a,d
or e
jr nz,l2027
l202c in a,(#fe) ;читаем порт #FE
add a,a ;A=A+A
adc hl,hl ;HL=HL+HL+C
jr nc,l202c ;выполняем до тех пор, пока HL не переполнится
jr l2010 ;или не возникнет прерывание и возврат


l2035 pop hl ;в HL адрес возврата
ld e,(hl) ;E=#2E
inc hl
ld d,(hl) ;D=#03
inc hl
push de ;#032E в стек
ld e,(hl) ;E=#01
inc hl
ld d,(hl) ;D=#01
inc hl
ld c,(hl) ;C=#82
inc hl
ld b,(hl) ;B=#00
inc hl
ex (sp),hl ;адрес возврата в стек, HL=#032E
bit 4,(ix+#35) ;проверка бита 4 #5F40+#35=#5F75
jr z,l201e ;а это старший бит неизвестного слова в #5F74
ex de,hl ;если bit4(#5f74)!=0, то HL<>DE
push bc
call l201e ;вызов еще одной хитрой процедуры
pop bc
add hl,bc ;HL=HL+BC
ret ;возврат


короче набор программ критичных к железу

---------- Post added at 16:59 ---------- Previous post was at 16:58 ----------


Я читаю, но все схватить сразу не успеваю...

вот тут еще скачай и почитай
растактовка - влияние на флаги и тд
https://www.dropbox.com/s/bu9lbf0ns1adxar/Z80opcodes.a80?dl=0

Andrey_K
12.06.2015, 17:21
Спасибо всем за помощь, код подобран, ПЗУ расшифрована, знаний прибавилось :-)