吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 6222|回复: 28

[安卓逆向图文] 对某apk的继续逆向

  [复制链接]
csky6688 发表于 2015-7-24 15:49 | 显示全部楼层 |阅读模式

本帖最后由 csky6688 于 2015-7-24 20:07 编辑

今天不知道怎么的,论坛登录不了,所以在某首发了
-----------------------------------------------------------------------
最近刚接触android逆向,因此,分析的比较简单,请多多包涵。
apk来源于本论坛,当时帖子的作者,通过修改积分数值,对软件进行了逆向,但并未找出注册机制等等,因此下面将对注册机制进行分析。

刚拿到该APK,先安装看看效果,但是安装后会闪退,并给出提示如下:
1.PNG
因此,猜测该APK应该会检查更新,如果有更新,就退出,并提示安装新版本。
载入JEB,进行分析,发现代码进行了混淆。虽然如此,但可以找到activity_register,An_QimenActivity。activity_register用处不是特别大,找到An_QimenActivity中的onCreate方法,发现如下代码:
  1. this.getWindow().setSoftInputMode(3);
  2.         if(this.b()) {
  3.             Toast.makeText(this.getApplicationContext(), "本程序已有升级版,可在南方周易程序网站升级更新:www.nfbazi.com", 1)
  4.                     .show();
  5.             this.finish();
  6.         }
  7.         else {。。。}
复制代码
可以看到,我们的猜测是对的,因此首先去掉该限制,利用apktool反编译,找到An_QimenActivity.smali中的onCreate方法,找到如下代码:
  1. if-eqz v0, :cond_0

  2.     invoke-virtual {p0}, Lcom/nfbazi/qimen/An_QimenActivity;->getApplicationContext()Landroid/content/Context;

  3.     move-result-object v0

  4.     const-string v1, "\u672c\u7a0b\u5e8f\u5df2\u6709\u5347\u7ea7\u7248\uff0c\u53ef\u5728\u5357\u65b9\u5468\u6613\u7a0b\u5e8f\u7f51\u7ad9\u5347\u7ea7\u66f4\u65b0\uff1awww.nfbazi.com"

  5.     invoke-static {v0, v1, v7}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

  6.     move-result-object v0

  7.     invoke-virtual {v0}, Landroid/widget/Toast;->show()V

  8.     invoke-virtual {p0}, Lcom/nfbazi/qimen/An_QimenActivity;->finish()V

  9.     :goto_0
复制代码
将if-eqz v0修改为if-nez v0,重新打包,签名,即可运行。
2.PNG
分析发现,该软件有10次的限制,10后积分会减为0,当然针对积分的限制,原帖作者已经给出了分析方法。而本文重点介绍该软件的注册机制
点击菜单可以发现注册窗口,因此需要分析该软件的注册机制,找到注册码。
JEB中找到bp类,并找到onClick方法,代码如下:
  1. public void onClick(View arg6) {
  2.         int v3 = -16776961;
  3.         if(a.q) {
  4.             this.a.finish();
  5.         }
  6.         else {
  7.             View v0 = this.a.findViewById(2131165230);
  8.             View v1 = this.a.findViewById(2131165231);
  9.             String v0_1 = ((EditText)v0).getText().toString().trim();
  10.             if(v0_1.length() == 0) {
  11.                 ((TextView)v1).setTextColor(v3);
  12.                 ((TextView)v1).setText("您还没有输入注册码。");
  13.             }
  14.             else if(!d.a(a.o, v0_1)) {
  15.                 ((TextView)v1).setTextColor(v3);
  16.                 ((TextView)v1).setText("您输入的注册码不对。");
  17.             }
  18.             else {
  19.                 ((TextView)v1).setTextColor(-65536);
  20.                 ((TextView)v1).setText("注册成功,点击“退出”。");
  21.                 activity_register.a(this.a, this.a.getSharedPreferences("pcr", 0));
  22.                 activity_register.a(this.a).edit().putString("acc", this.a.a.a(v0_1)).commit();
  23.                 activity_register.a(this.a).edit().putString("bcc", this.a.a.a(a.o)).commit();
  24.                 a.c("pcr");
  25.             }

  26.             a.p = "a@^*(^*ga$(&%io";
  27.         }
  28.     }
复制代码
看到注册部分的代码了吧,主要是提取我们输入的注册码,与该软件的真正的注册码进行比较判断。
跟入a.o 发现是一个string
  1. public class a {
  2.     ....
  3.     public static String o;
  4.     ....
  5.     static {
  6.         .....
  7.         a.o = "";
  8.         }
  9. }
复制代码
然后查看什么时候对a.o进行的赋值,如下:
  1. public boolean b() {
  2.         int v6 = 8;
  3.         int v5 = 7;
  4.         Object v0 = this.G.getSystemService("phone");
  5.         String v1 = ((TelephonyManager)v0).getDeviceId();
  6.         String v2 = ((TelephonyManager)v0).getSubscriberId();
  7.         String v0_1 = ((TelephonyManager)v0).getSimSerialNumber();
  8.         if(v1 == null) {
  9.             v1 = "";
  10.         }

  11.         if(v2 == null) {
  12.             v2 = "";
  13.         }

  14.         if(v0_1 == null) {
  15.             v0_1 = "";
  16.         }

  17.         if(a.l == null) {
  18.             a.l = "";
  19.         }

  20.         if(!v1.equals("")) {
  21.             v1 = v1.toUpperCase();
  22.         }

  23.         if(!v2.equals("")) {
  24.             v2 = v2.toUpperCase();
  25.         }

  26.         if(!v0_1.equals("")) {
  27.             v0_1 = v0_1.toUpperCase();
  28.         }

  29.         if(!a.l.equals("")) {
  30.             a.l = a.l.toUpperCase();
  31.         }

  32.         if(v1.length() >= v6) {
  33.             v1 = v1.substring(v1.length() - 7);
  34.         }

  35.         if(v2.length() >= v6) {
  36.             v2 = v2.substring(v2.length() - 7);
  37.         }

  38.         if(v0_1.length() >= v6) {
  39.             v0_1 = v0_1.substring(v0_1.length() - 7);
  40.         }

  41.         if(a.l.length() >= v6) {
  42.             a.l = a.l.substring(a.l.length() - 7);
  43.         }

  44.         if(v1.length() != v5 || (this.d(v1))) {
  45.             if(v2.length() == v5 && !this.d(v2)) {
  46.                 v0_1 = String.valueOf(v2) + "B";
  47.                 goto label_71;
  48.             }

  49.             if(v0_1.length() == v5 && !this.d(v0_1)) {
  50.                 v0_1 = String.valueOf(v0_1) + "C";
  51.                 goto label_71;
  52.             }

  53.             if(a.l.length() == v5 && !this.d(a.l)) {
  54.                 v0_1 = String.valueOf(a.l) + "E";
  55.                 goto label_71;
  56.             }

  57.             v0_1 = this.c();
  58.         }
  59.         else {
  60.             v0_1 = String.valueOf(v1) + "A";
  61.         }

  62.     label_71:
  63.         a.o = String.valueOf(v0_1) + "-2414";
  64.         boolean v0_2 = v0_1.length() > 0 ? true : false;
  65.         return v0_2;
  66.     }
复制代码
上面便是注册码的产生计算的过程继续查看class d 类。
  1. public static boolean a(String arg3, String arg4) {
  2.         boolean v0 = true;
  3.         a.p = d.a(d.a.a(arg3));
  4.         if(a.p.equals(arg4)) {
  5.             a.q = true;
  6.         }
  7.         else {
  8.             a.q = false;
  9.             v0 = false;
  10.         }

  11.         return v0;
  12.     }
复制代码
其中a.p中保存了真正的注册码,其中深入分析可知a.p实际上也是一个string。
注册机制的分析就到此结束了。
知道了注册机制,下面就让程序把自己的注册码吐出来
打开反编译的文件d.smali,找到如下代码:
  1. .method public static a(Ljava/lang/String;Ljava/lang/String;)Z
  2.     .locals 3

  3.     const/4 v0, 0x1

  4.     const/4 v1, 0x0

  5.     sget-object v2, Lcom/nfbazi/qimen/a/d;->a:Lcom/nfbazi/qimen/a/b;

  6.     invoke-virtual {v2, p0}, Lcom/nfbazi/qimen/a/b;->a(Ljava/lang/String;)Ljava/lang/String;

  7.     move-result-object v2

  8.     invoke-static {v2}, Lcom/nfbazi/qimen/a/d;->a(Ljava/lang/String;)Ljava/lang/String;

  9.     move-result-object v2

  10.     sput-object v2, Lcom/nfbazi/qimen/a/a;->p:Ljava/lang/String;

  11.     sget-object v2, Lcom/nfbazi/qimen/a/a;->p:Ljava/lang/String;

  12.     invoke-virtual {v2, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

  13.     move-result v2
复制代码
这个便是上面的 public static boolean a(String arg3, String arg4)方法,修改如下:
3.PNG

然后打包,签名,允许程序,并注册,其中注册码随便写。
然后在cmd中输入adb logcat -s SN:V
可以得到注册码如下所示:
4.PNG
然后用程序自己吐出来的注册码进行注册,提示注册成功,并可以升级该apk

评分

参与人数 24威望 +1 HB +36 THX +16 收起 理由
24567 + 1
行行行行行行 + 1
消逝的过去 + 1
娄胖胖 + 1
sjtkxy + 1
冷亦飞 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
akk1898 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
zyyujq + 1
xgbnapsua + 1
jaunic + 2
lies + 1
hnymsh + 1
mengzhisuoliu1 + 1
小虫儿 + 1 [快捷评语]--你将受到所有人的崇拜!
a5691409 + 5 + 1 [快捷评语]--评分=感恩!简单却充满爱!感谢您的作品!
kiaakiaa2 + 1 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
过林黑马 + 1 [快捷评语] - 吃水不忘打井人,给个评分懂感恩!
tony2526 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
A00 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Shark恒 + 1 + 10 + 1 评分=感恩!简单却充满爱!感谢您的作品!
逍遥枷锁 + 4 + 1 评分=感恩!简单却充满爱!感谢您的作品!
雪里红 + 2 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
寻寻觅觅 + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
冷瞳 发表于 2015-7-24 15:51 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
寻寻觅觅 发表于 2015-7-24 15:56 | 显示全部楼层

坐凳子 看不懂
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
923004243 发表于 2015-7-24 16:11 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
雪里红 发表于 2015-7-24 18:25 | 显示全部楼层

都希望出教程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| csky6688 发表于 2015-7-24 18:52 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| csky6688 发表于 2015-7-24 19:45 | 显示全部楼层


等能力达到了,会出一些视频的,只是现在还达不到那个高度
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
A00 发表于 2015-7-25 11:19 | 显示全部楼层

不错的分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
tony2526 发表于 2015-7-25 13:51 | 显示全部楼层

教程不错,挺详细的,期待楼主更多的教程出来,顶下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
我好想世界末日 发表于 2016-5-29 18:27 | 显示全部楼层

感觉一脸懵逼 看不懂这些代码
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表