zoukankan      html  css  js  c++  java
  • 爬虫工程师到底为什么要学习安卓逆向?

    背景
    这篇文章写给Python爬虫工程师们,互联网行业的处境越来越艰辛,流量越来越涌向移动端,爬虫和反爬的攻防不断升级,这一切的一切,都让我们只能一刻不停的学习新技能,才能保持竞争力和养家糊口(一群单身狗,挣的钱连自己都养不活) 。

    App逆向不断出现在爬虫工程师的日程表里,可是到底该怎么入门App逆向?

    1. 指出一些自学的误区

    2.推荐一些入门的学习资料

    这篇文章的目标读者是计划学习Android逆向的爬虫er,他们可能有如下特征

    几乎没有Java基础

    几乎没有Android基础

    对Android逆向的思路和工具缺少了解

    下文会一一解答这些困惑和焦虑,但适合每个人的学习模式也各有不同,可以选择性的实践。本文对Android逆向老手帮助不大,但如果老手愿意在评论区分享经验和教训,给过来人一些指点,我表示衷心的感谢。

    一、自学Android逆向的误区和陷阱


    1.1. 不要试图熟练掌握Java编程和Android开发后再开始学习逆向

    Java是一门复杂精妙 的语言,但你又不是要当Java开发工程师???

    你可能很想反驳,那我不懂Java,不懂Android怎么可能搞得了逆向,佛系逆向随缘逆向?别别别,我可没说这话,我指的只是入门时不必精通Java和Android。原因有一堆,但我认为最主要的原因在于——开发和逆向的关注点不同。

    我们先罗列一下Android面试和实际应用开发中出现的一些技术关键词:

    Java虚拟机,Davlik虚拟机,UI布局,四/五大组件及其细节,Intent,Handler,数据持久化,进程线程和异步,
    SharedPreferences,屏幕适配,兼容性,Android消息机制,WebView,bitmap,Java与C++如何相互调用,
    第三方SDK接入,内存泄漏和管理,网络通信和优化,热修复和插件化,Dex分包和优化,Kotlin语言
    RecyclerView,注解框架,音视频的处理,设计模式,应用框架,其他优化……
    而我们破解时需要关注什么?尤其是对爬虫的逆向需求来说,简而言之,我们在破解加密字段如何生成,那我们的关键词是这些:

    抓包和反抓包,App的混淆,加固,高度混淆
    加解密算法,Jni,放在C中的加密,smali
    Java层动态调试,Jadx,Jeb,ida


    开发人员需要开发和实现App的各种功能、关注数十个厂商上百个机型的适配、Apk体积的优化,App性能的优化,更吸引用户的UI,更友好的bug解决机制(热修复),而我们破解,一般来说,只需要关注应用的网络通信、加解密方法、安全防护即可。开发和逆向的目标完全不同,所以你并不需要对开发的那一套了然于胸,才能开始破解。

    除此之外,App的安全问题只是Android开发的众多议题之个。一部分Android开发人员,甚至连反编译App的流程和工具都只是听闻过而已,尤其是对于小厂/一般App,安全问题它们能投入的精力十分有限,这个原因十分好理解。

    狗仔和偷拍只是明星成名之后才会烦恼的事,而十八线女星正在下雨的横店乞讨着生活,App也是这样,如果你搞的不是大厂App(腾讯系/阿里系/今日头条系等)、超级App(支付宝/微信/抖音/快手等),或者特殊用处的App(买票/支付/网商等),那么开发人员给App盘个市面上常见的加固,弄个so层的加密,已经是它们防护的上限,可能这些不算太简单,但难也难得有限。因为App的用户留存和开发人员的温饱才是他们最要命的议题。

    所以,你不必花太多时间了解和实践纷繁复杂的Android开发知识,只需要掌握Java的基础语法,Android的基础知识,就可以专注于逆向所需要关注的各种技术和方法了。

    1.2. 不要好高骛远

    1.3. 不要收集过多的资料 & 分辨资料的时效性

    1.4. 不要自负,觉得Android逆向很简单

    二、Android逆向入门的资料和基础
    这些书和内容都是非常好的,我这次没有提供百度云链接,网上资源很多,我很希望大家通过pdf资料被大佬的文笔和内容所吸引和折服,然后购买正版书籍放在身边看。

    一、基础中的基础

    1,java

    《Java 核心技术 卷一》1-6章节
    主要关注里面的这些基础:Java基础数据类型,Java面向对象和三大特性,Java接口,String类,Array,Map。
    你看完这几章,大致就可以看懂简单的Java代码了。


    2.Android

    《第一行代码(第2版)》
    这本书简单,直白,通俗易懂,写的很好,是公认的Android入门书。
    你可以认认真真照着例子全部敲一遍,也可以只走马观花了解一边App的开发流程,看完本书,你会明白一个Android App是怎么从无到有。


    3.加解密

    《Java 加密与解密的艺术 (第二版)》
    讲了如何使用Java实现各种各样的加密,这本书是工具书,建议买一本,很不错,用到就翻翻,平时上厕所也可以当成厕所读物。
    就这么简单,你就可以开始Android逆向之旅了,这是最简单的配置,按照需求,你后续可以学习这些东西。


    二、Android逆向书籍和资料

    1.《Android 软件安全权威指南》

    白色的封面,我爱叫它白皮书。这本书真的太棒了,如果你想入门Android逆向,这本书几乎没法跳过。Android逆向入门需要的方方面面,它都涉及到了,而且讲的还都有内容有深度。
    这本书适合按照需求找章节看,如果按照顺序看,你可能会死在第三章“Dalvik可执行格式与字节码规范”
    我重新排一下序,同时,我建议第一章的软件安装和环境配置,别急着去实践,可以装了java开发环境后,用jadx或者jeb万金油直接撸,但如果你喜欢敲命令行,用无大碍,下面的阅读顺序只是我个人喜好,读者自行甄别和选择。
    第一、二章——环境搭建和如何分析Android程序,浏览即可。
    第三、第四章——Dalvik可执行格式与字节码规范和Android文件格式,浏览即可,内容很重要,但不是入门的内容。
    第五章——静态分析Android app,这也是很多培训课程的第一课,我个人也认为这个应该先看,而且写的很好。
    第六章——动态分析Android应用,写的很好,但6.1的动态分析框架我没有用过,似乎有些老旧不太好用,读者可以试试。
    第十章——Hook与注入,Xposed+Frida是这一章节的重点,Frida是目前最流行的动态插桩工具。
    第一十章节——软件保护技术,讲的很全面。
    章节七八九是Native层的内容,我把它划分到下一部分,入门单单指Java层,章节十二是软件壳的内容,也是进阶的内容。


    2.《Android应用安全防护和逆向分析》

    黄色封面,我叫它黄皮书,这本书的内容也充实有料,和白皮书一样,也是面向Android开发/安全人员,门槛比较高。
    我个人也是建议按照模块看,按照顺序看的话小心坑。
    全书分成三个部分,防护篇和工具篇都讲的很好。这本书也是必备。
    这两本书是引路明灯,但光看这两本书,是远远不够的,你需要真正的实战,还有更多更广更全的资料。


    三、入门补充,我建议这些按照需求,或者在遇到的时候再学习和查阅

    Java——异常处理/反射/动态代理,这对你理解逆向中的Hook等技术非常有用
    Android——网络请求框架/应用框架/……


    三、Android逆向长远的资料
    这部分内容非常多且杂,我需要好好整理一下。大家加油。

    #########

    疑问?

    现在天眼查,知乎,淘宝,抖音,美团,都有web端,为什么还需要app逆向呢?

    基本大厂一线的产品都有web端,可能小厂有一些只有app,没有web端,这个可能是需要app逆向,

    我很不解,

    但是有必要非要死磕这个一线的app逆向吗?有这个必要吗?

    抖音用户的粉丝详情,只能在app才能看到,在app可以播放视频,但是看不了粉丝,

    ###########

    场 景

    最近刚好需要一批数据,正好某家app有,但这家产品没有web端,只有安卓和iOS,只能通过逆向的方式拿到app的http接口,进而抓取数据。

    破解一家产品,成本从低到高思路如下:

    web端 < 公众号 < 小程序 < app(安卓) < app(IOS)

    首先,如果产品有web端,先分析web端;

    其次,如果产品web端数据不够全或者不够准确,可以分析公众号或小程序;

    最后,如果没有web端,没有公众号和小程序,则只能分析app端,不管是iOS还是安卓,建议分析一个没有做过混淆的包,因为后面大部分时间都在跟app的源码打交道,第一时间找一条便捷的路,能省不少时间。

    尽量破解app的http接口,最后把爬虫部署在服务器,但有时出于特殊原因,只能把爬虫部署在手机端,hook代码到对方app中,调用对应方法拿到想要的数据。

    因为这家产品没有web端,也没有公众号小程序,只有安卓和IOS,那么就从Android静态分析。

    工具准备


    工欲善其事,必先利其器。这句话放到逆向对工具的描述上来说再适合不过。

    习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场。

    那么,逆向流程的工具汇总如下:

    抓包 / Web Debugging Proxy


    Charles
    网络抓包工具,Mac抓包利器


    Fiddler
    网络抓包工具,Windows抓包利器

    命令行工具 / Command Line Tools

    apktool
    编译res资源
    转成smali
    将修改后的smali回编译为apk


    dex2jar
    dex转为jar工具
    转成smali并且回编译
    smali/baksmali/smalidea
    将dex反编译成smali
    将smali回编译成dex
    AndroidStudio调试smali代码
    带界面的工具 / GUI Tools


    jd-gui
    用来查看反编译.class文件
    支持Eclipe和IntelliJ扩展
    有漂亮的gui界面


    脱壳 / Unshell


    FDex2
    安卓xposed脱壳工具
    通过Hook ClassLoader的loadClass方法,反射调用getDex方法取得Dex(com.android.dex.Dex类对象),再将里面的dex写出
    安卓4.4以上的手机或模拟器
    其它看软件提示


    so库 / Native

    IDA Pro
    目前最棒的反编译软件(商业软件,网上可以找到破解版,真有能力的建议支持下正版)
    支持 java、native
    支持动态调试


    Frida:
    代码插桩工具
    使用Python提供API,用JavaScript编写hook代码
    支持hook java层
    支持hook native 层
    插件 / Plugin


    java2smali
    Android Studio插件
    支持将java和Kotlin文件编译成smali文件
    关注我的公众号“架构漫谈”,回复“资源下载”,可以获取逆向工具下载。

    破解流程


    在这里把分析过程总结一下(以下不会涉及app的真实信息,所有名称、接口、参数都是化名,以下称这家产品为A)。

    第一步:抓包
    用Charles,很快就能发现A的接口,A接口是https的,需要伪造一下证书,Charles也有现成的方案

    参考文章:https://www.cnblogs.com/pengyunjing/p/9158009.html

    不出五分钟,已经拿到了一个接口的完整输入输出:

    GET /a/list?page=0&size=10&id=1234567890&a=MzEyZTUwOGExOTgyY2E1&os=android&version=1.0.0 HTTP/1.1
    User-Agent A/1.0.0 (Android 7.1.2, okhttp/3.8.1)
    Connection close
    time 1560596584
    sign e3f505d2e004b1a5
    Cookie c="NWUxZGRjYTM3OTRjNzIyMz"; Expire=Monday, 15-Jan-2019 11:00:58 GMT+0000; Path=/;
    Host api.a.com
    Accept-Encoding gzip
    输出就是所需的json数据

    试了一下,url中的参数a、header中的sign都是关键的参数,找到生成这些参数的代码,就能自己模拟出A产品的http请求。

    第二步:破解
    刚说过尽量找一个没做过混淆的包。

    - 安卓的包因为很容易能拿到源码,所以从一开始混淆技术就很成熟,市面上大多安卓app都做了混淆。后来有了加固技术,使得破解的难度更大了一点;

    - iOS从一开始苹果就做了加密(加壳),市面上大多app都不会做混淆(正所谓淹死的都是会水的?),但Swift写的app,逆向出来都看不到方法名,会更难破解;

    - 所以破解难度是:iOS Swift > Android 混淆 > iOS Objective-C > Android 未混淆。

    A家的iOS包用的OC/Swift混编,而Android端只做了加固,没有混淆,验证了从安卓入手是对的。

    加固的包需要先脱壳,否则看不到实际代码,这里用的VirtualXposed和FDex2,直接上一篇教程:

    参考文章:https://www.jianshu.com/p/138c9de2c987

    总体上就是把FDex2和需要脱壳的app运行在VirtualXposed上(VirtualXposed是一个安卓虚拟环境),用FDex2在app运行时把dex dump出来。

    dex反编译成jar,就能看到源码了。脱壳后有时候会有很多dex文件,把所有的dex都反编译成jar,里面肯定有想要的代码。

    第三步:分析
    根据os、version、sign等关键词,很快能找到底层封装api请求的类,分析后发现:

    - 上面说到的a参数,实际是用户的token,用户一次登录后就不会变了。注册一个真实的账号,登录,抓包把token copy出来,可以用很长时间。实际操作中发现token和cookie是关联的,需要同时把cookie也拿出来。(这里可以继续分析生成token的代码,A产品有个refreshtoken接口,根据用户名密码获取token,因为是个临时项目,就不研究了)

    - header中的sign参数,是url的签名,是一个叫UrlSign的类生成的,输入url和时间戳,输出一个sign签名。再继续分析,发现这个类的实现在native层,得继续分析so包。

    用ida打开so包,根据方法名搜索到对应的实现,尝试把代码看懂,重写一遍。由于这个方法又调用了几个很长的方法,还调用了一些C函数,比较难重写,放弃。换一条路,自己写一个安卓工程,只要包名相同,就可以把这个so引进去,直接调用so包里的方法,得到url签名。但当我创建完安卓工程,so包总是引入失败,再检查JNI_OnLoad函数,发现so包加了签名校验。

    so包签名校验的一般方法是在so中获取当前安卓包的签名,跟so中的签名做对比,如果不一致就直接加载失败,以防止其他程序调用so包的方法。so包的代码是没办法删减的,只能修改部分指令,来跳过签名校验。

    通过ida分析签名校验的代码,这里的逻辑是,获取到签名之后,用一个while循环遍历每一个字符做比较,不相等则加载失败,循环结束则进入加载流程。改动方法就是让while循环一次就跳出,再把这次循环中的比较逻辑强制通过。

    ida可以直接修改so包,打开Edit->Patch Program->Change byte,修改对应的指令,然后Edit->Patch Program->Apple patches to input file。

    修改完的so包,打包到自己的安卓工程中,传入前面抓包得到的url,得到的sign值和header中相同,验证通过,so包破解完毕。到了这儿,整个分析工作就完成了。

    第四步:写爬虫
    搭建个服务器,做任务调度。

    因为用到了安卓的so包,整个爬虫代码要运行到安卓端,写个安卓的工程,请求任务,抓取内容并上传到服务器,后面的工作就没什么难度了。但这里有个更重要的事情:防止被对方发现。注意清掉本地信息、用与本人无关的手机号注册小号、挂代理、购买服务器也注意脱离关系。

    总结


    好了,以上是整个分析和抓取的过程,从中也可以看到不少移动端安防注意事项:

    - https、加固、混淆都一定要做,而且是越早做越好。

    - 只有https还是不够的,还要做双向验证,防止像Charles这样的工具伪造证书(其实只要能抓到包,Charles配合着按键精灵就能开始抓数据了)。

    - 如果有条件用自己的协议,尽量不用http,这样破解方不但难抓包,而且比较难伪造api请求。

    - 代码中的关键信息(如:关键参数、token、各种key),都要做一下混淆,不要在二进制文件中轻松被搜到。

    - 关键代码不要封装成函数,否则会被对方直接调用,这里可以把代码封装成宏,打包的时候,宏会在每个使用的地方展开成一坨坨代码,破解方想调用这段代码只能重写。

    - 服务端要做好防护,A家产品服务端的安全策略应该很弱,一个token一天请求上万次都不会被封。

    写到最后


    当然,即便以上防护都做了,还是会有办法破解。爬虫的攻防,就是魔高一尺,道高一丈,只要跟利益相关的东西,就总有办法能搞定,毕竟爬虫就是伴随着数据应运而生,而数据的价值,有时候比代码还要大。

    关于破解和逆向,经常不会被当做主流技术,有时候为了破解一家产品,还需要用到一些风骚的技能,而破解的成功与否,更多取决于对方安全是否做的足够好,劝某些产品的安全部门耗子尾汁,年轻人要讲“武德”,做好安全防范。

    破解的过程有时也是学习的过程,除了学习对方安全防御,也能学习对方的代码、框架,更能在很多方面开拓眼界。

    #########

  • 相关阅读:
    Netty源码分析-ChannelPipeline事件传播
    Netty源码分析-NioEventLoop事件轮询
    Netty源码分析-ServerBootstrap启动过程
    Canal基本原理
    [Android]proguard重新编译和如何不混淆第三方jar包
    [Android]listview recycleview的复用问题
    [Android] android .keystore文件转x509pem工具
    [Android] android studio 2.0即时运行功能探秘
    大神都是有个起点的
    Python列表的用法和基本操作
  • 原文地址:https://www.cnblogs.com/andy0816/p/15364761.html
Copyright © 2011-2022 走看看