Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

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

  1. #1
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

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

    Здравствуйте. Хочу понять принцип расксоривания части кода из пзу 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,4Ah,0Eh
           db   69h,69h,48h,09h,0Dh,18h,11h,01h,4Ah,0Eh,70h,22h,17h,16h
           db   00h,53h,72h,17h,16h,16h,11h,74h,54h,1Bh,4Fh,43h,0Ch,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 в 13:28.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    Какой ключ? При печати символ = предыдущий xor (hl).
    получается 0 xor 0d, 0d xor 16, 16 xor 0a и так далее?

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

    Под ключем имел ввиду содержимое аккумулятора.
    Последний раз редактировалось Andrey_K; 07.06.2015 в 13:48.

  4. #3
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    Почти:
    0 xor od=0d
    0d xor 16=1b
    1b xor 0a=11
    и т д
    Убивает сразу 2 зайцев, с нахрапу не найдешь строку в памяти и экономия 1 байт в цикле
    Почему тогда у меня указанный текст не получается?

  5. #4
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  6. #5
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А вот еще часть кода- технический дизассемблер ПЗУ 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?
    Последний раз редактировалось Andrey_K; 09.06.2015 в 03:06.

  7. #6
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,378
    Благодарностей: 717
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    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
    короче данных недостаточно для расшифровки
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

  8. Этот пользователь поблагодарил jerri за это полезное сообщение:
    Andrey_K (09.06.2015)

  9. #7
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    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?attac...1&d=1433853236
    Вложения Вложения
    Последний раз редактировалось Andrey_K; 09.06.2015 в 14:48.

  10. #8
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    add hl,hl ролит и h и l поэтому по факту все 16 бит используются, просто не все сразу а в цепочке.
    Переполнение L увеличивает H, разве нет? А куда денется переполнение H?

  11. #9
    Member
    Регистрация
    05.04.2015
    Адрес
    г. Владивосток
    Сообщений
    31
    Благодарностей: 10
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    переполнение в флаг С потом по условию в нулевой разряд L путем inc. Надеюсь понятно почему inc даст set 0,l ?

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

    http://www.z80.info/ и (мой не знаю почему любимый) http://clrhome.org/table/
    Я читаю, но все схватить сразу не успеваю...

  12. #10
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,378
    Благодарностей: 717
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrey_K Посмотреть сообщение
    Переполнение 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 ----------

    Цитата Сообщение от Andrey_K Посмотреть сообщение
    Я читаю, но все схватить сразу не успеваю...
    вот тут еще скачай и почитай
    растактовка - влияние на флаги и тд
    https://www.dropbox.com/s/bu9lbf0ns1...codes.a80?dl=0
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

  13. Этот пользователь поблагодарил jerri за это полезное сообщение:
    Andrey_K (12.06.2015)

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Нужна помощь
    от sevol в разделе Игры
    Ответов: 1
    Последнее: 28.07.2010, 22:00
  2. Нужна помощь
    от VNN_KCS в разделе Программирование
    Ответов: 78
    Последнее: 26.06.2010, 19:38
  3. Нужна помощь!!!!!
    от Alegator в разделе Unsorted
    Ответов: 2
    Последнее: 30.05.2010, 13:44
  4. нужна помощь!!
    от Subre Wulf в разделе Разное
    Ответов: 0
    Последнее: 15.11.2009, 23:32
  5. Помощь с оптимизацией кода
    от moroz1999 в разделе Программирование
    Ответов: 7
    Последнее: 02.06.2008, 12:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •