Jogo para Android continua sendo hackeado [fechado]

143

Então, já passamos por isso várias vezes agora, lançamos um jogo (barato) e alguém o corta e o coloca no espelho. Configuramos os Alertas do Google para todos os nossos aplicativos, para que seja informado diariamente sobre quem está fazendo o hacking. Até o momento, implementamos o serviço de licenciamento, como o Google sugeriu, nosso sal é feito aleatoriamente toda vez que a licença é iniciada com o ID do dispositivo exclusivo. Executamos o serviço de verificação uma vez, quando o aplicativo é iniciado pela primeira vez. Em seguida, geramos um hash de 512 caracteres para a chave e o valor armazenado que é comparado em SharedPreferences a partir daí.

Agora, eu sei que verificar uma vez é provavelmente onde o aplicativo está sendo bloqueado. Nosso bytecode provavelmente foi analisado e recompilado sem a linha que inicia a verificação.

A partir daqui, não quero ofuscar nosso código como já vi antes. Quero algo um pouco mais sólido e também quero aprender como fazer isso corretamente. Estou mais interessado em aprender do que em ganhar dinheiro neste momento, pois apenas 2% das pessoas jamais procurarão uma versão hackeada.

Até agora, por conta própria, criei um gerador de números aleatórios que é colocado em várias áreas de inicialização do jogo. Quando iniciada (digamos, 1 em 50 vezes), a licença é verificada. Eu sei que isso tornaria mais difícil invadir, porque o cracker teria que eliminar cada caso, compilar, eliminar, compilar. Esse método, no entanto, ainda é decifrado ... então o que vocês sugerem? Mais uma vez, estou realmente interessado nesse processo de segurança; portanto, educe, não transforme isso em uma discussão sobre ofuscação ou verificação periódica com base em um carimbo de data / hora.

obrigado

BajaBob
fonte
27
Se você não tivesse dito a si mesmo que está mais interessado em aprender do que em ganhar dinheiro, minha resposta seria simplesmente "não vale a pena a dor de cabeça". Como você está interessado na dor de cabeça em si, digo em frente (mas não tenho resposta para você, basta seguir esta pergunta como todos os outros).
Thiago Arrais
4
Se o mesmo jogo continuar sendo hackeado, você tem certeza de que não tem um membro problemático da equipe? Não a melhor coisa a considerar, mas isso pode acontecer
Phil Lello
3
Embora tenha mais de 20 mil linhas de código, eu gerencio todo o processo sozinho.
BajaBob
3
@BajaBob então você é o mole: D
Sulfkain

Respostas:

117

Minha idéia não é à prova de hackers, mas pode remover parte do interesse por invadir o jogo.

Modelo Freemium

1) Torne os primeiros 5 a 10 níveis gratuitos para que as pessoas possam aprender o jogo e se divertir sem pagar. Menos vai querer hackear o primeiro nível e o jogo se espalhará ainda mais pelo modelo Freemium.

Shareware / pacotes de nível em cluster

2) Deixe parte dos níveis ou lógica do jogo permanecer online. Por exemplo. ao atingir o nível 5 ou 10 ou 15, faça o download de pequenas partes do jogo e sempre envie o log de progresso do jogo e valide-o com os possíveis valores + códigos de hash. Talvez isso possibilite o encerramento automático de contas invadidas.

Proteção furtiva do trapaceiro

3) Você também pode contar "pequenas bandeiras de aviso" que você coloca no jogo. Não basta verificar a "validação" no início, não constrói essas bandeiras na própria lógica do jogo. Não faça isso quebrar a jogabilidade, porque ninguém o procurará. Então, quando o usuário chegar ao fim do monstro de nível, verifique se há algum sinalizador de aviso registrado. Eles não aparecerão dentro do jogo; portanto, o usuário desconhecido com uma edição hackeada pode estar jogando por horas / dias e, de repente, percebe que não pode terminar o jogo ou avançar para o próximo nível, porque o jogo possui um "bug". O que o usuário não sabia era que esse bug ocorre apenas em clientes invadidos.

Conclusão

Seja mais esperto que os biscoitos. Engane-os a pensar que o trabalho foi feito. Faça uma proteção contra cópia e saiba que os crackers mais avançados poderão removê-la. Mas eles provavelmente não querem jogar 50 níveis para verificar se o crack também funciona até o fim.

Quando eles perceberem esse problema, eles também poderão começar a resolvê-lo. Mas se você dividir o jogo em pacotes de nível, ainda poderá validar entre cada download de pacote. Portanto, depois de receber dados de hash do cliente invadidos, basta executar uma exceção e travar o jogo no cliente. Ops, o jogo travou. Não conte porque é hackeado. Pode ocorrer um erro no programa. :-)

Novamente, não é à prova de hackers. Mas isso pode incomodá-los o suficiente para passar para o próximo jogo. Por fim, você também pode lançar atualizações regulares para o jogo e apenas a versão mais recente deve poder "postar os registros" etc., para que os usuários ativos precisem atualizar para se manter atualizados.

BerggreenDK
fonte
5
Uau, idéias incríveis. Realmente aprecio tudo isso, nunca pensei em elevar os níveis e publicá-los em um servidor e validá-los. Versoning ... ótima idéia. Mantenha todos atualizados, torne irracional o crack. Muito obrigado, isso vai me manter ocupado por um tempo!
BajaBob
12
Suspiro, pena que você não pode +2 uma resposta :) Um comentário: Como você pode mostrar que o problema está no jogo pirata? Se o jogo ficar estranho / estranho em uma cópia pirata, as pessoas podem pensar que é um bug e falar mal do jogo nos fóruns. Eu não acho que esse seja um problema tão grande no Android, já que não há tantos fóruns com um grande público, mas me pergunto se faz sentido ter um aviso antecipado de que "cópias piratas podem não funcionar corretamente".
EboMike
3
Lembro-me de um jogo de 1978 no TRS80 que funcionaria aleatoriamente se a proteção contra cópia fosse removida. Havia apenas uma verificação de validade, e removê-la significava que você podia copiar livremente o jogo, mas os estranhos erros de jogabilidade não ocorriam em cópias legítimas, apenas em cópias invadidas. Ninguém pensou que era culpa do desenvolvedor ... nós sabíamos o que estava acontecendo.
Fixee
1
@EboMike Acho que a parte mais forte da minha ideia para a proteção contra cópias é "agir da maneira mais normal possível", nem mesmo dar aos crackers uma pista de quais esquemas de proteção desagradáveis ​​estão por vir. Isso apenas deixaria os mais curiosos deles caçando a proteção. Apenas pela diversão. Lembre-se, muitos deles não fazem isso pelo dinheiro, mas apenas porque podem exibi-lo. Portanto, não os tente. Apenas aja casual. : o) Seja mais esperto que eles.
precisa
2
@Fixee e outros O recente jogo Batman Arkham Asylum tinha algo parecido com isso: nas cópias piratas, um movimento crucial seria fracassado e você ficaria preso bem no início do jogo. Então, quando alguém se queixa do "bug" nos fóruns, o desenvolvedor pode sorrir e dizer "não é um bug no jogo, é um bug no seu código moral".
Nzall #
20

Eu tenho feito alguns descompiladores e hackers por um tempo (não warez, mas mods e hacks principalmente para o google apps e a estrutura android, sempre respeitando as políticas xda-developers).

Depois que você aprende a ler smali, é quase como ler o código java original (mas com muito mais LOCs). Portanto, qualquer código adicionado para verificar as chaves pode ser encontrado, excluído ou substituído. Você nem precisa recompilar a cada vez para eliminar mais de um (algumas pesquisas fazem milagres para encontrar partes semelhantes de código) e, mesmo que sejam necessários ciclos de compilação / recompilação para encontrá-los, é apenas uma questão de um ou dois minutos descompilar: tudo é automatizado pelo apktool e ainda mais pelo apkmanager.

Dito isso, minha sugestão é que você implemente algum tipo de tabela de pontuação on-line ou similar e, quando o usuário olha para a tabela de pontuação on-line, você pode verificar o código de hash implementado e compará-lo com a conta do gmail associada. Dessa forma, você pode denunciar o hack ao google e enviar uma mensagem desagradável ao usuário do warez, explicando por que isso é ilegal.

Obviamente, um novo hack poderia ser implementado para eliminar a tabela de pontuação, mas isso reduziria o interesse pelo warez.

Boa sorte.


Atualizar

Depois de pesquisar para responder a essa pergunta: Injetando código no APK (realmente sobre o mecanismo Amazon DRM), posso contar um pouco sobre como a Amazon está protegendo os aplicativos: inclui métodos para verificar a validade da instalação em todos os lugares (você pode ver um exemplo de como eles fazem isso na minha resposta a essa pergunta). Isso fará com que qualquer tentativa de invadir um aplicativo não seja muito difícil, mas extremamente tediosa. Acredito que esse seja um ponto forte: os hackers não vão querer gastar tanto tempo realizando tantas tarefas repetitivas: não é desafiador e é chato. A principal falha que vejo nessa abordagem é a possibilidade de invadir o próprio aplicativo da Amazon para sempre retornar uma resposta válida, é claro. Mas, se você misturar suas verificações de hash atuais com algum tipo de verificação on-line dispersa entre seus métodos, acredito que as chances de ser hackeado podem ser drasticamente reduzidas.

Aleadam
fonte
3
Devo mencionar que muitas pessoas têm um problema com os aplicativos "ligando para casa". Pessoalmente, isso é estúpido - um telefone Android 'telefona para casa' de tantas maneiras e com tanta frequência que isso realmente não importa, e qual é o problema de uma verificação anônima de verificação de licença? Ainda queria jogar isso fora - algumas pessoas jogam um grande fedor sobre "ligar para casa", especialmente quando não é divulgado.
EboMike
3
Bem, é compreensível que as pessoas possam ter um problema se o aplicativo 'ligar para casa' e não avisar o usuário. Mas um web-based tabela de pontuação resolve que desde que é o usuário que voluntariamente se conecta
Aleadam
É verdade, mas depois de usar a conexão que deveria "anonimamente" enviar as pontuações e enviar o hash da conta do Gmail, é um problema diferente. Novamente: Não para mim. Eu acho que isso é perfeitamente razoável e, pessoalmente, ficaria tentado a implementar esse esquema no meu próprio aplicativo. As pessoas que se queixam estarão em minoria (e, muito provavelmente, comprarão o aplicativo independentemente).
EboMike
Por que você descompilou a estrutura, em vez de baixar o código-fonte?
9116 Phil Lello
1
@ Phil, você não tem acesso ao código-fonte do touchwiz ou detecta os FWs; portanto, se você quiser modificar um telefone específico, às vezes a maneira mais fácil é descompilá-lo e trocar os smalis.
Aleadam
20

Retirado da minha solução deste post Evite apk cracked

Implemente sua própria biblioteca de licenciamento

Também sugiro que você verifique isso na gravação do Google I / O 2011 no YouTube:

Fugindo de piratas e parando vampiros

EDITAR:

As notas de apresentação de Evasão de piratas e parada de vampiros

Alguns pontos-chave básicos

TryTryAgain
fonte
Os links acima parecem nem sempre ir para a página vinculada ... parece funcionar apenas às vezes e depende de SO e navegador. Portanto, observe o final #%3ar.page.15nos URLs. Se você não for redirecionado automaticamente para essa página, verifique o link para ver onde / em que página você deveria estar.
TryTryAgain
1
Agradável! Vejo que eles também acreditam no Freemium e escondem certos "erros" dentro do jogo (apenas usando uma técnica de licenças). Eu gostaria de uma solução de plataforma cruzada em vez de um servidor de licença somente para Android. Mas interessante também.
amigos estão dizendo
btw. é engraçado, esta resposta tem 15 polegares para cima, a mina tem atravessado 90 e já não se considerar a resposta certa :-)
BerggreenDK
8

Sei que você não está realmente ofuscado, mas realmente preciso reagir a isso:

A partir daqui, não quero ofuscar nosso código como já vi antes. Quero algo um pouco mais sólido e também quero aprender como fazer isso corretamente.

O ProGuard é muito confiável em minha experiência, e isso embora eu use alguns recursos avançados, como AIDL e algum código nativo que chama método Java. É preciso um pouco de trabalho para ler a documentação e fazer as coisas corretamente, mas quando você estiver O ProGuard é extremamente confiável e também otimiza seu aplicativo.

Segurança personalizada / truques criptográficos são bons, mas sem ofuscação é como jogar uma pedra na água na minha humilde opinião.

Eu uso o ProGuard em produção há muitos meses, e ele funciona perfeitamente.

Se você estiver aprendendo, leia o manual do ProGuard com cuidado, experimente-o e inspecione seus logs de saída.

olivierg
fonte
qualquer coisa que possa ser lida também pode ser descompilada, é apenas uma questão de energia e teimosia da CPU. A ofuscação ainda permite que o código seja executado. Ao descompilar / desobstruir o código, o cracker ainda pode comparar a versão em execução com a original. Pode atrasar o cracker ou parar o cracker menos experiente, mas não é à prova de falhas.
BerggreenDK
4

A chance de que haja programadores mais talentosos do que VOCÊ (aplica-se a todos os programadores) é de 100%. E se isso for verdade, você não pode consertar hackers. Mas você pode gastar tanto tempo e esforço para ir à falência.

Se você quer ganhar muito dinheiro, precisa fazer uma pesquisa no seu grupo de usuários-alvo e na ciência do comportamento. Você precisa criar usuários que tragam dinheiro novo, e é isso.

Além disso, você entendeu tudo errado. Os hackers são membros mais ativos da sua base de usuários, apenas se comportam de uma maneira que você não pretendia.

Pegue os jogos da Zynga no Facebook, por exemplo, você acha que foi hackeado? - Claro, e cerca de 100.000 jogadores só jogam, porque você pode usar bots, que automatizam tudo.

Ter uma enorme base de usuários ativa de pessoas reais faz com que os jogadores do tipo arquivador desejem jogar o jogo - e se você jogar, e parecer legal, o Avarage Joe também desejará jogar. Se o Avarage Joe jogar, seus amigos poderão querer jogar, e o seu provavelmente não se importará com nada, sendo melhor que o seu amigo, perdendo tempo ou tendo algo para conversar. Os amigos médios de Joe provavelmente estarão dispostos a pagar para serem melhores que Joe, mas você gostaria de investir em algo que os torne capazes de melhorar.

Além disso, se o valor real é jogar o jogo de graça, os usuários que usam a versão hackeada gratuita provavelmente nunca teriam pago por isso. Mas tu és o Avarage Joes e os amigos deles podem. Portanto, este é o comercial mais barato que você pode ter. Se você quiser ganhar dinheiro com sua grande base de usuários, faça novas versões do jogo com pequenas alterações nos níveis e gráficos.

Margus
fonte
3

A pirataria sempre será um problema. Por grandes crackers são melhores em jogar este jogo de segurança, embora obscuridade do que os desenvolvedores.

torre
fonte
2

Que pergunta interessante e perturbadora. :-) Como exercício, você pode tentar lançar um aplicativo pela Amazon; eles têm seu próprio mecanismo de DRM; Gostaria de saber se funciona melhor do que o ProGuard ...

George Freeman
fonte
1
A partir de hoje, o aplicativo Lucky Patcher também quebrou o Amazon DRM! Além do ProGuard, outra solução pode ser o DexGuard. Mas DexGuard custa algumas centenas de euros para comprar, mas não se pode ter certeza que mesmo ele pode proteger seus códigos de ser pirateado ...
ChuongPham
2

Um dos elementos-chave na minha opinião é espalhar o código para que não fique tudo em um só lugar. Se você tiver uma função chamada LicenseChecker.checkLicense () que recupera a licença e a verifica, pode ter certeza de que será desabilitada imediatamente.

A única vantagem que você tem é que os crackers não podem ver os comentários do seu código (e, se você ofuscar nomes de métodos / variáveis), então crie algo estranho. No onCreate () de uma atividade, você obtém o ID da licença. Em onResume (), você obtém outro valor para comparar. Talvez crie um thread e faça algumas verificações lá. E então, outro código irrelevante (talvez o controle do jogador) pode pegar o valor, compará-lo e armazenar o resultado em algum lugar. Em seguida, outros três trechos de código irrelevantes verificarão independentemente esse valor e desabilitarão seu aplicativo se ele não corresponder.

Agora, devo dizer antecipadamente que isso pode causar dor de cabeça para você - obviamente, código desorganizado e desagradável é mais difícil de depurar e propenso a causar erros. Na pior das hipóteses, você cria falsos positivos em aplicativos adquiridos legitimamente.

E, é claro, tudo pode ter engenharia reversa - uma vez que os crackers encontram o local em que o aplicativo está desativado, eles remontam ao valor que está sendo lido. Eles poderiam rastrear de volta onde está sendo armazenado e rastrear isso de volta ..... ou, muito mais fácil, eles podem simplesmente desativar a verificação final (é por isso que eu recomendei 3 lugares diferentes, todos com atraso). A segurança é tão boa quanto o elo mais fraco.

Você não será capaz de parar a pirataria. Sua melhor aposta é atrasar a propagação de uma cópia pirata até que o hype inicial sobre seu aplicativo se acalme.

EboMike
fonte
1

Primeiro, eu NÃO me considero um profissional no campo da segurança de SW, mas:

Penso que uma coisa importante é permitir que a aplicação dependa em parte da verificação de assinatura. Não deixe afetar imediatamente, mas defina alguns sinalizadores ou altere alguns valores. mais tarde, use esses sinalizadores, verifique-os, deixe a ausência / incorreto deles causar uma exceção de algum tipo que talvez encerre o aplicativo. Desde que a verificação da assinatura seja relevante apenas no momento, é fácil ignorá-la, remover a linha, uma vez que ela toca mais áreas do código, seu aplicativo fica mais difícil (ou menos fácil ...) de hackear. Além disso, a meu ver, nem todas as verificações devem chamar a mesma rotina para a sanção, porque isso também facilitará a localização e o encerramento do mecanismo de proteção.

Obviamente, a sanção a ser tomada em casos de SW ilegal pode variar. Você pode travar o aplicativo quando usado ilegalmente, mas também pode mantê-lo em execução e enviar apenas uma mensagem solicitando que o usuário compre uma cópia legal do aplicativo.

Se é exatamente isso que você não queria ouvir, desculpe pelo seu tempo :)

MByD
fonte
7
Fazer o seu aplicativo travar quando você detectar que foi pirateado pode sair pela culatra, a menos que você seja muito explícito por isso que ele travou. Lembro-me de ler sobre alguns desenvolvedores de jogos que fizeram seu jogo travar após um período aleatório, se ele falhou em uma verificação antipirataria. É claro que muitas pessoas o piratearam, mas não perceberam que as falhas ocorreram porque estavam executando uma versão pirata. Isso resultou em muita má imprensa para os desenvolvedores e pode ter prejudicado suas vendas.
Mitch Lindgren
3
@ Mitch - eu concordo. Eu dei isso como uma possibilidade, mas a melhor estratégia técnica talvez não seja provavelmente a melhor estratégia de "negócios".
MByD
0

Os usuários do Android apenas aceitarão a dor das constantes casas telefônicas. O único aplicativo Android seguro é um aplicativo Android sempre conectado.

Isso se deve, em grande parte, à recusa do Google em bloquear a instalação, como a Apple. No IOS, você precisa fazer o jailbreak do telefone. No Android, você pode carregar qualquer APK em um estoque, instalar de fábrica.

Mantenha parte / a maioria / todo o seu conteúdo no servidor; entregá-lo em pedaços; validar a licença / sessão em cada chamada.

yetimoner
fonte
Esclarecimento: embora você possa fazer o root em qualquer uma das plataformas, apenas uma pequena porcentagem dos usuários do IOS realmente terá medo de realizar a instalação da instalação. Também em muitas partes do mundo é difícil ou impossível pagar por um aplicativo Android, alimentando a pirataria.
yetimoner
Essa foi realmente uma das idéias da minha resposta de 2011 ... por que publicá-la novamente?
precisa
0

Será incrivelmente difícil inibir esse tipo de comportamento. Tudo o que é tratado no lado do cliente pode ser hackeado usando a descompilação e modificação do APK, edição de memória com software como o Game Guardian ect.

A única maneira de ver como se locomover parcialmente seria fazer um jogo online. Ou tem certas funções manipuladas online. Ou se a criptografia anti-adulteração como o denuvo já estiver disponível para Android / iOS.

Techinator
fonte