听鬼哥说故事之安卓学习手册_研究过程记录(未完成...)
相关链接: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