Este é o leitor! Aprendendo a hackear e escrever fraudes em um exemplo simples - "hacker"

Jogos de computador abrem nossos novos mundos. E o mundo das fraudes é um deles. Hoje vamos passar o caminho da teoria de praticar e escrever sua própria fraude. Se você quiser aprender a hackear arquivos executáveis, ele pode se tornar um bom exercício.

Tipos de fraudes e táticas usadas

Existem diferentes tipos de fraudes. Você pode dividi-los em vários grupos.

  • Externo - Cheats externos que funcionam em um processo separado. Se escondermos nossa trapaça externa, baixando-a em memória de outro processo, ele se transformará em Escondido externo .

  • interno - Cheats internos, que são incorporados no processo de jogo usando o injetor. Depois de baixar na memória do jogo em um encadeamento separado, o ponto de entrada é a entrada.

  • Pixelscan. - Vista de cheats que usa a imagem da tela e os padrões de localização de pixel para obter as informações necessárias do jogo.

  • Proxy de rede. - Cheats que usam proxies de rede, esses, por sua vez, interceptam o tráfego de clientes e o servidor, recebendo ou alterando as informações necessárias.

Existem três táticas principais modificando o comportamento do jogo.

  1. Alterar memória do jogo. A API do sistema operacional é usada para pesquisar e alterar as seções de memória contendo as informações necessárias (por exemplo, vida, cartuchos).
  2. Ações de jogador Simulação: O aplicativo repete as ações do jogador pressionando o mouse em locais avançados.
  3. Interceptação do jogo de tráfego. Há uma fraude entre o jogo e o servidor. Ele intercepta os dados coletando ou alterando as informações para enganar o cliente ou servidor.

A maioria dos jogos modernos é escrita para o Windows, então os exemplos que faremos por ela.

Nós escrevemos um jogo em c

Sobre as fraudes são melhor falando na prática. Vamos escrever nosso pequeno jogo em que podemos praticar. Vou escrever um jogo no C #, mas tentarei trazer a estrutura de dados para o jogo C ++ o mais próximo possível. Na minha experiência, é muito simples na minha experiência nos jogos C #.

O princípio do jogo é simples: pressione enter e perder. Não são regras particularmente honestas, sim? Vamos tentar alterá-los.

Vamos prosseguir para engenharia reversa

Arquivo de jogo executável.
Arquivo de jogo executável.

Nós temos um arquivo de jogo. Mas em vez do código-fonte, estudaremos a memória e o comportamento do aplicativo.

Vamos começar com o comportamento do jogo
Vamos começar com o comportamento do jogo

Cada vez que a vida do jogador é pressionada por 15. O número inicial de vidas é 100.

Vamos estudar memória usando motor de fraude. Esta aplicação é procurar variáveis ​​dentro da memória do aplicativo e um bom depurador. Reinicie o jogo e conecte-se a enganar o motor.

Conexão CE ao jogo
Conexão CE ao jogo

Primeiro de tudo, recebemos uma lista de todos os valores. 85. em mente.

Todos os significados que CE encontrou
Todos os significados que CE encontrou

Pressione ENTER, e o indicador de vida será igual 70. . Diga todos os valores.

Significado encontrado
Significado encontrado

Esse é o valor desejado! Altere e pressione ENTER para verificar o resultado.

O valor é alterado
O valor é alterado
Jogo de tela depois de pressionamos entrar
Jogo de tela depois de pressionamos entrar

O problema é que depois de reiniciar o jogo, o valor será em outro endereço. Cada vez que não faz sentido todas as vezes. Você deve recorrer à varredura do AOB (matriz de bytes - uma matriz de bytes).

Com cada nova abertura da aplicação devido à randomização do espaço de endereço (ASLR), a estrutura descrevendo o jogador estará em um novo lugar. Para encontrá-lo, você deve primeiro detectar a assinatura. A assinatura é um conjunto de bytes não variados na estrutura do qual você pode pesquisar na memória do aplicativo.

Depois de vários cliques na entrada, o número de vidas mudou para 55. . Vamos encontrar o valor desejado na memória e abrir a região no qual está localizado.

Região de memória.
Região de memória.

Byte destacado e há o começo do nosso Int32. -Esta. 37 00 00 00 - Número 55. Em forma decimal.

Vou copiar uma pequena região de memória e inserir em um notebook para outro estudo. Agora reinicie o aplicativo e encontre o valor na memória novamente. Copie a mesma região de memória novamente e insira-a no notebook. Vamos começar a comparar. O objetivo é encontrar bytes ao lado desta assinatura que não mudará.

Nós começamos a comparar bytes
Nós começamos a comparar bytes

Verifique os bytes na frente da estrutura.

Bingo!
Bingo!

Como você pode ver, os bytes dedicados não mudaram, significa que você pode tentar usá-los como assinatura. Quanto menor a assinatura, mais rápido a varredura passará. Assinatura 01 00 00 00 Será claramente muitas vezes para se encontrar em memória. Melhor levar 03 00 00 01 00 00 00 . Para começar a encontrá-lo na memória.

Assinatura não é única
Assinatura não é única

A assinatura foi encontrada, mas é repetida. Uma sequência mais exclusiva é necessária. Tentar Ed 03 00 00 01 00 00 00 .

Na confirmação da singularidade, obtemos tal resultado:

Assinatura é única
Assinatura é única

Precisamos encontrar um retiro de assinatura para obter seu endereço inicial, e não o endereço da vida. Enquanto retém a assinatura e adiar por um tempo. Não se preocupe, vamos voltar para ela.

Ciclo de vida externo

Usando uma função Openprocess. , Cheats externos recebem uma alça para o processo desejado e faça as alterações necessárias no código (patch) ou ler e alterar as variáveis ​​dentro da memória do jogo. Funções de funções usadas ReadProcessMemory. и Writeprocessmemory. .

Como a colocação dinâmica de dados na memória impede que você queime os endereços desejados e contate-os constantemente, você pode usar técnicas de pesquisa do AOB. O ciclo de vida externo - Chy parece com isso:

  1. Encontre o ID do processo.
  2. Obtenha uma alça para este processo com os direitos certos.
  3. Encontre endereços na memória.
  4. Poss algo se necessário.
  5. Recipe a GUI se estiver disponível.
  6. Leia ou altere a memória conforme necessário.

Continuação disponível apenas para os participantes

Opção 1. Junte-se à comunidade "XakeP.ru" para ler todos os materiais no site

A associação na comunidade durante o período especificado irá abrir o acesso a todos os materiais "hacker", permitirá que você baixe problemas para PDF, desative a publicidade no site e aumentará seu desconto de acumulação pessoal! Mais detalhes

Opção 2. Abra um material

Interessado o artigo, mas não é possível se tornar um membro do clube "XakeP.ru"? Então esta opção é para você! Preste atenção: Este método é adequado apenas para artigos publicados há mais de dois meses. Eu já sou membro de "xakep.ru"

É hackear jogos online

Hoje, muitas pessoas estão interessadas em jogos. As conquistas virtuais são muitas vezes gozadas não apenas na Internet, mas também na companhia de amigos reais. Ao contrário dos jogos estacionários, toda a passagem pode levar várias horas, o desenvolvimento em aplicativos de rede pode não estar limitado a nada, e para novos níveis terá que passar dias inteiros. Portanto, muitos estão interessados É hackear jogos online .

Alterar dados em jogos de computador pode usar códigos secretos ou programas especiais, no entanto, os aplicativos on-line armazenam todas as informações no servidor e é necessário resolvê-lo para editá-lo, portanto, esse método não é adequado. Teoricamente, nenhuma restrição ao hacking não existe, mas os sistemas de segurança modernos são muito confiáveis ​​e contornando-os extremamente difíceis. Na maioria das vezes, os bots que automatizam alguns processos de jogos são usados ​​para a fraude de vários indicadores.

Tal atividade pode causar suspeitas quando o motivo da resposta da administração pode seguir. Se o hacker informar os desenvolvedores sobre o erro, nenhuma punição será, pelo contrário, às vezes é recompensada por isso. Mas no caso do uso da vulnerabilidade para fins pessoais, a conta de hackers será definitivamente bloqueada. Quando o hacking infligiu os donos do dano do material do jogo, por exemplo, o aplicativo foi inexperiente por algum tempo, então o hacker pode esperar uma alegação judicial com a exigência de compensação de danos. A punição para o uso de bots pode diferir: do mais suave - a remoção de todos os pontos ganhos dessa maneira, para o bloqueio eterno da conta sem o direito de recorrer.

sub_xxxxxxxx.

Muitas vezes, na internet, você pode ver anúncios para hackear programas que podem ser baixados gratuitamente. Muito provavelmente, os vírus estão se escondendo atrás deles, que buscam tomar posse de informações pessoais do usuário, ou fazer alterações na operação do computador, por exemplo, enviar spam de seu endereço. Moda universal. Games Online de Proteção Overcast Não há, se o jogo puder ser hackeado, então não deve estar on-line e offline e tal prog, a propósito, como um programa de hacking games artmani pro pode lidar com isso facilmente.

Outra maneira de decepção é vender tais aplicações, é claro, eles não funcionam e bem, se não precisarem inserir nenhuma senha. Não confie nas capturas de tela, que retratam números impressionantes, na maioria das vezes elas são processadas em um editor gráfico.

Hacking jogos online no computador:

", o tempo gasto no hacking da aplicação cresceria às vezes. Ficarei feliz em ouvir a resposta nos comentários.

Jogos on-line na maioria dos casos têm sua própria proteção contra cheat artmani trapaceiros ou chitanin, muitos conhecem EAC (fácil fraude anti), quando você inicia um jogo licenciado, o defensor iniciará primeiro o jogo. Se você estiver seriamente configurado para fraudes e encontrar publicamente disponível, você pode proibir o sistema de proteção, não para colocar no jogo, estragar a reputação em vapor e TD. Se você tiver que usar fraudes que o dinheiro privado que custa, e mesmo mesmo estes às vezes déficit.

Hacking Jogos Substituindo Savors (Salvando):

A opção com a substituição da preservação é interessante, uma vez que a proibição não é possível, exceto que você mesmo não se queima e não será predominante, você pode queimar itens exclusivos em jogos que são emitidos para a execução de uma coisa em certo períodos de tempo ou serpentinas. Substituir salva apenas provado com a compreensão do que você faz.

Este método pode não funcionar como jogos online populares transferir gradualmente salva para os jogadores para seus servidores e substituir a poupança no computador não substituirá salvar os servidores, pois eles são sincronizados durante o jogo.

Graças àqueles que leram até o fim.

Use uma ligeira vantagem no local de hacking games:

Use uma ligeira vantagem, muitos usam este método, já que é seguro, o que é isso?

É na mudança de gráficos, geralmente no jogo on-line de gráficos e fps (CL-in quadros por segundo) têm a vantagem sobre os jogadores que estão todos no FPS máximo e até médio. REACÇÃO REACÇÃO Mais REACTO OU SOFL, melhor revisão se não houver efeitos visuais distrativos (fumaça, fogo, chuva, salpicos de poeira e assim por diante.)

Em muitos jogos online, um conjunto limitado de mudanças gráficas no jogo, mas na maioria dos casos você pode alterar alguns parâmetros gráficos através dos arquivos de configuração do mecanismo de jogo. Aprenda que motor é seu jogo online, arquivos de configuração do Google para alterar os gráficos. Existem configurações muito legíveis, como acelerar as ações (speedhack) ou ver através de algumas partes da textura. A coisa mais interessante para isso não será banida se apenas você obviamente não mostre ninguém e ele se queixa de você aos desenvolvedores.

Sobre erros gramaticais ou ortográficos, por favor escreva em um pessoal.

Hacking jogos online no Android:

A repartição desses jogos é possível, mas tudo é possível individualmente, mas o fato de ser a raiz de direitos e programas para encontrar valores em aplicativos. Os usuários do PC conhecem o programa ArtMoney e Cheat Engine, esses programas estão no Android. Obtendo Ruth Direita para cada dispositivo individualmente, você precisa pesquisar na pesquisa especificamente obter direitos no seu dispositivo. Eu gosto do programa androyd Game Guardian. иGamecih. Você pode baixá-los na marca Markete.

Sobre técnico lógico ou grosseiro - melhor nos comentários.

Qual é o truque de hackear jogos online no Android:

Jogos on-line populares valores básicos, como o valor de moedas ou diamantes são mantidos em seus servidores e quando você altera os valores localmente em seu Android usando os programas descritos acima, ao atualizar, eles são sincronizados on-line e o valor será exibido do servidor, pessoalmente enfrentado como um exemplo de tubarão faminto.

Há uma saída e há uma maneira de hackear jogos online no Android:

Este método que eu usei pessoalmente com o jogo que mantém os principais valores em seus servidores, você pode usar este exemplo, eu não tentei quebrar os jogos on-line dos outros apenas um, não havia uma finalidade específica.

E então o que é dessa maneira especial?

Tudo engenhoso simplesmente, fui a outra maneira de alterar os valores usando os programas acima descritos e não os valores básicos e aqueles que me mudaram o saldo principal.

Exemplo:

Todos os dias, a entrada é dada 1000 moedas às vezes mais, ou para algum tipo de missão diária, quando a recompensa é dada para tais méritos, esses alertas têm sua própria janela com várias moedas, tente alterar esse valor e quando você clica Aceite a recompensa para os números de local nomeados na balança serão creditados tanto quanto você precisar.

Outro exemplo, custa 500.000 moedas, procurando por esse valor no jogo não há muitos deles, após a triagem permanecer, por exemplo, 10 valores. Alterar tudo por 1, alterar a guia, por exemplo, reimpresso em outro item de tubarão e voltar a figura deve ser atualizada ou tentar comprar. Assim, você pode comprar um assunto de custo muito menor do que declarado)) no momento, é absolutamente todos os valores nos servidores de jogos problemáticos e os desenvolvedores são armazenados apenas importantes e Wigble.

Demonstração do jogo de hacking para Android que sincroniza a poupança

SEGURANÇA1.

Se você quiser hackear o jogo no seu telefone ou tablet, então você está no caminho certo. Neste artigo, vamos dizer-lhe em detalhes sobre como e o que pode hackear o jogo no dispositivo Android. Esta questão está preocupada com muitos usuários, o que não é surpreendente - os preços de compra da moeda intra-cartão são muitas vezes sem razão.

Como hackear o jogo

Na verdade, hackear o jogo para o Android é simples o suficiente. Mas, para isso, você precisará da ajuda de programas especiais (aplicativos), que são duas espécies:

  1. A primeira vista permite que você faça compras gratuitas nos jogos. Esta é a maneira mais fácil, uma vez que não requer ações complexas. Ocorre um hacking usando um aplicativo que pode ignorar a licença da licença do mercado de placa e substitua os dados ao pagar dentro do jogo.
  2. O segundo tipo altera o número de moeda de jogos. Esse tipo de hacking é mais complicado, pois você precisa encontrar e alterar manualmente os valores numéricos necessários. Mas quando você aprende e entende o processo, você pode hackear todos os jogos em alguns minutos.

1418959276_vzlom_password.A maioria dos programas para o Hacking Games funciona Se você tiver direitos de root no dispositivo, o que é e como obter a raiz do direito é descrito no artigo 10 Programas para obter direitos de raízes.

Também vale a pena notar que apenas jogos offline (não exigindo acesso à Internet) pode ser hackeado no Android e é quase impossível hackear jogos on-line, como clash de clãs, jogo de guerra, praia de boom e assim por diante. Isso se deve ao fato de que todos os programas de hackers tornam a substituição de dados dentro do próprio dispositivo, e os jogos on-line são armazenados no servidor e não no dispositivo. Se você conseguir hackear um jogo online, então provavelmente depois de se conectar aos dados do servidor será restaurado para os valores anteriores ou você acabou de obter proibição.

Backup-224x168.

Hacking Games sem direitos de raízes

Apresentado nesta seção do programa permite que você corte sem direitos de raízes. O menos dessas aplicações é que a lista de jogos suportados é limitada e geralmente apenas um brinquedo simples com proteção fraca.

Clip2net_180317190629.

1. Creehack.

O aplicativo para hackers de jogos sem direitos de raiz com os quais você pode fazer compras gratuitas. No momento, Krikhak suporta cerca de 100 jogos, entre eles e luta de sombra 2 (v1.7.0). Mas tenha em mente que o programa não é atualizado há muito tempo e o desenvolvedor anunciou o término do apoio, então o Krikhak pode não criar novos jogos.

Instrução:

  1. Desconecte o Google Play e o Google Services nas configurações clicando em "Stop Process".
  2. Em seguida, desconecte a Internet ou o Wi-Fi.
  3. Em seguida, lançamos o Cryhak e gire ou pressionamos o botão "ON" para ativar o hacking (em algumas versões, a ativação ocorre na inicialização).
  4. Entramos no aplicativo e fazemos qualquer compra na loja, se você ver a inscrição - hacking funcionou, então Creehack funcionou de acordo.

5649FF37B35AA02511FD37.Download Creehack.

Tudo é livre

2. Editor APK.

Um aplicativo bastante poderoso para editar e hackear arquivos APK. Permite alterar o conteúdo do APK: Linhas de localização, substitua as imagens do plano de fundo, layout da arquitetura e até mesmo excluir publicidade. Duas versões do Editor APK estão disponíveis no Play Markete - pago versão pro e gratuitamente.

5649FF37B35AA02511FD37.Baixe o APK Editor.

Hacking jogos com direitos de raiz

Ao contrário da seção anterior, são coletados programas mais poderosos, para cujo trabalho você precisará da raiz dos direitos.

Atenção

3. liberdade

Um programa bem conhecido que permite que você faça compras gratuitas online Android Games. O aplicativo substitui o servidor de autorização e emula a compra como um real. E se você disser mais fácil, a Frida cria uma placa virtual, com a qual você paga gratuitamente em aplicativos.

Instrução:

  1. Instalar e executar a liberdade.
  2. Clique no botão Iniciar nas configurações.
  3. Em seguida, abra qualquer jogo e faça compras.
  4. Observe que, quando você compra uma pequena janela com informações sobre sua conta deve ser aberta, e a conta deve ser um mapa com o nome: FreeCard XXX- ... - em vez de sua placa real. Hacking Games para Android
  5. Depois de iniciar, a Frida pode parar temporariamente a trabalhar no Google Play até você clicar no botão Parar nas configurações. Quando você tenta ir ao jogo, a lâmpada aparecerá "sem conexão". Antes de excluir aplicativos, você precisa pressionar a cópia de parada.

5649FF37B35AA02511FD37.Baixar liberdade

Creehack.

Killer 4.Game

Um dos programas mais populares para hackear jogos a valores numéricos (moedas, ouro, cristais, etc.). O jogo Killer trabalha quase com todos os jogos populares, é claro, além de online.

Instrução:

  1. Instale e execute o Gamekiller, depois desligue.
  2. Nós vamos para o jogo que você precisa cortar.
  3. Abra o jogo Killer, clicando no ícone Chave no canto, escolha o que você deseja hackear, por exemplo, insira o número atual de moedas na string de pesquisa de programa.
  4. Agora altere o valor para isso no aplicativo que você precisa para fazer alguma ação, por exemplo, para comprar algo (de alguma forma, o principal é que a quantidade não é = 0).
  5. Em seguida, ligue novamente uma pesquisa no jogo Killer em um valor alterado (por exemplo, você tinha 100 moedas, 20 gastas - procurando por 80).
  6. Como regra geral, o programa lhe dará 1-2 resultados, se tudo acontecesse - os mudamos para o necessário (por exemplo, 9999999).
  7. Se o programa emitiu muito mais resultados, você precisará repetir as etapas 4 e 5.

Instrução de vídeo Hacking Games com Gamekiller.

5649FF37B35AA02511FD37.Baixar o jogo Killer.

Download

5. Gamecih.

Altera os valores da moeda do jogo, analógico do assassino do jogo, então a instrução é a mesma.

Descrição do processo:

  1. Faça o download e execute Gamecih e, em seguida, afaste-o.
  2. Execute o jogo que você deseja hackear.
  3. O jogo aberto Qich, escolha o que exatamente você quer hackear, por exemplo, cristais, para isso, escreva o número atual de cristais na pesquisa do programa.
  4. Agora, mude esse número, pois isso você precisa fazer qualquer ação no jogo, por exemplo, comprar algo (o principal é que o número é mais zero).
  5. Então voltamos novamente a pesquisa em Gamecih de acordo com o valor editado (por exemplo, você tinha 150 moedas, 50 gastos - procurando 100)
  6. Normalmente, o programa dá 2-3 resultados, se aconteceu, alteramos esses números por conta própria (por exemplo, 9999999999).
  7. Se os resultados forem mais, repocemos os passos 4-5.

5649FF37B35AA02511FD37.Download do jogo cih.

Editor APK.

6. Jogos XMOD.

Aplicativo Universal para simplificar o processo em jogos online, modificando-os. A popularidade dos XModGames recebeu principalmente devido aos jogos de confrontos de Klence e Boom Beach, definindo o plugin que você pode personalizar a busca pelo inimigo com a quantidade desejada de recursos, bem como ativar a função "sempre online". O aplicativo XMOD é constantemente atualizado e novos mods são adicionados a ele.

5649FF37B35AA02511FD37.Baixe o XModGames.

Liberdade

7. Lucky Patcher.

Aplicativo Patcher Android, com as funções de clippings de publicidade e verificação de licença. Lucky Palcher pode digitalizar e fazer patches, mudar e expandir seu funcionário para seus jogos ou aplicativos. Além disso, o Lucky Patcher tem uma função de verificação de licença, que permite executar versões "pirateadas" de aplicativos, ignorando as limitações e algoritmos de proteção. Recentemente, o patcher tem a oportunidade de substituir o mercado original do Google Play em um mercado hackeado.

Funções:

  1. Fazendo compras gratuitas em jogos.
  2. Excluir verificação de licença.
  3. Desativar publicidade.
  4. Salvando arquivos APK de aplicativos instalados.
  5. Implementando patches em aplicativos e sistema.
  6. Crie cópias apk com alterações.
  7. Aplicações de clonagem (para lançar simultaneamente duas cópias).

5649FF37B35AA02511FD37.Baixar patchador de sorte.

Compra gratuita no jogo

8. Game Guardian.

Um aplicativo para hackear jogos em valores numéricos, com um conjunto estendido de filtros e a função de aceleração ou desaceleração dos jogos. Game Guardian é um análogo de hackers anteriores, então a instrução e o processo de hackear exatamente o mesmo.

5649FF37B35AA02511FD37.Baixar Game Guardian.

Gameskiller.

9. Jogo Hacker.

Outro hacker de jogos, de um desenvolvedor chinês que hackeia quaisquer valores ou experiência numéricos. O aplicativo Hacker App também é um análogo dos anteriores, portanto, o princípio da hacking é o mesmo - jogar, obter moedas, então procure esse valor através do hacker do jogo e mude para o necessário.

5649FF37B35AA02511FD37.Baixe o jogo Hacker.

Jogo cih.

10. Cheat Engine.

Com este programa, você pode alterar quase todos os parâmetros do jogo, como o número de moedas, cristais ou características do caractere. Muitos usuários estão familiarizados com o nome do motor de fraude, graças ao qual os jogos para PC foram usados. A versão do smartphone também tem um bom conjunto de funções capazes de competir com a maioria dos análogos. O aplicativo quebra quase todos os brinquedos instalados no seu dispositivo Android.

5649FF37B35AA02511FD37.Baixar motor de fraude

X-mod.E com que programa você é hackear jogos você? Compartilhe sua opinião, deixando um comentário na parte inferior da página, talvez sua mensagem seja útil e o ajudará a decidir sobre a escolha de outros usuários.

Patchador de sorte.

Cansado de coletar moeda de jogos, recursos? Não quer gastar tempo em tedioso do mesmo tipo? Então você será útil para aprender a hackear jogos de Android online.

Hacking Online Games Android não é fácil, mas bastante viável se você ler o material definido neste artigo.

Descrições técnicas

Hacking será baseado nas características da troca de dados entre os jogos Android do usuário on-line e o servidor de jogos. A interação entre este último ocorre com a ajuda de solicitações. Usando o exemplo de jogos Android, isso acontece da seguinte forma: pressionando o botão "Collect Gold" (ou qualquer outro), uma solicitação para o servidor na Internet é enviada para o usuário na Internet, respectivamente, a coleção de ouro, esta O dinheiro vem em resposta. Ter mãos retas, tempo e programas especiais, essas solicitações podem ser enviadas um número ilimitado de vezes.

Instalação e uso

Para hackear o jogo Android on-line, você precisa baixar e instalar:

No smartphone, é necessário ter direitos de usuário raiz, conexão com a Internet (preferencialmente por Wi-Fi). Encontre qualquer servidor proxy (há centenas de listas semelhantes na Internet), abra o proxy automático, o IP selecionado e o endereço de endereço do proxy, o tipo de proxy - HTTP. Pressione a seta da parte de trás, clique no link ativo na linha Proxy Server. Verificação de conexão: Role o programa, abra qualquer página no navegador. Aberto - Tudo está bem, não abriu - repita as mesmas ações, mas com outro servidor proxy.

Abrir Charles. No computador, vá para o menu de configurações de proxy. Deslize todas as caixas de seleção na janela que abre, exceto " Use uma porta dinâmica " Na primeira porta da linha, vamos: 8889. , no segundo - 1080. . Vá para a linha de comando do PC, VBE: " cmd. ", e depois - ipconfig. . Escreva seu PC IP (no caso do Windows 7, o endereço IP é oposto " Adaptador Ethernet. ").

Abrir Auto proxy. , Na string "host", insira o endereço IP do seu PC, porta proxy - 1080. , tipo proxy - Meias. , Desligue a autorização (se ativada). Agora todas as solicitações que vão para o servidor serão exibidas em Charles. Clique em um botão branco redondo, selecione a consulta desejada, pressione Repetir e desfrute de recursos ilimitados.

Oi, HABR! Hoje vou contar sobre o que você pode encontrar se de repente você decidir subir nos debres do aplicativo de outra pessoa no Android (neste caso, jogos online). Aventuras com a visualização de classes Java em .dex, aprendendo os códigos Dalvik OP e até programação em código binário. Mas as primeiras coisas primeiro.

Sob o tráfego do gato em ~ 800KB, dos quais são screenshots do código (!) Este artigo é escrito exclusivamente para fins informativos. O autor não tem nenhuma responsabilidade por quaisquer ações de usuários que lerem um artigo. Qualquer coincidência no artigo é aleatória.

Uma vez, com uma noite chuvosa de verão, minha namorada eu estava procurando como nos levar. Eu não queria assistir o filme, mas não tive que sair da cama. A escolha caiu em um brinquedo móvel. Os requisitos básicos para o jogo não foi demais:

  • deve apoiar iOS e Android;
  • Deve ter um único servidor para ambas as plataformas;
  • Deve haver um jogo conjunto para fazer sentido jogar juntos.

Então, encontramos o jogo do topo do Google Play. Para não divulgar nomes, vamos chamá-lo n. verdadeiro, pois acabou mais tarde, o terceiro item da lista acima é implementado um pouco mais do que qualquer coisa.

Abaixo eu me escondi sob o spoiler uma breve descrição do jogo, é opcional para lê-lo, mas para a integridade, a imagem será útil. Descrição O jogo é baseado em monstros. Você os chama, balançá-los e suas varas, colocam suas runas que pedem várias estatísticas. Em monstros, além dos níveis usuais (níveis), há também gradação para as estrelas:

1 estrela - Nível máximo 15

2 estrelas - Nível máximo 20

3 Início - Nível máximo 25

E assim por conta de 6 estrelas e o nível máximo 40. Tendo atingido o nível máximo, você pode levantar o monstro o número de estrelas, enquanto seu nível cairá para o primeiro. Este processo no jogo é chamado "Evolve". Para fazer isso, você terá que "comer" outros monstros específicos, por exemplo:

Para EVAVA um monstro 2s -> 3s, você precisa comer 2 já existente 2s Monster.

4s -> 5s - é necessário absorver 4 monstro 4s

5s -> 6s - 5 monstros 5s - este altamente Principalmente custos para os padrões do jogo.

Monstros podem chamar de várias maneiras, mas, em última análise, tudo se resume a três:

  1. Bata na localização (máximo 3S, a chance é bastante pequena)
  2. Call Rolls 1-3 (1S-3S, respectivamente. 95%, que com a chamada você receberá 1S ou 2s. Vale a pena esclarecer que os monstros 1s-2s - escória e em 99% dos casos vão ao consumo, Estatísticas são muito perdidas. Os pergaminhos estão caindo com muita frequência, em um dia sem hastes especiais podem ser obtidos por 20-30 peças);
  3. Call Scrolls 3-5 (~ 90-95%, que você receberá 3s, 4s cair raramente, 5s monstros nunca caíram desses pergaminhos. Rolos podem ser comprados em quantidades ilimitadas para cristais vermelhos. Cair muito raramente)

Agora sobre a moeda do jogo:

A energia é necessária para caminhadas em localização e dança de PVE. Consumo - de 3 a 8, dependendo da localização. Copie um em 5 minutos, muitas vezes cai diretamente das mobs mortas. Há um teto de energia que aumenta com o nível do jogador (não deve ser confundido com o nível de monstros) e com a ajuda de um prédio especial.

ARENA Energy - Usado para caminhadas na arena, "PvP". Sobre por que pvp nas citações, você aprenderá logo abaixo. 1 Caminhada na arena gasta 1 unidade de energia ISNA, máxima - 10, se acumula de uma só vez meia hora.

Cristais azuis - a principal moeda do jogo. É comprado na loja, a maioria dos edifícios. Acumulados por vários edifícios, cai das multidões assassinadas, dão uma recompensa por tarefas.

Cristais vermelhos são uma moeda secundária que você pode comprar dinheiro real. Eles podem ser gastos nos mesmos pergaminhos 3-5, para atualizar a energia e a isca de energia e comprar cristais azuis para eles. Muito raramente caem das multidões assassinadas ou na arena. No dia em que podem ganhar cerca de 30-40, a propósito, um rolo 3-5 custa 75.

Óculos de glória - a moeda que é dada para a vitória na arena. Há muitos edifícios e itens interessantes para isso. Esta moeda não pode ser comprada para qualquer outra ou para Donat.

Donat no jogo não pressione. Tudo é bom e calmamente passado / comprado sem infusão de dinheiro. Donat, na verdade, dá-lhe apenas mais rolos, as chances de obter monstros inúteis deles os mesmos. É impossível comprar um monstro específico para Donat (e em geral, é impossível).

O sistema de batalha lembra a Final Fantasy 7-10 ou, se você quiser, Homm é uma luta passo-a-passo, uma escolha de 2-4 feitiços. Nas masmorras de 3 a 10 níveis (na maioria das vezes 3 ou 5), em cada nível há um pacote de mobs, matar - ir mais longe, não mate - você consegue tudo o que você conseguiu ganhar (cristais, energia, experiência) .

Em relação ao "pvp" e "jogo conjunto". Como se viu, você não tem a oportunidade de brincar com uma pessoa ou contra uma pessoa. Você joga você mesmo ou na "Autoatata" e sempre contra o computador. Portanto, o PVP é bastante chato. É o seguinte: Cada jogador coloca 4 monstro para def 4 e compra torres para proteção. Entrando na arena, você está lutando contra a AI, o que é muito estúpido. Para equilibrá-lo, depois de um tempo você está começando a preencher as torres, toda vez mais e com mais frequência.

Eu sou um programador-remoção, então eu trabalho em casa. E em casa é sempre bom Wi-Fi, e eu realmente não pensei em como e quando o jogo interage com o servidor.

Contanto que eu não decidisse ir ao jogo da Internet móvel. Sentado todos os níveis na próxima masmorra, recebi a mensagem "A conexão de rede está atrasada. Reenviar os resultados da batalha? (Se os resultados da batalha não forem enviados, a batalha contará como perda.). Depois que eu cliquei no botão "Sim", os resultados ainda foram para o servidor.

Se você ler uma descrição do jogo, muitas coisas se encaixaram: por que não há PVP normal ou o jogo juntos - o jogo está associado ao servidor raramente, provavelmente em http, sem soquetes. E mais importante - aparentemente, neste jogo cliente Calcula os resultados da batalha e o servidor só recebe.

Imediatamente experimentando a desconexão da Internet em vários pontos do jogo, descobri o seguinte:

  • Ao entrar no local, você envia uma solicitação para o servidor. Se ele passa, e você tem a resposta - começa a fazer o upload para a localização;
  • O servidor não controla seus movimentos entre os níveis de localização;
  • Quando você mata o pacote final de mobs, outro pedido é enviado. Seu lout vem na resposta.
  • Se você puder enviar os resultados da batalha, mas você não pode obter a resposta - você mostrará a mesma mensagem - "A conexão de rede é atrasada ...". Mas se você tentar fazer isso novamente (e a resposta de solicitação será realizada), você receberá uma mensagem "Não encontrar dados de partidas". Isso sugere que ao baixar para a localização, você envia seu ID de batalha, que no final da masmorra é usado para enviar seus resultados.
  • Enquanto falava na descrição, não apenas cristais azuis caem das multidões. Muitas vezes, a energia e ocasionalmente cristais vermelhos estão caindo, e você vê o que e quanto caiu quando assassinando mob. E aqui é um pensamento: o cliente decide quanto e o que vai cair e, em seguida, envia para o servidor? Em caso afirmativo, enviando o pedido "certo", não apenas poderemos "ganhar" a masmorra que não estamos nos dentes, mas também para pegar um par de centenas de cristais vermelhos e energias dele.
  • Com tudo isso, você não pode ter medo da outra passagem do desapego pela masmorra. Depois de completar a passagem (de uma forma ou outra), simplesmente recebemos a mensagem "Não é possível encontrar dados de jogo", os resultados já são enviados.

Idéia 1. Inquérito Falso

A ideia mais lógica que pode vir depois descrita acima.

Para fingir um pedido, precisamos do original. Muitas opções de monitoramento de tráfego, eu escolhi o mais fácil para mim - colocar o tráfego através de um laptop e olhar para tudo isso com Wireshark.

Instruções para girar o computador para acessar o ponto pode ser encontrado aqui.

.

Para ter menos "ruído" supérfluo nos logs, feche todos os aplicativos e desative a sincronização.

Durante o download, o jogo carrega informações sobre promoções, parceiros, amigos do Facebook - em geral, há muito tráfego, e vai para servidores diferentes, por isso não estamos interessados. Nós vamos para a localização: Investigação

Post /api/gateway.php http / 1.1user-agent: dalvik / 1.6.0 (***) host: *** Conexão: Mantenha-Aliveaccept-codificação: GzipContent-Type: Aplicativo / X-WWW-Form-UrlenCoDedContent -length: 556hEuirYJfxnRGR7vITBb1x / 3KpY + 0DZmSWBLuxNnJn + Vqdb2eg7X + TKBKgcldJEY1A59yw8ocPnyD / A + + Xec5uLtk9IEojAmPTwDiJDNu6BcRKXQpCGIildUlzpBxCSSp0PU8OgSaXNqlP aGrXnHGoZXKVREMPRAXZPwlOGD6XIemvS5wkWrv + 4GBPhO3v21CEfify4wO0x6GWUswX55TbAiLbT4Lr3C4TKXJyJQ8eujxC7Nd0OFEK8d92KbamPEFocxJotYTNuLa6qwVfdpgvaoDCCeKGXvu + z3ZZCjaruh2XMHtg6MRU0ywpB7d5qR9b4JOYRGwe2z9WHXKZesSwl7S7HsLgKtjLKz9oIRJAiTgRIWGn2WM9WaMtFSn9fXyEj31lS3JWtJ4hkgntVYh4qC6DvnTt0XJTZBXWm93Ki2FVASHDkr + tTPNZm69uBWXQ8 / a768aoaTO + v + 1o / ymQ8TQBDeMt79XZ8w3kGYrXC9PZh8IacSA3KPqzVQxlFeXnyzuTuqTzef9ZB9B2yc0VGD + = xeIwgswiyNOjTBYqKmI 
Responder
Http / 1.1 200 OkServer: NginxDate: SAT, 19 de julho de 2014 15:04:16 GMTContent-Tipo: aplicação / octeto-stream; charset = UTF-8Content-Comprimento: 1048Connection: PHP / 5.4.11Cache-Control:: não-cache, deve-revalidatePragma: Alimentado-por-closeX não-cachevyb3BQeGoRphqgM / QCIBv0m2Ms5lBf3iUEKauCdpgRCXWjyITAUa + t1w36VzBxlkZlYF + JH + LMW + hmPbLtKj2pBidUrZ0CO44AsQ2erYG + m0n2WK8SY5m7Ioar1gNtim67rwpZQeGzP + dUvLE5T3Q / 3iqua8dHNAhkrsrYyHYevbh535JODq0Qwd5y8ZQtsYQnl + Vtc2YeL6O3hvUc6UEKNHmc79saLz + PhH64nRA7xih + OLip3FGrgJdgDTTNBn2xBxyRmTeuoD1LqwKa / eWfDkwoA9IOMoc9NozoRyiUDRZjaya0VZH + k6DR4lRGMrDJtmBwjIWfAIbEg5K3xUEPtJIvU7QryaDTqZT + FOgQRr1sZ5MFzoDzJ + titAfbKNKZxF7QUDbAzi + o3j6pzZkioPbWMotsUWKUM / IOrfKcRGIV1yd0w8sGHhh9m7wDwbFA1 / RCpifJBV528TZ9Ql3P3gQGvvqnGf5n88BpKXo3IF5 + T3Fr9QXijR4kJ5H9MxltRCLB3DU41XZ9bQuP9o7IvWkt + TGvByAW4bI3JkLz855R7AzSoyrVfYPaguKH7yvJX6cQkm5GDqYRCwFA + mRQmHg6AEYbBS2M + DrZ1U / UvdB5bMY + sLDEPE6MLVeRadFjNzFlKkQxWUlGmzD06ia9kCOoyC9du4bCRTziH03qNK4m1tgwqw2jsUtu8I + HTK30YibHmrUWdqtfyIm0EqiXKI8ZsZYxsG1qeqYQNnQ9HIYxpYRXIETlLBl1Fs3bY1tXoUxetaNDVhxW / PMvFCLSJJCNJ6V8iJRieA0o23hqAKsJpDRANz8oEJ0vNKubXn7HeXq48UzkStqobE / UotzQ8ocdVBW7MgErF5Dz jWLxgMjB3pnKiOFl8pqacD6qFWSywQtcF8xJ2RQMuEefusrrfFi67e5PLSdJW2utMIMAudJyllcOK4wNur6fo18J6zHyjzSklIuPhzPn2XQj + FcgUh1pU0wLKhuWq39PFCi4ekupSLt7j0VSZCoKDmKQO4q1b / SpeA5Bb7lW5TvgRSsg == 

À primeira vista, pode ser visto que é base64. Mas por impulsionado pelo texto no primeiro decodificador, recebi um absurdo completo, embora eu esperava JSON (brincadeira, seria muito ingênuo - o aplicativo 10kk + downloads).

Precisamos ir mais profundo ©

Baixe os jogos APK (muitas opções, aproveitei isso

). O arquivo APK é um arquivo zip regular, tem muitas coisas nele, mas antes de tudo, estamos interessados ​​no arquivo Classes.dex. Este é um formato executável Dalvik. Em essência, compilou aulas Java. Para abri-los, precisamos de dex2jar

e jd-gui

. O primeiro converte delex a jar, o segundo está tentando restaurar o código-fonte do pote.

O que vai restaurar JD-GUI parece muito pesadelo e somente leitura. Você não deve tentar compilá-lo. Fontes de JD-GUI podem ser salvas e abertas em seu editor favorito. Eu baixei a ideia de 30 dias de julgamento de jetbrains, porque eu amo muito como a busca foi feita em seus produtos (eu mesmo uso pycharm e phpstorm por comprado).

Aviso para aqueles que preferem este editor - não defina o SDK, você será preenchido com erros.

De programação para Android, eu sabia apenas Aza e não tive uma ideia especial por que eu começo minhas pesquisas. Portanto, lancei a busca pelo Base64 no projeto e encontrei uma classe que implementa a decodificação base64 e codificam. Fiquei muito surpreso, porque esses métodos não eram apenas um invólucro para a biblioteca, mas, a julgar pelo código, realmente implementado Codificação e decodificação base64.

O primeiro pensamento que me veio - os criadores escreveram algo próprio, que se parece com base64, mas é codificado de forma diferente. Como o código parece com tesão (métodos de milhares de linhas, goto, instruções nos métodos imediatamente após o retorno e outras alegrias da vida), então reescrevê-lo, eu não poderia. Então me lembrei que o servidor é escrito em PHP, e decidiu não desesperar, porque contendo duas implementações base64 de propriedade em duas plataformas muito diferentes é bastante considerável para o desenvolvimento. Um pouco mais tarde, eu caminhei Base64 em Java e percebi que em bibliotecas padrão Java (6 e 7 versões) base64 codificando, não, que finalmente mudou meus medos sobre implementação alternativa.

Pesquisando o uso desta classe, saí em outro - StringEncrypter, que implementou vários métodos, mas básico - descriptografar e criptografar. Grande revisou o método decrypt que percebi que isso é o que eu preciso. Os dados foram descriptografados da Base64, conduzidos por AES / CBC / PKCS7Padding e retornados. Ele permaneceu apenas para encontrar a chave que foi usada para cifra e o vetor inicial (vetor de inicialização).

Para isso, comecei a procurar o uso desses métodos. E descobriu que a classe StringEncrypter não é usada em qualquer lugar. Surpreendeu-me mal, mas achei que era falhas de JD-GUI.

Comecei a procurar o projeto de novo, desta vez eu procurei imediatamente a cifra. Os resultados eram muito, e, vagando por cima deles, eu encontrei o arquivo, cujo código fonte, aparentemente, não funcionou. Em vez de código pendurado "erro interno". Runendo a pesquisa por esse "erro interno" no projeto, recebi 55 resultados. Tornou-se claro por que não consegui encontrar o uso de algumas classes. Entre esses arquivos encontrados um com um nome interessante do ActiveUserNetwork.

Precisamos ir mais profundo ©

Eu acho que foi mais - apenas o montador. Então acabou.

Dalvik VM tem muitos recursos.

e, na verdade, o código Smali é bastante amigável para leitura, especialmente se você pegou no montador.

Desta vez vamos precisar de smali e baksmali

. Backsmali converte o arquivo Classes.dex para a pasta de origem, salvando a hierarquia e os nomes das pastas e arquivos. No começo, será muito mais fácil lidar com o código Smali abrindo o mesmo arquivo Java (a menos que, é claro, o JD-GUI foi capaz de descompilar)). Na internet há recursos suficientes onde você pode encontrar exemplos de código, aqui

Por exemplo, é mostrado como arrays olham em smali e as instruções para / switch.

Mas de volta ao nosso jogo, mas especificamente para o arquivo ActiveUserNetwork que lhe interessa. Tudo achou tudo - cifra, criptografar e descriptografar métodos, base64, (a propósito, foi usado a partir da biblioteca Android.Utils) e até mesmo o "http: //***.com/gateway.php" constante. Sim, não é /pi/gateway.php, mas pelo menos alguma coisa. By the way, a busca por "api / gateway.php" mesmo pelo código Smali não deu nada, mas eu realmente não fiquei chateado porque vi que o stringbuilder era frequentemente usado.

A iluminação do Código Smali em Habré não é (nós seremos francos, é geralmente um pouco onde há), então eu vou colocar grandes peças deste código para colocar as capturas de tela.

Então, o método

descriptografar.

:

Explicações sobre o código: Na primeira linha, há uma descrição padrão do método: o que ele aceita e retorna. O método leva 2 parâmetros - uma matriz de string e byte (aqui parece [B). Retorna a matriz de bytes.

Diretiva .Local Indica o número de registros que o método usará, sem contar seus parâmetros. Além da presente directiva, existe um semelhante, o que é chamado .Regists. Ele define o número de registros que são usados ​​pelo método, incluindo parâmetros do método. Aqueles. Em geral, registers = .Locals + params. Ao mesmo tempo, se você declarar o número de registros através da diretiva .Registers, os parâmetros do método caem nos últimos registros. O acesso aos registros é realizado através do V0, V1, V2 e assim por diante, aos parâmetros - P0, P1 e assim por diante.

Este método é estático e é chamado sem um objeto, caso contrário, haveria 3 parâmetros aqui, o primeiro deles seria o objeto para o qual o método é chamado (isto). As duas diretivas a seguir podem estar ausentes, este é os nomes dos parâmetros. Diretiva .annações. Anuncia informações adicionais sobre o método, neste caso, a exceção Outlocked. Diretiva .prólogo. Isso sugere que o corpo do método é o próximo.

Considerando tudo isso, as primeiras 11 linhas são convertidas em uma linha Java Code:

Byte estático público [] descriptografar (chave de string, byte [] dados) lança exceção { 

Olhando nos códigos OP e lembrando que o objeto em si é sempre transmitido no parâmetro Virtual Invoke, ao contrário da Invoke-Static, "literalmente" reescrever o método Java:

Byte estático público [] descriptografar (chave de string, byte [] dados) Exceção {string v1 = "AES / CBC / PKCS7Padding"; Cifra cifra; Cifra = cifra.getinstance (v1); int v1_1 = 2; SecretkeySpec v2 = Creesecretkey (chave); Algorithmparameterspec v3 = spec; cifra.init (v1_1, v2, v3); Byte [] v1_2 = cifra.dofinal (dados); Return v1_2;} 

Aqui

Especificação

- Classe de variável estática ActiveuserNetwork, é inicializado em um designer de classe

.Line 78new-instance v0, ljavax / crypto / spec / ivparameterspec; const / 16 v1, 0x10new-array v1, v1, [binvoke-direct {v0, v1}, ljavax / crypto / spec / ivparameterspec; -> <init> ([B) v0 v0 v0, lcom / com2us / módulo / activeuser / activeuserNetwork; -> Spec: ljava / segurança / especificação / algorithmparameterspec; 

Eu substituí este código de design ao método

Getspec.

. Nós damos o método

descriptografar.

Para forma normal:

Byte estático público [] descriptografar (chave de string, byte [] dados) Exceção {String Alg = "AES / CBC / PKCS7Padding"; Cifra cifra = cifra.getinstance (ALG); SecretkeySpec SecretkeySpec = CreateCretKey (chave); cifther.init (2, secretkeyspec, getspec ()); Retornar cifra.dofinal (dados);} 

Então, é necessário lidar com os métodos

CreateSecretKey.

и

Getspec.

.

Público Estático AlgorithmParameterSpec GetSpec () {byte [] v1 = novo byte [16]; Devolva novos ivparameterspec (v1);} 

Este é um código convertido do designer. O caso já estava à noite, e o número 0x10 meu cérebro traduziu para o sistema decimal como "10". É bom que eu decidi verificar novamente a calculadora, caso contrário, estaria esperando a decepção :)

Método

CreateSecretKey.

(aqui, a propósito, erro de digitação no título, vamos endireitar também)

O método é completamente simples, transformado em

Secreta Estática PúblicaPec CreateCretKey (chave de string) {devolva novo secretkeyspec (key.getbytes (), "AES");} 

Ótimo, permanece apenas para descobrir o que é transmitido ao método chave e de dados.

Isso é responsável por

ProcessNetworkTask.

que simultaneamente envia uma solicitação (com encrypt e codificação base64) e recebe a resposta. O método de volume (linhas 1k), então vou colocar apenas a montagem dos interesses para nós (

v18.

- objeto de classe.

Org.apache.http.httpresponse.

)

Brevemente:

O valor de Heder é tomado

Req-timestamp.

O método é chamado

Creathash ("md5", header_value)

. Da linha devolvida, obtemos uma substring do primeiro símbolo até o décimo sexto, e esta substring é transmitida ao método

descriptografar.

chave. Byte-Array é transmitido para dados

Base64.Decode ()

.

Então, em nossas mãos temos tudo, exceto o método

Creathash.

.

Código Smali:

Este método já está refletindo para a percepção: há um ciclo, exceções e condições. E é impossível cometer um erro em métodos criptográficos. Um desses design vale:

Const / 4 v7, 0x1new-array v7, v7, [ljava / lang / objeto; const / 4 v8, 0x0aget-byte v9, v3, v1invoke-static {v9}, ljava / lang / byte; -> valorOf (b) Ljava / lang / byte; mover-resultado-objeto v9aput-objeto v9, v7, v8 

E se transforma em um banal

Byte v9 = mdbyte [i];

Como uma dica: quase sempre, quando você vê o incremento (

Add-int / lit8 v1, v1, 0x1

) antes

Vamos para.

- Isso é um ciclo. Código final Java:

Create de cadeia estática pública (algoritmo de string, byte [] dados) {TENTE {Messagedigest MD = Messagedigest.GetinStance ("MD5"); Md.update (dados); Byte [] mdbyte = md.digest (); String mdstring = ""; int i = 0; Int len ​​= mdbyte.length; para (i = 0; i <len; i ++) {stringbuilder v5 = novo stringbuilder (mdsstring); String v6 = "% 02x"; Byte v9 = mdbyte [i]; V6 = string.format (v6, v9); V5.Append (v6); mdstring = v5.tostring (); } Retorno Mdstring; } Catch (NosuchalgorithMexception E) {return ""; }} 

Nós coletamos todos juntos. Eu criei um novo aplicativo e joguei tudo na mainatividade:

Void público oncreate (pacote savedinstancestate) {super.oncreate (savedinstancestate); String b64 = ""; // Base64 solicitar string do corpo req_ts = ""; // req-timestamp cabeçalho byte [] decodebase64byte = base64.Decode (B64, 4); Cadeia hash = createhash ("md5", req_ts.getbytes ()); hash = hash.substring (0, 16); tente {log.d ("myapp", "descriptografado:" + nova string (hash, decodebase64byte))); } Catch ("myapp", e.getclass () + "-" + e.getmessage ()); }} 

Agora vamos voltar ao que fazemos tudo isso. O leitor atento poderia perceber que, em qualquer resposta, nem a pedido, que foram dados acima, não havia cabeçalho req-timestamp. No entanto, e a solicitação vai para / gateway, e não para / api / gateway. Solicitações / gateway vão durante a inicialização do aplicativo. Há apenas dois deles, descriptografá-los, eu tenho ... nada. Não, houve dados no dispositivo, o endereço MAC e até mesmo que o comprimido foi visitado. Mas eu não consegui nada que valha a pena. Pedidos para / API / Gateway foram de outro lugar e não foram associados a / gateway.

Enquanto eu entendi com o código Smali, fiz mais algumas tentativas em diferentes direções antes de chegar à decisão de lidar com todos os métodos e reescrevê-los em Java.

TENTATIVA 1: Não procure como a chave é gerada, mas basta fazer uma solicitação ao seu servidor. O código Smali pode ser alterado e compilado de volta, então a ideia era simples - na frente do método decrypt, formamos uma solicitação ao seu servidor, passando a tecla como o parâmetro Get e, em seguida, veja o log do servidor da Web.

Em busca de como compilar o código Smali, encontrei APKTOOL

. Esta ferramenta sabe como desmontar o arquivo APK imediatamente no código Smali, além de coletar tudo isso para APK.

./apktool decodificar ~ / downloads / ***. apk ~ / Documents / Out /./ APKTOOL Build ~ / Documents / Out / ~ / Downloads / ***. New.apk 

Mas quando você tenta instalar um novo aplicativo, receberá um erro:

./Db install -r ~ / downloads / ***. New.apkfailure [install_parse_failed_inconsistent_certificate] 

No desígnio do Stackoverflow para remover o aplicativo manualmente e depois defini-lo novamente, mas não me salvou. Fazemos uma nova chave, pois isso precisamos de KeyTool e Jarsigner (digite o pacote OpenJDK)

Keytool -genkey -keystore ~ ​​/ debug.keystore -Validez 10000 -alias debugjarsigner -keystore ~ ​​/ debug.keystore -verbose ~ / downloads / ***. New.apk Depurga 

Nota importante - O Jarsigner se comporta de maneira diferente em 6 e 7 versão do JDK e nas 7 versões dos tapetes da equipe no alias. Eu não encontrei resolvendo esse problema e me instalei uma versão adicional de 6.

Depois disso, a instalação do aplicativo passará. Mas, infelizmente, o aplicativo (mesmo se você não alterá-lo, mas simplesmente descompilar-compilação-write-write-writled) caiu imediatamente. Eu acho que o servidor de alguma forma verifica as assinaturas, mas ficarei feliz se alguém nos comentários esclarecer. Essa ideia teve que sair.

Tentativa 2: Se não houver desejo de pegar no código Smali (e eu não tive, pensei que era uma tarefa por ~ 5 horas), então você pode fazer isso mais fácil. Em sua inscrição, crie um método vazio com a mesma interface que a que você deseja copiar, criar apk, descomedir, copiar o corpo do método, coletar de volta. Cada dessas iteração demora muito tempo. Portanto, os códigos OP serão explorados mais rapidamente. Ao mesmo tempo, é claro que você não pode mais ser capaz de abrir o código-fonte do aplicativo montado. Este artigo escreveu não em um dia, e essa observação escrevo uma semana após o parágrafo acima. O método de descrever a interface e a cópia do código Smali no corpo do método me ajudou muito quando não consegui restaurar o código-fonte do método de geração de chaves. Para simplificar a vida e reduzir o tempo de iteração, você pode combinar tudo em um comando

APKTOOL Build ~ / myapp / ~ / myapp.apk && jarsigner -keystore ~ ​​/ debug.keystore -verbose ~ / myapp.apk debug && adb install -r ~ / myapp.apk && adb shell am start -n "com.example. myapp / com.example.myapp.myactivity "-a android.intent.action.act.main -c android.intent.category.Launcher && adb shell logcat myapp: d *: s 

Idéia 2. Fazendo supermondra.

Bem, se não funcionar através do pedido - vamos para outro.

Novos monstros são carregados no jogo não através da atualização no Google, mas através da atualização interna. Isso significa que eles são armazenados em algum lugar fora da APK e teoricamente podemos modificá-los.

A pasta de pesquisa longa não tinha - /sdcard/android/data/com.***/files/patch/

Havia todos os sprites e sons, e mais importante - muitos arquivos com nomes de monstros e extensão .dat. Abra um editor hexadecimal e veja brevemente - sem cabeçalhos e linhas para as quais a visão seria desordenada. Peguei o primeiro monstro do primeiro nível, olhou para sua HP e comecei a pesquisar / substituir esses bytes na esperança de que o arquivo não fosse criptografado. Havia 7 coincidências. Substituindo-os consistentemente, recebi 4 jogos de acidente e 3 "Nada mudou". Infelizmente, criptografado.

Mas algo deve decifrá-lo! Estamos procurando no código regexpu "\ .dat \ b" (para excluir métodos começando com "dados" nos resultados). Há apenas um arquivo CommonData.dat. Este arquivo está ocultando na pasta / data / data / com. *** / (Se você estiver vazio na pasta / data - você precisa de acesso root).

O arquivo é criptografado e tem um tamanho em 1kb. É claro que não há nada que valha a pena lá, no entanto, o algoritmo de criptografia pode ser o mesmo. Desta vez não vou colocar o código, leva cerca de mil linhas. A coisa mais importante é a chave na descriptografar uma string baseada no Android_ID. Depois de abrir no arquivo, o endereço MAC (novamente) foi encontrado. Testou o mesmo algoritmo nos arquivos dos monstros, recebi um erro.

Tristeza.

Oi, montador!

No entanto, na mesma pasta /data/data/com.***/lib/ me deparei com a biblioteca .so. Eu já os vi no APK e vi sua conexão na Mainatividade (honestamente, eu estava muito esperando muito que eu não teria que pegá-los). As bibliotecas eram dois - libgame.so, libcom ***. Então. O segundo pesou muito pouco e não carregava nenhum valor para mim. Eu abri o primeiro editor hexadecimal e depois de meio minuto encontrou a string "http: //***.com/gateway/api.php".

Precisamos ir mais profundo ©

Espero que você não esteja cansado ainda :) Porque começamos quase desde o começo.

Francamente, passei 20-30 horas do meu tempo nesta fase. Se você não estiver familiarizado com os códigos OP do processador, registros e memória - você também vai aqui por um longo tempo. Eu fui salvo apenas minha teimosia e o desejo de provar que um homem é mais íngreme algumas aplicações lá.

Muito tempo foi para a seleção de ferramentas e técnicas. E se o artigo restante economizar alguém no futuro algumas horas - será maravilhoso.

Ferramentas.

O IDA Pro 6.1+ é a principal ferramenta para depuração. A partir da versão 6.1 vem com o arquivo Android_server e a possibilidade de depuração remota de aplicativos Android.

Gdbserver.

- outra ferramenta para depuração remota.

Nesta fase, o acesso raiz ao dispositivo é necessário.

Download ambos os servidores no dispositivo: 

Adb push gdbServer / dados / local / tmpadb push android_server / data / local / tmp

Personalize portas das portas em Lockalchost: 

ADB Forward TCP: 5039 TCP: 5039Adb Forward TCP: 23945 TCP: 23945

Melhorar os direitos certos: 

ADB Shellsuchmod 755 / Dados / Local / TMP / GDBSERVERCHMOD 755 / Dados / Local / TMP / Android_Server

Ideia básica (graças a este tópico

  1. Ele me salvou uma tonelada de tempo):
  2. Conectando-se através do Android_Server, encontramos uma biblioteca, lembramos do deslocamento;
  3. Download da biblioteca na IDA com o deslocamento especificado;
  4. A IDA realiza análise, define os nomes de funções, desafios e até tentam reproduzir o código-fonte;
  5. Execute o aplicativo no dispositivo;
  6. Já uma carga de biblioteca analisada no aplicativo via GDBServer Nós colocamos breecas, analisamos. Se o aplicativo cair - .

Goto 4.

Por que dois servidores são de depuração remota? Android_Server pode "lindamente" mostrado bibliotecas carregadas e compensação para a biblioteca desejada está nela muito rapidamente. Mas os pontos de interrupção não funcionam nele. Mas eles funcionam perfeitamente no GDB. Deslocamentos parecem ser para pesquisar e via cliente gdb com

Info SharedLibrary. Mas não saiu. Localização das configurações desejadas na IDA

Você pode carregar um arquivo de deslocamento. Na mesma janela, você deve especificar o tipo de processador.

Seleção de depurador remoto:

Configurar conexão para depurador :. Aqui eu exibe o host e o porto do servidor que agora é usado.

Outro ponto importante: 

Se o aplicativo cair - você (com alguma probabilidade) terá que fazer todas as etapas do primeiro. É tudo sobre a tecnologia ASLR . Para desligá-lo, corra na Shell:

Echo 0> / proc / sys / kernel / randomize_va_space

  1. Atenção!
    Isso afeta muito a segurança do seu dispositivo. Não se esqueça de lembrar o valor desse parâmetro e devolvê-lo ao local após suas experiências. 
  2. Então, um plano de ação mais detalhado: Execute Android_Server: .
  3. ADB Shellsu / Dados / Local / TMP / Andoid_Server
  4. Abra Ida sem baixar qualquer coisa, vá para
  5. Debugger> Anexar a> braço remoto / depurador para Android Selecione o aplicativo desejado na lista. Estamos à procura de nossa biblioteca (muitas opções, mas eu poderia achar mais rápido para encontrá-lo - rolando e visualizando. A busca funciona lentamente, o salto nem sempre está sendo executado para o rótulo.
  6. Lembramos o deslocamento da biblioteca ( 5d699000. No meu caso).
  7. Desligue do processo ( Debugger> Detach do processo Estamos à procura de nossa biblioteca (muitas opções, mas eu poderia achar mais rápido para encontrá-lo - rolando e visualizando. A busca funciona lentamente, o salto nem sempre está sendo executado para o rótulo.
  8. ). O processo no dispositivo permanece vivo.
    Abra o arquivo, exiba o deslocamento desejado ( 
    0: 5d699000. Enquanto o IDA analisa o arquivo, mate Android_Server e prepare o GDBServer: Adb shellsu / dados / local / tmp / gdbserver --attach: 5039 1234
  9. (Opção --Attach informa ao servidor que você precisa participar do processo já em execução: 5039 - Número da porta, 1234 - PID PROCESSO que você pode ver o habitual
  10. PS.

na concha).

Nós alteramos as configurações da IDA para trabalhar com GDBServer.

  • Conecte-se ao processo.
  • Agora, se tudo for feito corretamente, o código da biblioteca que analisa o IDA subirá para o lugar certo.
  • Depois de estudar a lista de funções da biblioteca, encontrei um grupo muito ocupado que foi responsável por interagir com o servidor. Aqui estão alguns dos recursos:
  • Battlearenastart.
  • Battlearenesult

BattledungeOnstart.

BattledList.

BattlededungunergeResult

Todas essas funções foram formadas por JSON, preenchidas e causou uma função.

sub_5d839994.

. Esse recurso é a base da comunicação com o servidor. Criptografa as strings, segges no Base64 e envia dados.

BattledList.

Era difícil mexer com a criptografia, mesmo em um código de smali mais ou menos compreensível. Imediatamente foi um dia infernal. Embora eu tenha encontrado uma chave que é usada para criptografia, ainda perdi em busca de IV.

Mas, como já estamos visíveis no aplicativo pelo depurador, precisamos interceptar a string antes de criptografada, alterá-la e continuar a operação do aplicativo. E o servidor irá seqüência modificada.

BattledList.

Como eu disse, esse recurso (

) Usado em todos os lugares (ou quase em todos os lugares), onde há comunicação com o servidor, por isso é quase inútil colocar um ponto de interrupção, ele funcionará imediatamente, já que há uma conversa no jogo.

Limpando um pouco, encontrei uma solução. Eu coloco 2 ponto de interrupção: um antes de ligar

Na função desejada, a segunda, na forma desconectada, - imediatamente antes da função

) Usado em todos os lugares (ou quase em todos os lugares), onde há comunicação com o servidor, por isso é quase inútil colocar um ponto de interrupção, ele funcionará imediatamente, já que há uma conversa no jogo.

Aesconvertencode.

que é responsável pela cadeia de criptografia. 

Então, o momento da verdade, entre na arena contra um forte adversário. Com a derrota que a perda, o aplicativo congela - ponto de interrupção funcionou. Desligue, ligue o ponto de interrupção antes cliente , Execute o aplicativo e ... Hurray! O depurador intercepte o controle diretamente antes da criptografia. Registre o conteúdo R0:

{"Command": "Battlearenesult", "ID": 1234567, "session_key": "***", "Win": 2, "Unit_status": [{"" unit_id ": 1," resultado ": 2} {"Unit_id": 2, "Result": 1}, {"" unit_id ": 3," Resultado ": 1}, {" unit_id ": 4," Resultado ": 1}]," Unit_list ": {"Unit_id": 123456781, "pos_id": 1}, {"unit_id": 123456782, "pos_id": 2}, {"" unit_id ": 123456783," pos_id ": 3}, {" unit_id ": 123456784 "Pos_id": 4}], "posição": {"Island_id": 1, "pos_x": 14, "pos_y": 22}}

O palpite em que estava confiante em 99. (9)%, confirmado - neste jogo

Decide se a batalha foi ganha, e o servidor só recebe o resultado.

Enquanto falava na descrição, não apenas cristais azuis caem das multidões. Muitas vezes, a energia e ocasionalmente cristais vermelhos estão caindo, e você vê o que e quanto caiu quando assassinando mob. E aqui é um pensamento: o cliente decide quanto e o que vai cair e, em seguida, envia para o servidor? Em caso afirmativo, enviando o pedido "certo", não apenas poderemos "ganhar" a masmorra que não estamos nos dentes, mas também para pegar um par de centenas de cristais vermelhos e energias dele.

Eu mudei pontos de interrupção de volta e, apenas no caso, não mudei nada - os dados foram assistidos aqui, em particular

Unit_status.

. Naquela batalha, consegui matar um dos quatro monstros do inimigo, então acho que o monte de id-resultado enviou dados sobre o assassinato de um monstro (2 - morto, 1 - vivo) para o servidor. Um pouco mais tarde, percebi que isso é verdade. Talvez esses dados sejam usados ​​como um cheque adicional para a vitória e procure por intrusos, mas aparentemente o principal objetivo é deitar com monstros. Se você se lembra, no começo, escrevi o seguinte:

Acontece que, ao entrar na masmorra, o servidor cria uma lista de monstros, liga-se a cada LUT e envia dados para o cliente. Portanto, você vê imediatamente no jogo, que e em que quantidade caiu - o cliente simplesmente exibe informações anteriormente recebidas. Mais tarde, ele não envia materiais que você ganhou, mas apenas o status de monstros - mortos ou vivos (explicarei por que é necessário em caso de vitória: há locais no jogo que você pode passar sem matar todos os monstros no nível , Por exemplo, chefe + dois monstros. Nesse caso, você só pode matar o chefe e você irá mais longe). O servidor recebe essas informações, compara com sua tabela de alaúde e atribui que você experimente / recursos dependendo dos monstros montados. Apenas para ganhar experiência, você envia uma lista de seus monstros participando da batalha.

Em teoria, tudo o que fazemos com a ajuda de um Debgagger, parece bastante legítimo para o jogo, a vitória, todos os monstros estão mortos. Banir-nos como nada. No entanto, um pouco mais tarde eu descobri um momento desagradável. Como eu disse, os locais são divididos em níveis - três ou mais. Em cada nível, eles têm suas próprias multidões. Por exemplo, imagine esta situação:

Estágio 1 - 3 monstro (nós os matamos, passado)

Estágio 2 - 4 monstro (aqui nós matamos um e morremos) 

Estágio 3 - 3 monstro (não vemos a este nível, como eles morreram antes)

Agora, se interceptamos JSON antes da criptografia, obteremos aproximadamente os seguintes resultados:

"Unit_status": [// estágio 1 {"unit_id": 1, "Result": 2}, {"unit_id": 2, "resultado": 2}, {"unit_id": 3, "resultado": 2} // estágio 2 {"unit_id": 4, "Result": 2}, {"unit_id": 5, "resultado": 1}, {"unit_id": 6, "resultado": 1}, {"unit_id ": 7," Resultado ": 1}]

Como você pode ver, devido ao fato de que não atingimos o terceiro nível, não baixemos os dados sobre monstros nele. Mesmo se mudarmos a solicitação para "ganhar" e os status dos monstros existentes nos "mortos", ainda não podemos chegar aos três mobs restantes no terceiro nível. E para o servidor eles estão vivos, mesmo em resposta e vem que ganhamos. Teoricamente, isso pode pegar e proibir. Mas eu ainda estou vivo :)

Ao mesmo tempo, apenas um nível está na arena, e a solicitação é verdadeira em 100%. 

Agora tudo ficou claro. Embora não possamos obter um número ilimitado de cristais vermelhos, mas ainda podemos ganhar qualquer batalha que deseje. É verdade, ele tem que manter um dispositivo conectado a um computador, alternar constantemente os freios e refazer manualmente a solicitação antes da criptografia. Isso não é muito conveniente. Em teoria, não precisamos muito: sempre registre na unidade "Win" e no "resultado" dois para todas as mobs.

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

Movs r0, r6blx __floatsidfbl cjson_createnumberldr r1, = (unk_5d8c3240 - 0x5d846666e); "Win" movs R2, R0ldr R0, [SP, # 0x30 + var_2c] Adicionar R1, PCBL CJSON_ADDITEMTOOBJECT

Aparentemente, em.

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

R6.

Há o que precisamos é o valor da vitória. Agora precisamos mudar esta instrução sobre a atribuição automática da vitória.

Vale a pena notar que no jogo há uma oportunidade para sair da batalha a qualquer momento, enquanto a derrota é contada. Isto é, sempre temos a oportunidade de obter uma derrota, e podemos esperar que em

Sempre 2. Mas eu não estava muito claro se haveria simplesmente 2 (0x2) ou "2" (0x32 ASCII).

É pequeno - altere as instruções. Infelizmente, a IDA não permite o código ASM, então você tem que alterar os pedaços de instruções.

Você queria aprender a programar em zeros e unidades? Eu tenho eles!

De fato, tenho algum tipo de prazer, programando dois botões e estudando as instruções. Bem aqui

e aqui

Bons materiais e dicas de acordo com as instruções.

Vá para o editor hexadecimal, olhamos como parece do interior.

MOVS R0, R6; 321s.

Transforme a instrução, obtenha

1C32.

. Em forma binária:

0001 1100 0011 0000

Como você pode ver, as instruções de dois bytes são usadas. Isso não é braço (há quatro pessoas), e polegar ou thumb-2.

No entanto, você não encontrará a instrução

Movs.

Isso seria assim. Na verdade, a instrução parece 
Adiciona R0, R6, # 0

. Durante a análise IDA, ele converte instruções em uma visão mais conveniente, que pode surgir pequenos problemas com a edição.

0001110 000 110 000ADDS IMM RN RD

Adiciona.

- Esta parte é constante para esta instrução.

Imm.

- valor imediato. O significado imediato que queremos adicionar.

Rn.

- O registro para o qual vamos adicionar.

Rd.

- Registro de destino. Registre-se que armazenará o valor após a execução da instrução.

Então, precisamos substituir esta instrução. Devido ao fato de que eu não sabia que tipo de dois é usado, escolhi a seguinte opção:

Subs r0, r6, # 1

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

Instrução

Subs.

Sair de

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

um e colocar o resultado em

Subs.

R0.

. Como resultado, não importa quão duas vezes

, dentro 

A unidade desejada será.

Transferir para o formato binário:

0001111 001 110 000subs imm rn rd

Em hexadecimal -

1e70.

. Virar -

701e.

. Agora substitua esta instrução na biblioteca.

Rd.

Era:

) Usado em todos os lugares (ou quase em todos os lugares), onde há comunicação com o servidor, por isso é quase inútil colocar um ponto de interrupção, ele funcionará imediatamente, já que há uma conversa no jogo.

Movs r0, r6

Tornou-se:

Apenas no caso, verifique os registros na entrada da função usando o ponto de interrupção

E estamos convencidos de que tudo é verdade. 

Resta substituir apenas as instruções responsáveis ​​por atribuir o status dos monstros. Ela está bem ali, logo abaixo. В

Adicionar R8, PC; "Unit_id" mov r9, r3add r9, pc; "Resultado" loc_5D8466E2BL cJSON_CreateObjectMOVS R4, R0LDMIA R7!, {R0, R1} BLX __floatundidfBL cJSON_CreateNumberMOV R1, R8MOVS R2, R0MOVS R0, R4BL cJSON_AddItemToObjectLDMIA R6!, {R0} BLX __floatsidfBL cJSON_CreateNumberMOV R1, R9MOVS R2, R0MOVS R0, R4BL cJSON_AddItemToObjectADDS R5, # 1mov r0, r10movs r1, r4bl cjson_additemtoarraycmp r5, r11bne loc_5d84666e2

Aqui está passando pelo massivo no ciclo para.

Explicação 

R11.

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

O comprimento da matriz é armazenado, o ciclo é encontrado em três linhas:

Adiciona R5, # 1; Incremento MeterCMP R5, R11; Comparação do medidor com um longo array loc_5d84666e2; Se não for igual - ao início do ciclo

Registre Precisamos -

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

. Instrução

Estamos à procura de um código que adicione "Win" em JSON. Olhando um pouco com pontos de interrupção, encontrei esta peça.

Ldmia.

Subs.

lê um byte de

Subs.

Movimentos.

um byte e registra o valor do byte resultante em
. Nós não precisamos de tais dificuldades, precisamos escrever para 

Dois -

MOVS R0, # 2

00100 000 00000010MOVS RD IMM

Hexadecimal -

2002.

. Virar (

0220.

) e substitua.

Momento de verdade: Desconecte todos os pontos de interrupção, vá para a masmorra ...

LUCRO! O mais importante é não esquecer que é sempre necessário sair da batalha. Se você acidentalmente obter a vitória - a derrota irá para o servidor. Agora você pode mesmo desativar o dispositivo do computador. Até que o aplicativo seja reiniciado, uma biblioteca modificada pendurará em sua memória.

Em vez de aprisionamento Hacking Esta aplicação tornou-se possível em muitos aspectos devido ao fato de que os autores realmente revelaram-se que consideram o resultado no cliente. Ao mesmo tempo, no jogo online móvel, você precisa observar a tarifa entre segurança e conveniência do usuário. Se o jogo exigir uma conexão permanente, seu público cairá. Os desenvolvedores tentaram complicar a vida a potenciais hackers: fizeram criptografia de dados e fizeram o código principal no objeto compartilhado. Mas uma coisa é confusa por uma coisa - por que não são os nomes das funções? Eu não programa em C / C ++ e não sei se há tal opção no compilador. Mas se todas as funções fossem chamadas "

Leave a Reply