Procurando encontrar a melhor maneira de prevenir / detectar spoofing de GPS no Android. Alguma sugestão sobre como isso é feito e o que pode ser feito para impedir? Eu estou supondo que o usuário tem que ativar locais fictícios para falsificar o GPS. Se isso for feito, eles podem falsificar o GPS?
Eu acho que eu precisaria apenas detectar se Mock Locations estão habilitados? Alguma outra sugestão?
Respostas:
Eu fiz algumas investigações e compartilhei meus resultados aqui, isso pode ser útil para outros.
Primeiro, podemos verificar se a opção MockSetting está ativada
Em segundo lugar, podemos verificar se existem outros aplicativos no dispositivo, que estão usando
android.permission.ACCESS_MOCK_LOCATION
(aplicativos de spoofing de localização)Se os dois métodos acima, o primeiro e o segundo, forem verdadeiros, há boas chances de que o local seja falsificado ou falso.
Agora, o spoofing pode ser evitado usando a API do Location Manager.
Podemos remover o provedor de teste antes de solicitar as atualizações de localização de ambos os provedores (rede e GPS)
Eu vi que removeTestProvider (~) funciona muito bem com Jelly Bean e versões posteriores. Este API parecia não ser confiável até o Ice Cream Sandwich.
fonte
android.permission.ACCESS_MOCK_LOCATION
permissão pararemoveTestProvider
funcionar, o que eu acho que é a maior desvantagem.isMockSettingsON()
,Location.isFromMockProvider()
eareThereMockPermissionApps()
com uma lista negra de aplicativos. Existem muitos aplicativos de sistema pré-instalados comACCESS_MOCK_LOCATION
permissão, por exemplo, em dispositivos HTC e Samsung. Uma lista de permissões de todos os aplicativos legítimos seria melhor, mas uma lista negra dos aplicativos de falsificação de localização mais populares funcionou bem no meu caso. E também verifiquei se o dispositivo estava enraizado.Desde a API 18, o objeto Location tem o método .isFromMockProvider () para que você possa filtrar localizações falsas.
Se você quiser oferecer suporte a versões anteriores à 18, é possível usar algo assim:
fonte
isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
Parece que a única maneira de fazer isso é evitar o spoofing de local que impede MockLocations. O lado negativo é que alguns usuários usam dispositivos GPS Bluetooth para obter um sinal melhor, eles não poderão usar o aplicativo, pois são obrigados a usar os locais fictícios.
Para fazer isso, fiz o seguinte:
fonte
return !x
vez deif(x) return false; else return true
.Tropecei neste tópico alguns anos depois. Em 2016, a maioria dos dispositivos Android terá nível de API> = 18 e, portanto, deve contar com Location.isFromMockProvider () como apontado por Fernando .
Eu experimentei extensivamente com locais falsos / simulados em diferentes dispositivos e distros Android. Infelizmente .isFromMockProvider () não é 100% confiável. De vez em quando, um local falso não será rotulado como fictício . Isso parece ser devido a alguma lógica de fusão interna incorreta na API de localização do Google.
Eu escrevi uma postagem detalhada no blog sobre isso , se você quiser saber mais. Para resumir, se você se inscrever para receber atualizações de localização da API Location, ativar um aplicativo GPS falso e imprimir o resultado de cada Location.toString () no console, você verá algo assim:
Observe como, no fluxo de atualizações de localização, uma localização tem as mesmas coordenadas que as outras, mas não é sinalizada como uma simulação e tem uma precisão de localização muito pior.
Para resolver esse problema, eu escrevi uma classe de utilitário que vai locais fictícios de forma confiável suprimir em todas as versões do Android modernos (nível API 15 e acima):
LocationAssistant - atualizações de localização sem complicações no Android
Basicamente, ele "desconfia" de locais não fictícios que estão a 1km do último local fictício conhecido e também os rotula como fictícios. Ele faz isso até que um número significativo de locais não simulados chegue. O LocationAssistant pode não apenas rejeitar locais fictícios, mas também livra você da maior parte do incômodo de configurar e assinar atualizações de locais.
Para receber apenas atualizações de localização real (ou seja, suprimir simulações), use-o da seguinte maneira:
onNewLocationAvailable()
agora só será invocado com informações de localização real. Existem mais alguns métodos de ouvinte que você precisa implementar, mas no contexto da sua pergunta (como evitar spoofing de GPS), é basicamente isso.Obviamente, com um sistema operacional enraizado, você ainda pode encontrar maneiras de falsificar informações de localização que são impossíveis de serem detectadas por apps normais.
fonte
Se você souber a localização geral das torres de celular, poderá verificar se a torre de celular atual corresponde ao local fornecido (dentro de uma margem de erro de algo grande, como 10 milhas ou mais).
Por exemplo, se seu aplicativo desbloquear recursos apenas se o usuário estiver em um local específico (sua loja, por exemplo), você pode verificar GPS, bem como torres de celular. Atualmente, nenhum aplicativo de falsificação de GPS também falsifica as torres de celular, então você pode ver se alguém em todo o país está simplesmente tentando falsificar seus recursos especiais (estou pensando no aplicativo Disney Mobile Magic, por exemplo).
É assim que o aplicativo Llama gerencia a localização por padrão, uma vez que verificar as ids das torres de celular consome muito menos bateria do que o GPS. Não é útil para locais muito específicos, mas se casa e trabalho estiverem a vários quilômetros de distância, ele pode distinguir entre os dois locais gerais com muita facilidade.
Claro, isso exigiria que o usuário tivesse um sinal de celular. E você teria que saber todas as ids de torres de celular na área --em todos os provedores de rede - ou você correria o risco de um falso negativo.
fonte
tente este código é muito simples e útil
fonte
Este script está funcionando para todas as versões do Android e eu o encontrei após muitas pesquisas
fonte
Você pode adicionar verificação adicional com base na triangulação da torre de celular ou nas informações dos pontos de acesso de Wi-Fi usando a Google Maps Geolocation API
A maneira mais simples de obter informações sobre CellTowers
Você pode comparar seus resultados com o site
Para obter informações sobre pontos de acesso Wifi
fonte