非虫书上对这个app只做了大致的分析并没有给出具体的解答,闲来就弄了一下,本人接触android逆向时间尚短,不足之处请多指教。
app具体就不介绍了,简单说下,一共两个apk,freeapp.apk即需破解程序,其授权的key保存在另外一个程序appkey.apk里面。但是个人测试时候发现即使装上了appkey.apk也是没有激活freeapp的,不知道其他人是否也这样。
使用工具:
编译/反编译/打包签名工具:ApkToolkit v2.1,看雪Mzucore出品,可视化集成apk修改工具,用着很顺手。
编辑器:sublime text 3,加上smali语法高亮之后,阅读效果很赞。
模拟器:genymotion,速度比较快,vbox+x86安卓,支持arm版native,反倒对x86版本native支持不够好。
反汇编器:ida pro,静态分析图形界面不解释。
没用改之理,只是因为当时没有网络安装改之理需要的.NET环境。
先运行未破解freeapp,可以看见只有一个页面即只有一个oncreate,也只有一个免费版本的onclick。
ApkToolkit反编译smali后,sublime导入,smali/com文件夹下搜索onceate,打开进入MainActivity.smali的oncreate部分,代码块和转跳有点多,耐心不够可以看ida的图形界面。
ida载入freeapp.apk的class.dex文件,exports页查找到mainactivity.oncreate,进入后转换图形界面,代码流程一目了然。不知道怎么导出图形,只好简单截取一个缩略图,实际效果都懂的,不过ida反编译出来的代码跟baksmali有点小差异,不过不影响阅读。
简单分析一下代码流程:
oncreate,检测解密key并开启相应版本功能,检测解密的关键部分调用方法,checkappkey检测key,getappkey和decryptappkey解密key,checkappkey检测通过后由decryptappkey的返回值决定系统版本号。
checkappkey,应用首先运行部分,用于检测key,由getappkey获取后计算长度,不为0返回1,否则返回0。
getappkey,获取key,只有一个简单的try-catch,try(context appkey-getstring),context用于访问其他软件资源包,具体非虫书中有比较详细的描述,访问失败则抛出catch为空。
decryptappkey,解密key,同样也是一个简单的try-catch,try(decrypt-parseint),解密的核心部分,具体算法不需要知道,失败则抛出catch为0。
所以破解思路已经很明白了,跟非虫书上说的一样,关键在于getappkey和decryptappkey方法的修改,修改getappkey返回一个不为0的固定值比如1,而decryptappkey则返回一个对应版本号的固定值(高级版0x7f070002,专业版0x7f070003)即可。
修改完成后运行如下:
书上提到修改apk的两种方法,一是反编译smali后修改打包签名重编译,这是最为简单的方法,缺点就是对较大的程序耗费时间较多;另一种则是直接用16进制编辑器修改dex二进制文件,这需要比较熟悉dalvik指令,而且需要修改的部分必须很少如转跳之类,而且也需要重效验dex。其实还可以直接在android下用dalvik编辑器修改,读写方式跟pc下修改smali一样方便。
书中10.3.2对抗动态调试检测模拟器的部分有一点小问题,其以ro.kernel.qume属性为例,在genymotion下是检测失败的。而且getprop所获取的配置信息保存在/system/build.prop下,root权限可以读写,因此这样的检测效果并不可观。
android逆向确实很有意思,最近想转行专去做移动逆向和安全,毕竟这方面平台更年轻,但是网上的招聘相关的要求都比较高,通常都需要安卓逆向方面有一两年的经验,但个人接触这些才三个多月,因此想去一个要求相对低一点的位置边工作边学习,所以想求教看雪的诸位有没有比较好的建议。
附:
freeapp.apk和appkey.apk为非虫原文件,就不贴了,其书中前言部分有下载地址。
freeapp.RSO.apk为个人修改后版本。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: