本帖最后由 小试锋芒 于 2013-12-20 08:27 编辑
这个程序的Free版有一些功能上的限制:锁定一个月以前的日子才能排盘及论断项目。
来到注册激活页面,输入任意的激活码,弹出如下提示:
下面开始破解过程:
1、APK反编译。
2、搜索字符串“序号错误或此序号已经注册”,找到\res\values-zh-rCN\strings.xml文件中
3、“序号错误或此序号已经注册”对应的string name为"register_error",因此搜索register_error,在public.xml中找到:
4、在smali文件中搜索"0x7f060028",在\smali\com\amigosoft\ababbugua\DateView$5.smali中找到:
5、对应的JAVA语句:
6、从上图我们可以分析出来,if (localURLPostRequest.executeRequest().indexOf("<status>1") > 0) 当条件成立,则提示注册成功,否则失败,很明显是网络验证,很多人一看到网络验证就犯怵。网络验证固然很强大,但是得利用的合理恰当才能发挥出威力。
7、继续分析,看看网络验证后,如果注册成功,程序做了些什么,做了三件事:a、writeCertificates()很明显是写入注册信息 b、弹出注册成功的提示 c、updateAdvUI()更新界面
[Java] 纯文本查看 复制代码 if (localURLPostRequest.executeRequest().indexOf("<status>1") > 0)
{
DateView.this.writeCertificates();
new AlertDialog.Builder(DateView.this.mContext).setTitle(2131099681).setMessage(2131099687).setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface paramDialogInterface, int paramInt)
{
DateView.this.updateAdvUI();
}
}).create().show();
}
8、这里我们注意到writeCertificates()写入注册信息到本地,那么很容易就能想到程序下次启动时是不是就得取出注册信息并加以验证。这个猜想很快得到了验证,因为在DataView.class中就有一个成员方法 private boolean checkCertificates()
9、这个成员方法又在哪里被调用了呢?我们再次搜索checkCertificates,找到在private void updateAdvUI()有被调用
10、再次updateAdvUI,找到在DataView.class的OnCreate()方法中被调用,很快就可以捋清我们的猜测和思路了。
11、有了上面的思路,我们明白了只要将checkCertificates()方法的返回值返回为1,就破解成功,下面修改对应的smali语句:
12、修改保存,重新打包编译,签名,测试,成功破解!
原版程序:http://pan.baidu.com/s/1jGwnnwE
|