step1
task1
添加权限:
没弄清楚到底是哪个,全加进去为快。
注册广播接收器,收到开机信号启动service:
service中周期性获得gps信息并通过toast显示:
这样获得信息:
这样打印:
这样周期执行:
效果:
task2
直接这样是不行的,主线程才能更新UI,报错:
我用这种方法:
通过handler,传递一个runnable对象,排队请求主线程完成UI更新的操作。貌似读text不需要在主线程,也可以只把更新UI放到队列中等,其它的还在子线程,这样也行:
运行成功:
参考这里:https://blog.csdn.net/m0_37705108/article/details/82993433
Step 2
准备
先自己尝试一下smali的代码。通过自己写一段java变成smali的方式。
(1)class->dex
尝试使用dx,dx.bat要稍作修改:
参考:https://www.jianshu.com/p/77db2ea8098f
(2)class->dex
解压apk获得了dex文件。
(3)dex->smali
使用jeb:
2.7版本的jeb好像是有点问题,直接重新下载一个3.0的,地址:
https://shareappscrack.com/download-faqs/
还要先修改一下jeb_wincon.bat,确保正确的jdk路径,需要1.8.0u121之前的版本。
这样就可以用了。
使用方法就是把要逆向为smali的apk拖动到这个bat中。
然后就得到对应的smali代码。
大致对比看一下自己的demo:
task1
但是只看这些就让我用smali写代码还是有点困难,直接用java写一个要求的排序功能的代码,转成smali,然后再试着模仿吧。。
然后按照上面的步骤变成smali,学习一下。
找了一个完整的语法说明文档,链接:
http://www.voidcn.com/article/p-rlagdexr-tu.html
中文版:
https://www.cnblogs.com/liweis/p/4653496.html
这种方式打开的smali不知道该怎么导出对应的smali,先换一种方法试试。
另外一种dex到smali的方法:
java -jar baksmali.jar d -o [输出文件夹] dex文件,先去下载了baksmali,和smali同一个网站就有。
看到输出的Select.smali
还可以变回dex:
可以这样直接在安卓虚拟机运行dex:
目前就先用这个反编译出来的smali,之后再回来模仿保存在:
task2
~暂时先直接反编译回来学习一下。
STEP3
Task1
按照上面的方法反编译出smali,然后自己尝试将它翻译成java,写在
最后得到一个符合要求的输入串需要满足:
(1)包含且仅包含两个x,放在间距为4的位置
(2)第0个字符是1,第9个字符是9,在第一个x出现之前包含一个子串“key”
(3)第11个之后包含且仅包含一个1
(4)长度在10到16之间(包含两侧)
那么一个答案就是:0keyx000x9100
按照上面的方法在模拟器中运行dex,结果:
Task 2
首先看他给的dex的执行效果,就是输入学号会获得一个自己的密钥,然后以这个密钥为命令行参数运行,再输入学号,会得到true。还是和task1一样,需要写一个java实现类似的功能~
STEP4
这个apktool包可以帮助打包apk或者解包。
先下载lab.apk,apk在虚拟机的安装方法:
https://www.xuebuyuan.com/3207839.html
运行一下试一试:
可惜我不知道该输入什么。
task1
为了直到到底密码是什么,我选择前面dex->smali的第一种方式,使用jeb3.0,还是和前面一样,apk拖进去,就看到了反编译的smali代码,好多~
然后右键解析(或者tab)看看jeb帮我们变成的java代码。
首先在mainactivity里看到这个,这说的就是如果判断不对就把下面那个计数++,对了才能玩游戏。怪不得之前那个?/999999在我按了button之后会变大,(我本来还以为计数到了999999会发生什么呢,这样看起来好像不会有事情发生嘛)
发现这个判断是不可能成功让我们玩游戏的,因为它让两个初始化不同的值进行比较,相等才能玩>-<。
所以说不得不cheat一下了,修改它的初始值!
jeb虽然查看方便,但我还是没有搞清楚它的文件管理是怎么弄的,只能重新解压apk(用apktool,本来图省事直接用7zip解压好像虽然能查看但是压缩回去会出问题)
之后发现竟然里面直接就有smali代码,那就不需要反编译一次了。
上图是解压再重新压缩,在这之间需要修改那个初始值的地方,找到mainactivity对应的部分,修改之:
再重打包之后会在dist文件夹下看到生成的apk,在安装之前还需要签名,签名方法就按照学长写的。然后就可以安装并打开模拟器运行了,效果是不管随便输入一个什么,都可以通过task1了:
task2
这个任务是猜密码,前面说到任务一完成就可以playgame,这次直接看playgame这里,只要能输入正确,他就会告诉我说任务2完成咯。
这个getflag的两个参数activity里是这样传的:
ctx是:(。。奥这个没用到,只是必须要传的context)
经过一番字符串的推算,发现答案是lightyellowdress,输入后通过:
task3
这个任务要想办法找到隐藏的功能。可以看到在PlayGame中有一个native方法(用来使用其他语言的库),具体库的位置可以在lab/lib中看到,尝试调用一下这个方法看看是什么功能,这个就需要修改smali中的PlayGame类:
(之前因为没有修改p0(返回值)导致没效果)
这样改了一下,然后重新打包,签名,安装:
然后就可以调用第三方库,效果是输入第二问答案后打印了一个“smaliiscool”。
这样这个lab就做完了。