能很多人再次发怵,本来就没弄过 Android 程序,现在一上来就是个混淆过的款,叫人怎么活啊!不要急,其实,被 Proguard 混淆过的代码还是有办法弄的,如有主要的几个类,如 Service、Activity 等类名是不能被混淆的,不过这不是我们今天要讲的重点。 我们接着分析,回想一下,我们在安装运行程序时,程序弹出了一个 Message,想想我 们在 OD 中破解 Windows 程序时用到的字符串参考,在这里是否可用呢?回答是:可以!我们在编译 Android 程序时,定义的字符串都保存在一个名收 Strings.xml 的文件中,编译生 成 APK 后它也被加密打包到程序中了,而程序通过为每个字符串分配一个 ID 来进行调用, 这些 ID 被保存在 public.xml 文件中。我们在刚才反编译的 XML 文件中找找就可以发现在 res/values 下有这两个文件,我们打开 strings.xml 并查找之,很快可以发现如下两行: <string name="expired_title">产品过期</string> <string name="expired_message">这是一个有使用期限的版本,从 2012 年 1 月 1 日开始 此版本已过期, 请确保网络通畅,并立即检查升级。</string> 这两行字符串正是前面运行程序时弹出的 MessageBox 的标题与文字。我们在这里记下 它们的名字 为 expired_title 与 expired_message 。打 开 strings.xml 文件查 找 expired_title 与 expired_message 则可以找到下面两行: <public type="string" name="expired_title" id="0x7f060166" /> <public type="string" name="expired_message" id="0x7f060167" /> 找到了这两个 ID 就好办了,我们下面来看看 Android 程序中是如何构建一个字符串的,修 改刚才的 HelloAndroid 代码如下: public class HelloAndroidActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ShowString(); } public void ShowString(){ String str = getString(R.string.hello); Toast.makeText(getApplicationContext(), str,Toast.LENGTH_SHORT).show(); } } 重新生成 APK 后并编译代码如下: # virtual methods .method public ShowString()V .locals 3 .prologue .line 16 const/high16 v1, 0x7f04 invoke-virtual {p0, v1}, Lcn/feicong/HelloAndroid/HelloAndroidActivity;->getString(I)Ljava/lang/String; move-result-object v0 .line 17 .local v0, str:Ljava/lang/String; invoke-virtual {p0}, Lcn/feicong/HelloAndroid/HelloAndroidActivity;->getApplicationContext()Landroid /content/Context; move-result-object v1 const/4 v2, 0x0 invoke-static {v1, v0, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequen ce;I)Landroid/widget/Toast; move-result-object v1 invoke-virtual {v1}, Landroid/widget/Toast;->show()V .line 18 return-void .end method .method public onCreate(Landroid/os/Bundle;)V .locals 1 .parameter "savedInstanceState" .prologue .line 11 invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V .line 12 const/high16 v0, 0x7f03 invoke-virtual {p0, v0}, Lcn/feicong/HelloAndroid/HelloAndroidActivity;->setContentView(I)V |