N-BR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Tutorial sobre Ponteiros

5 participantes

Ir para baixo

Tutorial sobre Ponteiros Empty Tutorial sobre Ponteiros

Mensagem  Kamppello Ter 15 Fev 2011, 13:47




INTRODUÇÃO


Para traduzir uma rom, "cujos dados não estejam comprimidos", basicamente você precisa abrí-la em um editor hexadecimal e pesquisar por alguma palavra que tenha visto no jogo. Ao localizá-la, você deve simplesmente trocar a palavra por alguma outra em português, porém esta palavra deve conter o mesmo número (ou menos) de caracteres que a original, caso insira mais espaços ali ou sobrescreva os dados posteriores, você irá danificar a rom.

O que deve ser feito para aumentar o tamanho de uma palavra ou frase, então?
A resposta para essa pergunta está na edição de ponteiros. Os ponteiros indicam onde algo (imagem, palavras/frases, música etc) irá iniciar, ou seja, para aumentar o espaço de uma palavra/frase basta alterar o local onde ela inicia, alterar seu ponteiro.
Exemplo básico:

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__P__R__E__S__S_____S__T__A__R__T__#__#__#__O__P__T__I__O__N__S__#__#__#

PRESS START (11 letras) = APERTE START (12 letras)
OPTIONS (7 letras) = OPCOES (6 letras)
# = EndString (ao contrário dos ponteiros, eles idicam o fim de algo, porém podem ser movidos livremente)
$ = significa que o número está em hexadecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e e f)

No início do exemplo temos uma sequência de números hexadecimais, suponhamos que eles sejam os offsets (posições em hexadecimal) dos caracteres abaixo deles, então poderiamos traduzir essa linha, conforme as traduções citadas acima.

00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__A__P__E__R__T__E_____S__T__A__R__T__#__#__#__O__P__Ç__Õ__E__S__#__#__#

Agora vamos analisar, a palavra APERTE START iniciava no offset $03 na frase em inglês, agora continua iníciando no offset $03, até ai nenhum problema. Porém a palavra OPÇÕES que iniciava no offset $11 passou a iniciar no offset $12, interpretando o comando da rom, logo a palavra OPÇÕES não irá aparecer quando a rom for emulada, pois seu ponteiro está dizento que ela inicia no offset $11, mas ela está iniciando no offset $12, em outras palavras ela esta programada para iniciar em cima de um endstring, ou seja está a palavra esta sendo inicianda e finalizanda no offset $11, por isso não aparecerá nada no jogo.
Para solucionar tal problema devemos editar o ponteito da palavra OPTIONS, somando $01, assim ela passaria a iniciar no offset $12.
Bom, acho que agora você já deve ter uma breve noção de como usar os ponteiros, se uma palavra iniciar depois da posição que iniciava a original, você deve adicionar essa quantidade de espaços ao ponteiro original e se ela iniciar antes você deve deduzir esse valor do ponteiro original.

Ponteiros são facéis de compeender, porém são complicados de trabalhar, pois os padrões de ponteiros das roms váriam de uma para outra, mesmo que sejam do mesmo tipo, logo cada rom deve ser tratada de forma destinta.

Nesse tutorial usarei a rom Pokémon Stadium 2. Está rom usa um tipo de Ponteiro conhecido como Ponteiro Relativo.


PONTEIROS RELATIVOS


O que são Ponteiros Relativos?
São ponteiros que buscam refrencia em diferentes áreas da rom, ou seja enquanto nos Ponteiros Absolutos a rom usa como referência o HEADER (cabeçalho, espaço acrescido no início da rom quando ela é dumpada do cartucho) para agrupar os ponteiros, nas Roms com Ponteiros Relativos a referência geralmente é o inicio do container (será explicado mais abaixo), além disso os containers também possuem ponteiros. Nesse tipo de ponteiro as palavras/frases não podem ser movidas para fora do container, uma das formas de aumentar os espaços dentro dos containers e movendo todo ele para outro local, o fim da rom por exemplo.

Depois de toda essa teoria, vamos partir para a prática. Mas antes você precisa saber o que é um container, container é a junção de um bloco de ponteiros com um bloco de texto, geralmente os ponteiros vem acima e os textos abaixo, as ROMs podem possuir um ou vários containers.

Analisar é a chave para trabalhar com ponteiros, então analisemos a imagem abaixo:

Tutorial sobre Ponteiros Modelodeponteiro1
Exemplo de ponteiro, container in-rom.

Analisando percebemos que os ponteiros dessa rom são de 4 bytess e que não estão invertidos, conforme os retangulos coloridos. Podemos localizar os ponteiros dentro de um container usando a seguinte fórmula: OFFSET DO INICIO DA PALAVRA/FRASE - OFFSET DO INÍCIO DO CONTAINER.

Outra forma de trabalhar com esses ponteiros, seria extrair todo o container, fazendo isso geralmente obtemos a seguinte:
OFFSET DO INICIO DA PALAVRA/FRASE - váriável
OFFSET DO INÍCIO DO CONTAINER - 0 (zero)
Ou seja, o offset das palavras/frases serão iguais ao seu ponteiro (invertido ou não)

Tutorial sobre Ponteiros Modelodeponteiro2
Exemplo de ponteiro, container extraído.

Tutorial sobre Ponteiros Modelodeponteiro3
Exemplo de ponteiro, container extraído.

Tutorial sobre Ponteiros Modelodeponteiro4
Exemplo de ponteiro, container extraído.

Só para não passar em branco, note que na primeira imagem tem uma retangulo azul envolvendo 4bytess, nas imagens abaixo temos os ponteiros da primeira palavra: $00000080, o da segunda: $00000086, o da terceira seria: $0000008b etc, note que a partir do ponteiro da primeira palavra, os ponteiros estão em ordem crescente, logo os primeiros 4bytess não são ponteiros, eles simplesmente indicam a quatidade de ponteiros em hexadecimal que possui o container $0000001f = 31 ponteiros. Mas isso é um detalhe da própria rom, pode ser que ocorra em outras também.


Agora que já sabemos manusear os ponteiros dentro do container, eles geralmente estão situados acima do primeiro container, nessa ROM eles estão entre os offsets 0x0d170010 e 0x01d714cf, o segredo para localizá-los é buscar alguma "padronização". Dentro dos containers os ponteiros estão organizados de 4 em 4bytess, de acordo com a primeira imagem, os ponteiros do container não serão tão diferentes, vamos analizar entre os endereços citados acima.

Tutorial sobre Ponteiros Modelodeponteiro5
Em vermelho temos o ponteiro do container e em azul o seu tamanho. Exemplo: ponteiro $00 00 14 c0, tamanho $00 00 0c 30

Note que há uma sequência de "bytess" padronizados, pois bem, estes são os ponteiros dos container, eles sempre apontam para o início dos containers.
Lembra que na primeira imagem o retangulo azul (primeiros 4 bytess) não eram ponteiros, nesse caso os ponteiros são formados por (4 + 4) bytess, os os primeiros 4 bytess (retangulos vermelhos) são ponteiros e o últimos 4 bytess (retangulos azuis) determinam o tamanho dos containers em hexadecimal, ou seja, se você aumentar ou diminuir o tamanho do container, será necessário adicionar ou subtrair essa mesma quantidade a esses 4 bytess.

Podemos usar a seguinte fórmula para trabalhar com esses ponteiros, mas para isso você precisar descobrir pelo menos o ponteiro de um container:
(Passo 1) Offset do inicio do container - Ponteiro do container = variável X
(Passo 2) Offset do início do container - variável X = Ponteiro do container

Se reparar bem verá que os ponteiros dos containers também estão em ordem crescente, isso significa que o primeiro ponteiro corresponte ao primeiro container. Vamos para a formula:

(Passo 1)
$01d714c0 - $000014c0 = $01d70000

(Passo 2)
$01d8c180 - $01d70000 = $0001c180

Observações:
$01d714c0 - offset do início do primeiro container (não postei uma imagem pois esse container é muito grande)
$000014c0 - é o primeiro ponteiro de container, conforme pode ser visto na imagem 5.
$01d70000 - corresponde ao resultado da variável X, o offset de início de qualquer container subtraido desse valor será igual ao ponteiro do mesmo.
$01d8c180 - offset de início do container utilizado na imagem 1.
$000014c0, $0001c180 - ponteiros de containers obtidos usando a fórmula acima.


PRATICANDO



OK, agora que já sabemos como os ponteiros da rom funcionam, vamos práticar um pouco:

Em breve...

To be continued! Tutorial sobre Ponteiros 146970


Última edição por Kamppello em Dom 17 Jul 2011, 07:51, editado 6 vez(es)
Kamppello
Kamppello
Administrador NBR
Administrador NBR

Masculino Mensagens : 927
Membro desde : 28/09/2010
Idade : 36
Cidade : Recanto das Emas
Brasil


http://nbr-traducoes.blogspot.com/

Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Ganondorf Ter 15 Fev 2011, 19:48

Opa... Entendi o esquema dos ponteiros... Vou precisar apenas dos offsets de início e fim dos textos e dos ponteiros (que você já disse que daria)... A rom e a sua tabela também... Não garanto nada, pois ainda vou fazer alguns testes... Sou noob ainda no python... Razz
Ganondorf
Ganondorf
Administrador NBR
Administrador NBR

Masculino Mensagens : 142
Membro desde : 16/10/2010
Idade : 39
Cidade : Maricá
Brasil


Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Ponteiros Relativos

Mensagem  Kamppello Ter 15 Fev 2011, 23:34

Tudo bem, mano Ganon.

Estou alterando este arquivo para que ele se pareça realmente com um tutorial. Do jeito que está, apenas quem já compreende o assunto irá entender.
Esse jogo possui quase 200 containers, em breve te passo os ponteiros deles.

A próposito, parabéns pela nova configuração do Fórum, ficou excelente, 10 X 0 na anterior. Exclamação
Kamppello
Kamppello
Administrador NBR
Administrador NBR

Masculino Mensagens : 927
Membro desde : 28/09/2010
Idade : 36
Cidade : Recanto das Emas
Brasil


http://nbr-traducoes.blogspot.com/

Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Vingdel Sáb 16 Jul 2011, 19:57

Olá Kamppello,

Legal o tutorial, vai ajudar os iniciantes que passarem por aqui, porém eu gostaria de indicar alguns acertos, um ocasionado talvez por CTRL+C/CTRL+V que é quando você diz: "[...] o da segunda: $00000080, [...]". O ponteiro "$00000086", coisa boba.

Outras coisa é quando você diz que os ponteiros são representados por 4 bits, está errado, são representados por 4 bytes, ou seja, 32 bits. Fazer confusão do que é bit e byte é complicado ainda mais se tratando de um tutorial, onde esses conceitos devem ficar bem claros. Você comete esse erro 10 vezes no tutorial, dê uma olhada nisso também.

Espero que minha crítica seja vista com bons olhos, abraço!

Vingdel
Membro NBR Novato
Membro NBR Novato

Masculino Mensagens : 4
Membro desde : 16/07/2011
Idade : 42
Brasil


Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Kamppello Dom 17 Jul 2011, 08:01

Com certeza. Sempre fiz essa confusão entre bit e byte e não é a primeira vez que você me avisa sobre isso, tem várias postagens minhas com esse mesmo erro aqui e no FUT. Tutorial sobre Ponteiros 460170
Obrigadão por ter se cadastrado no fórum e pelos reportes de erros... Exclamação
Kamppello
Kamppello
Administrador NBR
Administrador NBR

Masculino Mensagens : 927
Membro desde : 28/09/2010
Idade : 36
Cidade : Recanto das Emas
Brasil


http://nbr-traducoes.blogspot.com/

Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Quil Dom 17 Jul 2011, 12:05

Isso ai, mais gente se cadastrando no fórum e dessa vez foi alguém que se cadastrou para ajudar com sugestão Tutorial sobre Ponteiros 524179
Beleza é isso ai. Tutorial sobre Ponteiros 524179
Quil
Quil
Moderador NBR
Moderador NBR

Masculino Mensagens : 425
Membro desde : 06/12/2010
Cidade : At World's End.
Brasil


Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Vingdel Dom 17 Jul 2011, 15:13

Isso aí pessoal, continuem divulvando o trabalho de vocês. Alguns deixando a cena e outros iniciando para dar continuidade com o trabalho, o que importa é manter a qualidade e aprender cada vez mais sobre o que a gente gosta.

Não estou mais tão atuante no mundo do Romhacking, porém dou meus pulinhos vez ou outra, no que precisarem e eu puder ajudar farei com prazer.

Abraço e boas traduções a NINTENDO BR!

Vingdel
Membro NBR Novato
Membro NBR Novato

Masculino Mensagens : 4
Membro desde : 16/07/2011
Idade : 42
Brasil


Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  L-Slayer Seg 18 Jul 2011, 00:41

Valeu pelo incentivo Vingdel, também é legal saber que tem gente que acompanha nosso fórum.Apesar que ele é 99% dele usado pelos membros do grupo,para trocarem experiencias e ideias também. Mas é legal quando vem gente "de fora" e que se interessa.
E Kamppello, 1 byte são 8 bits, acho que não tem segredos para se lembrar disso, rs.Abraço!
L-Slayer
L-Slayer
Administrador NBR
Administrador NBR

Masculino Mensagens : 156
Membro desde : 28/09/2010
Idade : 33
Cidade : Mateus Leme
Brasil


Ir para o topo Ir para baixo

Tutorial sobre Ponteiros Empty Re: Tutorial sobre Ponteiros

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos