domingo, 10 de novembro de 2019

Popeye - Crack (MIA)

Os leitores já foram apresentados ao Rui Ribeiro, seja pela sequência de artigos técnicos que já escreveu para o Planeta Sinclair (aqui, aqui, aqui e aqui), seja por ter sido o autor do WSpecEM, primeiro emulador de ZX Spectrum para o Microsoft Windows, seja também por termos noticiado aqui, em primeira mão, a criação do seu novo emulador QtSpecEm. O que muitos leitores talvez desconheçam, é que o Rui foi também um prolífico cracker, bastante activo nos anos 90, como o nosso blogue irmão, o Planeta MS-DOS já havia descortinado neste post.

Mas eis que o Rui passou ao Planeta Sinclair, um ficheiro .z80 que sobreviveu ainda antes dessa época, quando começou a crackar jogos do ZX Spectrum. O snapshot em questão, contêm um crack do jogo Popeye, realizado no ano de 1987. Detalhe curioso: o jogo crackado fora preservado através do TAPE2TAP, um utilitário escrito pelo próprio Rui em assembly 80x86, e que permitia digitalizar programas em cassete, recorrendo a um cabo próprio ligado à porta paralela (da impressora) de um PC.

Popeye com vidas infinitas e tempo ilimitado.

O crack permite vidas e tempo ilimitados, além de funções extras como gravar e imprimir em qualquer ponto do jogo. Não terá sido o único jogo que o Rui alterou ou acrescentou funcionalidades, mas é o único que guardou até aos dias de hoje.

Usando o MONS3 (já referido aqui) para dissassemblar à mão, o Rui quebrou as proteções do turbo-loader, fez o unroll de rotinas de encriptação e código auto-modificável, criou a rotina a ser acrescentada ao ciclo principal do jogo, e ainda implementou um menu de arranque para perguntar se o jogador quer vidas infinitas.

Menu de arranque.

O Rui também criou o loader Basic do crack, o qual podemos ver na listagem abaixo. Podemos reparar que o código-máquina está na primeira linha de REM (uma técnica que alguns ainda poderão se lembrar terem usado), bem como a rotina original que foi usada para gravar em fita, ou o uso VAL para poupar espaço.


Loader BASIC:
    
   0 REM >NOT 2iu> STEP 2]t£i[17])[0][25]"^t[17]Z[0][25] RESTORE FOR LLIST #s#r GO SUB {=\ LLIST MERGE NOT MERGE e[0][0] PRINT > FLASH RETURN [31][31]88 OR RESTORE MERGE INVERSE RESTORE >© FLASH RETURN [31]8[23] INVERSE !D][17][17][0]CODE STEP CHR$ [4]INVERSE ![0]@[17][0][27]> COPY STEP CHR$ [4]> RETURN FLASH RETURN [31]8[9] NEXT [6]USR ![0]@ STEP SIN LET ![26]t<>[3]POPEYE.IMG[0][27][0]@!S] RESTORE NOT Uf
  10 CLEAR VAL "25500": LOAD ""CODE 
  20 CLS : POKE 00000,5: PRINT "Craked by RFFR (c) 1987"''"'1' to start game with infinite    lives, unlimited time, save     screens(S/S+SPACE) and print    screens(S/S+C/S)"'"Press another key to start game": PAUSE NOT PI: IF INKEY$=" COPY " THEN POKE VAL "23736",VAL "20": SAVE "POPEYE" LINE VAL "10": POKE VAL "23736",VAL "20": SAVE "POP.COD"CODE VAL "26000",VAL "27100": GO TO VAL "20"
  30 IF INKEY$="1" THEN RANDOMIZE USR (PEEK (VAL "23635")+PEEK (VAL "23636")*VAL "256"+VAL "5")
  40 RANDOMIZE USR VAL "26069"
  

Tendo o Rui já crackado vários jogos, este foi o primeiro com menu, e assinado por ele. O jogo com o crack pode ser obtido aqui. A rotina de código-máquina pode ser consultada abaixo.


Rotina inserida no ciclo principal do jogo:

5CF9 F5 PUSH AF

5CFA 3E 0E LD A,0E

5CFC 32 B6 65 LD (65B6),A
5CFF 3E 7F LD A,7F

5D03 1F RRA
5D01 DB FE IN A,(FE)
5D04 1F RRA

5D08 E5 PUSH HL
5D05 38 38 JR C,5D3F
5D07 C5 PUSH BC
5D09 D5 PUSH DE

5D0E DB FE IN A,(FE)
5D0A DD E5 PUSH IX
5D0C 3E 7F LD A,7F
5D10 1F RRA
5D11 38 17 JR C,5D2A

5D1B CD C2 04 CALL 04C2 ; CALL SA_BYTES
5D13 DD 21 44 5D LD IX,5D44
5D17 11 11 00 LD DE,0011
5D1A AF XOR A
5D1E DD 21 00 40 LD IX,4000

5D2A 3E FE LD A,FE
5D22 11 00 1B LD DE,1B00
5D25 3E FF LD A,FF
5D27 CD C2 04 CALL 04C2 ; CALL SA_BYTES
5D2C DB FE IN A,(FE)
5D2E 1F RRA

5D3A DD E1 POP IX
5D2F 38 09 JR C,5D3A
5D31 F3 DI
5D32 06 C0 LD B,C0
5D34 21 00 40 LD HL,4000
5D37 CD B2 0E CALL 0EB2 ; CALL COPY_1
5D3C D1 POP DE

5D3D E1 POP HL
5D3E C1 POP BC
5D3F F1 POP AF
5D40 21 1A 74 LD HL,741A

5D43 C9 RET

Sem comentários:

Enviar um comentário