package com.cheng.securitystudy.activity; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; import com.cheng.base.BaseActivity; import com.cheng.securitystudy.R; import com.cheng.utils.security.EncryptionUtil; /** * APK保护方法之四:防止内存修改 * 防止”八门神奇”通过内存数据 */ public class PreventMemoryChangeActivity extends BaseActivity { private TextView mShowGoldTV; private CheckBox mKeepSafeCB; private int mGold; private String mGoldMD5; // 变量mGoldMD5用来存放加密后的mGold值 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preventmemorychange); initView(); initData(); } private void initView() { this.mShowGoldTV = findViewByID(R.id.sdi_showgold_tv); this.mKeepSafeCB = findViewByID(R.id.sdi_keepsafe_cb); } private void initData() { this.mGold = 0; this.mGoldMD5 = EncryptionUtil.md5Encode(mGold + ""); } public void plusGold(View v) { boolean keepSafe = this.mKeepSafeCB.isChecked(); if (!keepSafe) { /* 未加密 */ ++mGold; mGoldMD5 = EncryptionUtil.md5Encode(mGold + ""); mShowGoldTV.setText("Gold : " + mGold); } else { /* 加密 每次使用gold值时都对获取的gold进行md5加密然后与goldMd5进行比较。 如果不相同,说明gold值被修改了。我们可以判断为**了, 这里对**的处理是把gold值改为0,并提示**。如果加密数据使用的des算法, 还可以通过解密goldMd5,来获取真实的gold值 */ if (EncryptionUtil.md5Encode(mGold+"").equals(mGoldMD5)) { ++mGold; mGoldMD5 = EncryptionUtil.md5Encode(mGold + ""); mShowGoldTV.setText(mGold + ""); } else { mGold = 0; mGoldMD5 = EncryptionUtil.md5Encode(mGold + ""); mShowGoldTV.setText(mGold + ""); toast("不要作弊..."); } } } }