首页
社区
课程
招聘
[原创]《Android软件安全与逆向分析》读书笔记-授权key的破解
发表于: 2013-12-9 22:36 25954

[原创]《Android软件安全与逆向分析》读书笔记-授权key的破解

2013-12-9 22:36
25954
非虫书上对这个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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2307
活跃值: (1023)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
分析的不错,ro.kernel.qume是一般性检测手法,genymotion是在书出版后出来的模拟器,是特例了,需要对它进行针对性检测。
2013-12-10 09:24
0
雪    币: 2323
活跃值: (4118)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
学习,谢谢分享
2013-12-10 09:51
0
雪    币: 28
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
哈,作者现身,这本书确实是入门的好书,要是不看不知道还要走多少弯路。
2013-12-10 10:03
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
    非虫大大,你的书我已经看完了,受益匪浅!不过现在得apk大多经过混淆,且使用apktool反编译耗时不说,还很难成功,对新手来说静态分析难度加大,希望你能够补充说明下,如何应对被混淆过后的且又难以反编译的代码。话说,什么时候出第二版啊?比如添加“重头到尾破解下微信之类社交软件的通信加密协议”什么的~~不胜感激啊!
2013-12-10 10:39
0
雪    币: 2307
活跃值: (1023)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
你分析协议的话,肯定重点在于找通讯点的代码与提交数据构建的地方。
对于前者可以针对安卓系统的几个重要网络访问的API进行调用搜索或者使用Hook工具进行Hook。
对于后者,搜索提交数据的关键字段,然后到数据构造点分析数据是如何生成的。

书的第二版出版社说明年年底时可考虑了。。
2013-12-10 10:54
0
雪    币: 113
活跃值: (703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非虫大哥,看了你的书受益匪浅,只是对arm那一块,看了几遍还是不懂。。用ida如果能自动分析出函数名还可以,否则还是分析不出关键的算法。 。

还有一事请教,我在书上已经学会了用gdb调试so,但是有一些程序,本身有父进程ptrace了,gdb连不上。就想问一下,针对已经被ptrace的程序,如何调试,并且如何不用ptrace注入呢?谢谢!
2013-12-18 16:30
0
雪    币: 32
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了。写的真不错。
2014-3-12 08:28
0
雪    币: 11
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
作者现身,书我也是上学期上课的时候用的这本书,感觉还不错的说,我自己分析了下微信,登陆那一块分析了半天也没搞太明白,感觉好杂。
2014-5-19 10:40
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
看看。。。
2014-5-19 10:45
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
11
你的思路都是按照作者的修改checkkey和getappkey函数返回值,实现破解。我的思路是直接跳过不调用checkkey等函数,直接赋值resid=0x7f040003;但是编译出来的apk,免费按钮点击会弹出free version.后两个按钮不显示 pro version等字段。苦闷不知何解?
2015-7-9 23:05
0
雪    币: 542
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这本书确实是入门的好书,要是不看不知道还要走多少弯路。
2016-12-25 19:52
0
雪    币: 207
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
反手就是一个购买。感觉入门还是要看书,不然会走不少弯路。至少要给我个思路再思考嘛
2020-8-10 13:07
0
游客
登录 | 注册 方可回帖
返回
//