听鬼哥说故事之安卓学习手册_研究过程记录(未完成...)

相关链接: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

posted @ 2015-08-06 17:26  静静静流  阅读(609)  评论(0编辑  收藏  举报