我开发了一款非常受欢迎的应用程序,有人破解了它。我想知道是否有人知道,首先:如何?,如果有人知道任何解决方法来避免这种情况。该应用按照谷歌示例使用应用内购买以这种方式解锁一些高级功能:
private IabHelper mHelper;
if (!isPro(getActivity())) {
mHelper = new IabHelper(getActivity(), KKK);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
return;
}
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null) return;
// IAB is fully set up. Now, let's get an inventory of stuff we own.
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null) return;
// Is it a failure?
if (result.isFailure()) {
return;
}
Purchase pro = inventory.getPurchase(PRO_STRING);
SettingsProvider.putSecBoolean(getActivity(), "pro", pro != null && verifyDeveloperPayload(pro));
}
};
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (mHelper == null) return;
if (result.isFailure()) {
return;
}
if (purchase.getSku().equals(PRO_STRING)) {
SettingsProvider.putSecBoolean(getActivity(), "pro", true);
}
}
};
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) {
mHelper.dispose();
mHelper = null;
}
}
对于购买流程:
mPro.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RandomString randomString = new RandomString(36);
String payload = randomString.nextString();
if (mHelper != null) mHelper.flagEndAsync();
mHelper.launchPurchaseFlow(getActivity(), PRO_STRING,
IabHelper.ITEM_TYPE_INAPP, RC_REQUEST,
mPurchaseFinishedListener, payload);
}
});
好的,有人以某种方式破解了它。这意味着专业版中提供的内容是免费的,无需付费。也许有人可以分享他的经验并提出一些避免这种情况的方法?
而且,有谁知道如何做到这一点?谢谢
最佳答案
简要说明
Android 应用程序很容易被破解。首先,如果你没有对你的代码使用任何混淆(ProGuard,DexGuard,..),代码可以通过使用像JD-GUI.这样的工具轻松阅读和理解。在某些情况下,smali
代码也很容易理解。
混淆本身并不能使您免于破解。市场上有去混淆器,但具有高超逆向工程技能的人仍然能够弄清楚如何绕过您(或 Google 的)保护。
最后,有 LuckyPatcher .这可能是最著名的破解 Android 应用程序保护的工具。它专门针对某些类型的保护(Google 的 LVL
、IAP
、广告网络……)并尝试在统计基础上删除它们。事实上,它不能保证 100%,但在绝大多数情况下它都能正常工作。
那么如何保证安全呢?
你根本做不到
。没有完美的 100% 安全性,尤其是在移动环境中。但是,您可以做的是尝试使黑客的工作尽可能困难。
一些想法:
- 总是混淆视听。它不会对您的应用造成任何损害(如果配置正确),并且它将为您的代码提供另一层保护。
- 使用 DexGuard 的篡改检测功能。这肯定会降低您的应用在更新发布两天后被破解的几率。
还有几个,我想起来了会尽快补充。
关于android - 谷歌内购及破解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22220588/