180718 安卓-阶段总结

这几天一直在分析实际的APP,与CTF题目比起来差别还是挺大的
CTF的代码量大多很小,最多也就十几个类,完全可以挨个看下来,有什么骚操作最多也就一两个点,所有代码看下来总会发现的

而实际中的APP视功能和体量体积会扩大很多,而且使用了很多相对而言比较难处理的工业技巧,例如异步处理、服务机制、消息机制等等从来没接触过的东西

对于大体积的APP主要依靠字符串、关键词搜索来找到突破点,然后依靠交叉引用和函数体跳转来上下回溯、延伸,直到找到需要的关键信息

目前遇到的JEB的两个问题主要是一些特殊的机制会使得交叉引用找不到调用的类,以及函数体跳转并不是指向真正调用的方法

安卓没有开发经验的弱点暴露地很明显,第一天我一直在研究接口类和方法是个什么鬼23333 双击JEB中调用的函数竟然跳到一个没有方法体的方法里了,这让人怎么分析

来来回回查了半天才明白接口方法相当于最上层的框架,子类的对象是可以作为父类的变量的
例如方法声明void foo(Father A);
父类class Father;
子类class Child extends Father;
实例Father A;
可以令A = new Child();

这样可以通过不同的对象来调用不同的重载方法,作为没什么面向对象开发经验的菜狗来说还是挺惊讶这种用法的

对于JEB的分析而言,这里需要找到其真正的类,即Child 然后跳到Child的实现中,查看其重载的方法,才是真正调用的方法

工业APP中经常会有一个父类变量通过一些条件判断来决定实例化的哪一个子类,然后调用接口方法

另一方面JEB的交叉引用面对一些不是普通调用的方法经常会懵逼
例如上述继承的情况时,查找子类重载方法的交叉引用是找不到具体调用的,必须查看类构造的交叉引用,定位到实例化的地方,然后找到方法的调用。

再比如今天看的APP使用了很多异步方法AsyncTask,具体调用的doInBackground, onPreExecute等等方法都是交叉引用找不到的,还是得找Task类的实例化,进而找到调用execute方法的地方

还有很多类后缀impl也比较神奇,这个还没理透就不细讲了XD

有时间得尽快系统地学一学安卓的各个控件、组件等等orz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值