目录
前言
某python环境app提供了在Android运行python环境的功能,但其中有三个库必须PREMIUM权限才能使用。
这次先把这三个按钮的展示机制研究一下,并设法改成INSTALL,让它们能正常点击,然后看一下是否真的可用了。
声明:本文讲述的内容仅用于学习和研究,禁止用于商业用途。
一、分析步骤
1.查壳
先使用MT管理器的安装包提取功能,查看这个apk的安装包信息,看一下有没有加壳,加的哪种壳:
可以看到一个好消息,这个app是没有加壳的(加固状态是未加固),那就省去了脱壳的步骤,直接下一步了。
2.查找Activity
apk的逆向分析,一般先从界面、日志等能够直接看到的线索入手,根据这些线索,在反编译的代码中去寻找突破口。直接通读代码是很困难的,就像大海捞针。因为apk一般是做了代码混淆,反编译出来的java代码,虽然能还原出基本的逻辑,但是和真实代码还是有很大差异的,可读性还是很差,要完全读懂,太困难了。这里因为就是想要修改界面,所以根据界面关键字,Pip、PREMIUM等关键字去寻找入口,仅分析相关的一点代码,缩小范围。这里还是使用MT管理器,这次要使用的是Activity记录的功能,在记录下的Activity中,找到了Pip的Activity,推测需要修改的界面很可能就在这个Activity中:
3、使用JADX打开apk
确定了Activity之后,现在要做的事情就是打开PipActivity的代码来看一下,寻找premium相关线索。
这个步骤我比较喜欢用JADX,因为可以在spilt模式下,分屏查看java和smali,而且java代码里面的注释很有用,下文一些地方就可以体现出来。
分析java代码,搜索premium关键字,找到了is_premium,推测这个就是是否为premium的一个标志位,这是一个关键信息。进一步发现is_premium是由mo289C赋值的:
然后追踪mo289C,发现又是由f14356E赋值,类型是boolean,也就是true或false,那很可能是这样的:true就是premium,false就不是premium。由此推测,只要把f14356E的值强制写成true,就可以让mo289C的值为true,也就是is_premium的值为true:
追踪f14356E,发现初始值是false。从java的注释中可以看到,这个f14356E,也就是smali中的E,也就是刚才说的JADX一个很好用的地方:
然后就可以使用"->E"关键字,到smali中去查找了。
然后找对应的smali文件:查看对应smali代码的首行,可以发现对应的smali文件名是qwe.qweqwe.texteditor.g0。找这个的目的就是因为JADX不能直接编辑smali,只能用其他工具直接把apk反编译出来,找到对应的smali文件,才能去改,而JADX提供的是精准定位:
4、反编译apk,得到smali:
这个是标准操作,这里就不详细说明了,大家可以自行百度。我这里使用的是apktool。
在反编译出来的smali中找到qwe.qweqwe.texteditor.g0,并在这个文件中搜索“->E”,限定大小写敏感,可以搜索出4个结果,其中iput(赋值)的有3处。我直接对这种赋值的3个地方,都修改了smali,强制写成0x1,也就是true:
5、保存,回编译,签名
这些也是标准操作,这里就不详细说明了,大家可以自行百度。方法很多,我这里也是使用的apktool,可能用Android Studio或许更方便一些,或许可以一键生成,这个我就没有去深入尝试了。
6、卸载原版本apk,重新安装修改后的apk
原来的版本建议是先卸载掉,因为回编译的apk和原来的apk的签名是不一样的,直接安装会有签名不一致问题。特别是对于系统应用,还有权限问题。
完成之后看一下效果:原来premium only的三个按钮已经变成INSTALL了,说明界面判断的修改成功了,已经生效:
总结
经过分析和修改,原来premium only的三个按钮已经变成INSTALL了,第一步算是走通了。但这个应该只是表面上的完成,要能真实运行成功才算真的成功。可以尝试一下点击INSTALL,去安装这些库:
是不成功的,apk做了包校验,库不能安装成功,提示了一大堆,说包有问题,建议卸载后安装google play版本。确实没那么容易。
下一步研究一下包校验的逻辑, 完成之后,应该就成功了,但是粗略看了一下反编译出来的代码,难度看起来很大。但是如果分析有成果,我会再次把后面的分析分享出来,希望对大家有所帮助。