防止 Android 应用程序被修改

3
通过谷歌搜索,我发现我的带广告的免费应用在一些网站上以“app_name_ad_free_mod_hacked”的标题发布。在我个人手机上尝试安装此应用程序后,它可以正常工作但没有广告显示。甚至我注意到它不会发出广告请求。

是否有解决方案可以防止应用被修改?

P.S:我正在使用ProGuard,并且已经反编译了修改后的APK文件,但我没有注意到与原始应用程序有任何区别。

以下是我代码中广告的初始化方式:

MainActivityonCreate()中:

MobileAds.initialize(getApplicationContext(), "admob_app_id");
mAdView = findViewById(R.id.adView_fragment_ads);
layout_ads = findViewById(R.id.layout_fragments_ads);
start_ad();

并且方法:
private void start_ad() {
        try {
            if (data_ne_db[0].equals("jo")) {
                AdRequest adRequest = new AdRequest.Builder()
                        .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                        .addTestDevice(getResources().getString(R.string.ads_test_device))
                        .addTestDevice(getResources().getString(R.string.ads_test_device_facebook))
                        .build();
                //mAdView.setAdUnitId(getResources().getString(R.string.ads_kryesorja_poshte));
                //mAdView.setAdSize(AdSize.LARGE_BANNER);
                mAdView1.loadAd(adRequest);
                mAdView1.setAdListener(new AdListener() {
                    @Override
                    public void onAdLoaded() {
                        mAdView1.resume();
                        mAdView1.setVisibility(View.VISIBLE);
                        u_inicializua = true;
                    }

                    @Override
                    public void onAdClosed() {
                        Log.e("ADDD CLOSEEEED", "Ads is closed by user)");
                    }

                    @Override
                    public void onAdFailedToLoad(int errorCode) {
                        mAdView1.pause();
                        Log.e("AD FRAG 2", "Ads failed to load" + " error : " + errorCode);
                        u_inicializua = false;
                    }
                    @Override
                    public void onAdLeftApplication() {
                    }

                    @Override
                    public void onAdOpened() {
                    }
                });
            }
        } catch (Exception ignored) {}
    }

也许有人会在方法调用或数据库中注入注释,那么如何防止呢?

人们可以下载 APK 文件,通过反向工程来“打开”它。APK 就像一个包含源代码的 zip 文件(例如,尝试将 example.apk 重命名为 example.zip,你就会看到发生了什么)。你可以混淆代码,使用 ProGuard 等等,但往往还是有办法获取源代码。 - Alberto Miola
保留所有内容在服务器上...应用程序只显示视图。想象一下使用用户详细信息的应用程序...例如Facebook。没有任何东西在本地...很可能他们有一个API密钥。类似于Firebase/Parse。但是,对于Parse,您可以编写云代码(现在在服务器上),但是如果用户没有主密钥,则无法运行API,因为服务器中的方法需要主密钥。 - letsCode
我的应用程序应该保持本地化,我只想保护广告,没有其他的。所以我的意思是,人们可以做任何他们想做的事情,但不能禁用广告。 - EAK TEAM
没有什么能让那停下来。然而,大多数使用应用程序的人不知道如何做到这一点,或者没有资源/技术背景来实现它。 - letsCode
我知道它无法被完全阻止,但或许可以做些事情让它变得更加困难……我不知道该怎么办,也许需要进行多次检查、运行时检查等。 - EAK TEAM
显示剩余2条评论
1个回答

4
使黑客攻击变得不可能:我不知道是否有答案。
你可以做的是:有一些付费工具,如dexguard。你可以使用它们。付费的替代品可能比免费的更有效。
尽管如此,专家级黑客可能会进入您的代码。但是,破解dexguard并不是一件简单的事情。此外,它还具有运行时自我保护、代码优化等功能。

我的一些未使用的想法:-P | 客户端

  • 检查应用程序安装的位置。使用PackageManager
  • 验证已安装应用程序的签名/在服务器上放置签名|检查是否与应用程序签名匹配
  • 编写代码,即使是您自己在完成一天后也无法阅读。 糟糕地命名类,错误地命名它们。例如:Class ABACAS处理任务ABACAS,类SACABA执行任务SACABA - 将它们的名称颠倒。此外,方法delegate返回称为delegate的某个值,而方法stack返回stack。将它们反向命名。

这意味着:Class ABACAS将执行SACABASACABA将执行ABACAS和方法delegate将返回stack,而方法stack将返回delegate


如果您的应用程序依赖于服务器(我的意思是您的应用程序只是客户端,服务器执行任务,具有API并进行发送-接收)。只需向您的应用程序请求来自服务器的签名。如果签名匹配,则继续执行下一步,否则返回。

如果有人在连接服务器时仍然发送虚假的apk签名,但仍修改了应用程序怎么办? - Akshay Shinde
@AkshayShinde 你应该如何模拟签名?实际上,我在谈论的是Firebase应用程序签名验证的工作原理。 - exploitr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接