zoukankan      html  css  js  c++  java
  • 听鬼哥说故事之安卓学习手册_研究过程记录(未完成...)

    相关链接:http://www.52pojie.cn/thread-280588-1-2.html

      因为一直想学习脱壳、逆向但没有合适的机会,所以这次用网上的例子自己探索了一番,也算收获不少。

    直接把程序放到改之理中没法反编译,鬼哥也说了是加壳的,打开程序可以看到是用爱加密加壳的。百度了下

    脱壳方法,决定使用zdroid脱壳。

    0x01  使用zjdroid框架脱壳

    之前手机装了xposed框架,所以直接安装zjroid神奇,查询相关命令,导出了dex文件。

    1、查看程序包名、pid

    1 root@android:/ # ps

    2、另起一个cmd窗口查看相关日志信息,会输出程序的pid

    1 adb logcat -s zjdroid-shell-loading.androidmanual

    3、回到第一个窗口,adb shell后获取APK当前加载DEX文件信息

    1 root@android:/ # am broadcast -a com.zjdroid.invoke --ei target 13888 --es cmd '{action:dump_dexinfo}'

    4、使用backsmali反编译指定DEX,并以文件形式保存

    1 root@android:/ # am broadcast -a com.zjdroid.invoke --ei target 13888 --es cmd '{action:backsmali, "dexpath":"/data/app/loading.androidmanual-1.apk"}'

      dex文件存放在/data/data/loading.androidmanual/files目录下,pull出来之后用apktoolkit反编译之后查看smali代码,dex转jar后用jd-gui查看java代码。

    由于经验不足,最初反编译dex文件的时候总是失败,咨询了大牛之后发现是apktoolkit在中文路径下,于是拖到桌面上,便反编译成功了。在此记录一下这个愚蠢的错误。%>_<%

    0x02  程序分析

    1、基本情况

      程序判断的逻辑很简单,通过分析反编译的smali代码,发现进行激活判断所在的文件为:

      E.class        点击书本图标触发,会先弹出Toast,然后跳转到验证界面

      l.class         主要判断的类,包含三个循环,修改的重点也是这个

      CreditActivity.class  l.class判断完之后调用,不是主要判断的类

    2、E.class文件

      最初没找到这个文件,后来循着点击书本图标的Toast信息查找字符串找过来的。内容如下:

    if (this.a.getSharedPreferences(MainActivity.a, 0).getBoolean(MainActivity.b, false))
        {
          if (MainActivity.a(this.a) == 0)
          {
            MobclickAgent.onEvent(this.a, "my_article");
            Intent localIntent2 = new Intent(this.a, ArticleActivity.class);
            localIntent2.putExtra("TYPE", 15);
            localIntent2.putExtra("SECTION", this.a.getResources().getString(2131165254));
            this.a.startActivity(localIntent2);
            return;
          }
          Toast.makeText(this.a, "账户异常,请联系管理员!", 0).show();
          return;
        }
        Toast.makeText(this.a, "请先激活账户!", 0).show();
        Intent localIntent1 = new Intent(this.a, CreditActivity.class);
        this.a.startActivity(localIntent1);

      程序进行了两层判断,如果没进双层判断了就跳转到激活界面。双层判断内是跳转到对应书目的代码。去掉这些判断即可免激活看书。

    3、l.class文件

    文件中的几个String参数的作用:

      str1   输入的激活码
      str2   通过查询str1返回的参数,若验证通过,获取验证码对于的imei信息,可能的值有"","on","off"或[imei串]
      str3   当前手机imei信息

    文件中还包含了三处判断,这三处判断的判断流程如下所示:

      

    激活成功的代码在最后一处判断中,仅当激活码通过验证,且imei信息一致时通过验证,其他情况都会return,验证失败。

    查看str2的定义:

    1 String str2 = MobclickAgent.getConfigParams(this.a, str1);

    该方法调用了如下函数:

    1 public static String getConfigParams(Context paramContext, String paramString)
    2 {
    3   return j.b(paramContext).getString(paramString, "");
    4 }

    其中j类中的函数如下:

    1 public static SharedPreferences b(Context paramContext)
    2 {
    3   return paramContext.getSharedPreferences("mobclick_agent_online_setting_" + paramContext.getPackageName(), 0);
    4}

    也即str2是调用getSharedPreferences查询私有目录下的一个文件,返回一个字符串。如果查询失败的话就返回默认值""。

     0x03  修改代码

    1、修改E.class对应的E.smali文件

       删除判断代码和Toast代码即可。

    2、修改l.class对应的l.2.smali文件

       简单表述了下这个类进行判断的方法:

    Str2

    循环一

    循环二

    循环三

    “”

    return

    X

    X

    “on”

    X

    X

    [imei]

    X

    return

      之前也看过,str2默认的值是"",所积极避开第一个循环,进入第三个循环即可,也即:

    Str2

    循环一

    循环二

    循环三

    “”

    X

    X

    “on”

    X

    X

    X

    [imei]

    X

    X

    X

      这里的修改思路主要是比对鬼哥给出的修改后的dex文件得出的,感恩无私奉献的鬼哥。

    java代码表述出来是:

    1 if ((str2 != null) && ("".equals(str2)))
    2 if ((str2 != null) && (!"on".equals(str2)) && (!str2.equals(str3))) 
    3 if ((str2 != null) && (("on".equals(str2)) || (str2.equals(str3))))

    改为:

    1 if ((str2 != null) && (!"".equals(str2)))
    2 if ((str2 != null) && (!"on".equals(str2)) && (str2.equals(str3)))
    3 if ((str2 != null) && (("on".equals(str2)) || (!str2.equals(str3))))

    具体的smali代码:

     if-eqz v0, :cond_3c   #str2和""比较
     if-nez v0, :cond_58   #str2和str3比较
     if-eqz v0, :cond_119  #str2和str3比较

    改为:

    1 if-nez v0, :cond_3c
    2 if-eqz v0, :cond_58
    3 if-nez v0, :cond_119

      修改完后重打包dex,对比鬼哥给出的修改好的apk文件,删除了META-INF目录下除了MANIFEST.MF文件外的所有文件,然后用

    apkSign重新签名apk。安装到手机倒正常,可惜一打开就崩溃退出。

    0x04  小插曲

      用adb logcat查看日志后,发现是由于找不到名为“com.shell.SuperApplication”的application,百度之发现是爱加密的壳入口,在清单文件

    中有声明。要像正常运行必须删掉这些。然后用AXMLPrinter2.jar,通过:

    1 java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest2.xml

       还原了清单文件,在里面也看到了android:name="com.shell.SuperApplication"语句。删掉之后重新签名,根本安装不上。又去百度,发现

    清单文件只能二进制修改。%>_<%将鬼哥修改好的apk中的清单文件打包进去,重新签名,可以正常安装。但在使用中又出现了新问题,丞待解决。

    在此记录下尚未完成的工作:

      1、AndroidManifest的二进制修改、打包,或apktool重新打包apk文件;

      2、程序使用中会出现“异常”状态,激活不全面,需要进一步研究和修改代码;

      3、学习AndroidManifest的文件结构,学会使用相应的工具。

    未完待续。。。。。。

    参考资料:

    http://www.cnblogs.com/2014asm/p/4112116.html

    http://www.52pojie.cn/thread-252099-1-1.html

    http://www.dnwxzs.com/List.asp?ID=1833

    http://www.07net01.com/2014/09/123746.html

    http://demo.netfoucs.com/ljb_wh/article/details/39083399

    __________________________________________________________ shoobie do lang lang ^^
  • 相关阅读:
    Python时间戳
    vux x-input 清除按钮不起作用
    MySQL连接查询流程源码
    Linux下用的脚本
    TableCache设置过小造成MyISAM频繁损坏 与 把table_cache适当调小mysql能更快地工作
    批量导入数据到InnoDB表速度优化
    DBA面对新mysql环境
    (进阶篇)PHP+Mysql+jQuery找回密码
    (进阶篇)PHP实现用户注册后邮箱验证,激活帐号
    (实用篇)php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
  • 原文地址:https://www.cnblogs.com/annaivsu/p/4708117.html
Copyright © 2011-2022 走看看