android - 保护应用内购买免受 Freedom Hack

标签 android

我已经彻底搜索了这个网站以及其他网站的答案,但没有找到真正的答案。

我的问题是 Freedom Hack(它允许用户无需付费即可获得应用内购买)究竟是做什么的。也就是说,改变了过程的哪一部分。我找到了this list黑客适用的应用程序,以及其中一些条目的日期为本月,这意味着它尚未完全修复。我看到的响应是“验证服务器中的应用程序”,但是如果黑客攻击改变了 Java.Security 的签名验证功能,所以它总是返回 true,那么在服务器中添加我自己的签名不会帮助很大。

最佳答案

不知道作者是否还关注这个话题。但是我花了一些时间在我的项目中找出(谷歌搜索)自由的工作方式以及如何防止它(直到他们更新自由的工作方式)并且它有效。我的实现非常简单,不需要通过向服务器发送请求来验证(这会影响性能并需要花费更多的精力来实现)。

freedom 的当前实现是将 java.security.Signature.verify(byte[]) 的所有方法调用替换(重定向)到一个freedom 的jni 方法,而这又只是简单的总是返回 true(或 1)

看看java.security.Signature.verify(byte[]):

 public final boolean verify(byte[] signature) throws SignatureException {
        if (state != VERIFY) {
            throw new SignatureException("Signature object is not initialized properly");
        }
        return engineVerify(signature);
    }

这里的 engineVerify 方法是一个 abstract protected 方法,它首先定义在 java.security.SignatureSpi(Signature extends SignatureSpi )。 好的,够了,因为我不再相信 java.security.Signature.verify(byte[]) 方法,我会直接使用 engineVerify 方法。为此,我们需要使用反射。修改IABUtil/Securityverify方法:

public static boolean verify(PublicKey publicKey, String signedData, String signature) {
        Signature sig;
        try {
            sig = Signature.getInstance(SIGNATURE_ALGORITHM);
            sig.initVerify(publicKey);
            sig.update(signedData.getBytes());
            if (!sig.verify(Base64.decode(signature))) {
                Log.e(TAG, "Signature verification failed.");
                return false;
            }
            return true;
        } catch (...) {
            ...
        }
        return false;
    }

收件人:

public static boolean verify(PublicKey publicKey, String signedData, String signature) {
        Signature sig;
        try {
            sig = Signature.getInstance(SIGNATURE_ALGORITHM);
            sig.initVerify(publicKey);
            sig.update(signedData.getBytes());
            Method verify = java.security.SignatureSpi.class.getDeclaredMethod("engineVerify", byte[].class);
            verify.setAccessible(true);
            Object returnValue = verify.invoke(sig, Base64.decode(signature));
            if (!(Boolean)returnValue) {
                Log.e(TAG, "Signature verification failed.");
                return false;
            }
            return true;
        } catch (...) {
            ...
        }
        return false;
    }

这很简单,但它适用于当前的自由实现,直到他们将来更新其算法。

关于android - 保护应用内购买免受 Freedom Hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966369/

相关文章:

android - 有没有办法从网络获取应用程序图标(通过给定的包)?

android - 当我 "remove"来自 Apple 和 Android App Store 的付费应用程序时会发生什么?

Android - 带子菜单的滑动菜单

java - 如何向超过 2 天未进入应用程序的用户发送推送通知?

android - 如何按顺序发送多个截击请求并在单个监听器中处理它们

android - 按重量更改Android中抽屉的宽度?

android - 如何将谷歌地图添加到现有的 android studio 项目中

android - 如何在 Flutter 发布的 apk 中禁用代码混淆?

java - 如何覆盖抽屉导航按钮行为并更改图标?

java - '列表<T >' may not contain type objects of type ' 对象'