android动态逆向
① Android逆向之手机环境配置
该篇文章主要介绍在Android逆向开始之前的 手机环境配置 。其中包括对手机进行 刷机 (根据所需的Android手机型号、Android系统版本进行刷机。这里我以nexus 5 android 6.0.1为例,其他Google系手机型号及刷其他Android版本系统都是类似的);第二个则是安装Android逆向分析 hook框架山启卜 (Xposed、frida)及一些常用的基础插件等。
一、刷机前准备
二、开始对nexus 5刷机(Android 6.0.1)
需要使用低版本的platform-tools进行替代,具体的操作步骤,可以参考以下文章
https://www.jianshu.com/p/d40db7e08e3e
三、刷入第三方recovery(TWRP)到新系统中
四、对刚刷完的Android系统进行root
五、安装Xposed框架、frida-server 及Android逆向分析中常见的插件
综上所述,该篇文章主要是使用Android官方的系统镜像进行刷机,然后安装旁如配置Android逆向所需的框架及插件。在刷机的时候,我逗穗们也可以选择自己修改编译Android系统源码,再进行刷机,定制我们自己所需的分析环境。
更多精彩内容,请扫码关注以下公众号
② Android逆向工程师是做什么的
必须掌握的技能
1、负责安卓程序的加解密和数据传输分析、拆解、逆向等工作;
2 、逆向APK,了解运行过程;
3 、Andorid本地提权获得root权限;
4 、熟练掌握软件逆向静态分析、动态调试、代码跟踪等;
5 、熟悉Android开发,了解打包、反编译、破解流程;
6 、so破解。
目前了解的如下:
1,加解密:这就很多了,一般都是遇到后再折腾解密,而且解密代码和秘钥一般都在代码里面。
2,Andorid本地提权获得root权限,一般真机是用recovery刷机包,但是病毒提权是怎么样的
目前掌握的一种提权的是像输入命令行一样输入su并且用pm提权
还有一种是修改init.rc文件
3,ida动态调式和代码跟踪
4,打包,编译和破解的流程是什么样的?
5,so破解:一般就是破壳。各种壳(360,娜迦等等)
加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。加壳的程序经常想尽办法阻止外部程序或软件对加壳程序的反汇编分析或者动态分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。
6,了解反破解的技术
目前掌握的技术有:
1,反模拟器
2,反静态代码分析器如:反jeb
应该也是有很多反ida的,也就是加壳。
任职要求
1、具有丰富的Android开发分析经验,熟悉android系统架构,熟悉android安全机制;
2、精通汇编语言、java、C/C++语言,熟悉Smali语言,对逆向工程有浓厚兴趣;
3、熟练掌握ida、gdb逆向分析工具;
4、熟练掌握软件逆向静态分析、动态调试、代码跟踪等;
5、熟悉so和Java层hook;
6、熟悉Android开发,了解打包、反编译、破解流程;
7、深入理解arm Linux和Android底层运行机制;
8、熟练掌握各种调试工具:Smali、Dedexer、Dexmp、Apktool、Dex2jar、jd-gui。
③ 什么叫android 逆向开发
就是ANDROID程序的目标代码反向到JAVA源程序,不是反汇编,是返JAVA。
一般WINDOWS下.exe只能反汇编。但JAVA是解释执行,伪编译生成的是中间
机器码,可以逆向到源程序,但没有了注释。
④ 瀹夊崜阃嗗悜鏄浠涔
瀹夊崜鏄涓绉嶅熀浜嶭inux镄勮嚜鐢卞强寮鏀炬簮浠g爜镄勬搷浣灭郴缁燂纴涓昏佷娇鐢ㄤ簬绉诲姩璁惧囷纴濡傛櫤鑳芥坠链哄拰骞虫澘鐢佃剳锛岀敱Google鍏鍙稿拰寮鏀炬坠链鸿仈鐩熼嗗煎强寮鍙戙傚畨鍗挞嗗悜灏辨槸灏嗗畨瑁呭寘apk鏂囦欢杩桦师鎴愭墦鍖呭墠镄勬牱瀛愩傞嗗悜鍒嗘瀽鏄涓闂ㄦ妧链锛屼篃鏄涓闂ㄨ压链銆
鍒嗙被锛
1銆佸簲鐢ㄥ眰APK阃嗗悜銆
2銆佸畨鍗撹惧囨嗘灦阃嗗悜銆
3銆佸唴镙搁┍锷ㄩ嗗悜銆
4銆佸熀浜庡畨鍗撶殑纭浠朵骇鍝侀嗗悜銆
⑤ Android软件安全与逆向分析的Android术语
逆向分析是一种逆向工程技术,是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理 。Android 软件安全与逆向分析是针对Android 软件的逆向分析,对原有APK文件进行反向研究,包括对语法,代码等进行分析,破解原有APK的源代码,资源文件比如图片,音频等等行为。
1.APK一旦被破解,反编译之后的源码就被破解者获取,开发者的劳动成果就被窃取,危害了开发者的利益。
2.反编译的APK如果被进行二次打包,那么APP就成为盗版产品,盗版产品侵害开发者的版权
3.反编译的产品有可能被破解者进行二次打包,注入恶意代码,窃取用户隐私,恶意扣除用户手机流量和资费,获取用户数据等等,这些行为严重伤害用户的利益。
4.盗版产品不受保护,用户得不到合理的售后支持和服务。
在这种情况下就需要加强对安卓APK DEX文件进行保护的技术,防止反编译。dex文件其实就是Android系统中可以在Dalvik虚拟机上直接运行的文件格式。Java源码通过ADT编译成Smali语言这是一个优化的过程,相对于.class文件它体积小、运行效率高、被编译后可读性低;Smali再到class. DEX本身就是一个加壳保护的过程。 DEX文件如果未做好保护,黑客通过反编译可让源码完全暴露,可利用阅读源码来找到App的设计流程,通过对程序流程的了解将很容易对程序进行盗版、恶意篡改、恶意代码注入等危险行为 。
1.隔离Jave程序。这种是最根本的保护,将一些关键的Class文件进行加密,例如对注册码、序列号管理相关的类进行加密,开发人员可以将关键的JavaClass放在服务器端,用户通过服务器接口获取服务而不是直接通过java文件。破解者就无法获取class文件了。目前有很多通过接口提供服务的标准和协议,比如HTTP,webservice,RPC等等。但是呢,这种方式并不是适合所有的APP,比如单机运行的程序的无法隔离Java程序。
2.对class文件进行加密保护。开发者可以将一些关键的class文件进行加密,比如对注册码,序列号管理相关的类进行加密来防止反编译。在使用这些被加密的类之前,程序需要首先对这些类进行解密,然后才能将这些类加载在JVM中。要解密这些类,必须要通过一些硬件或是软件才能完成。
3.转换成本地代码
这是一种防止反编译的比较有效的方法。因为本地代码往往难以被反编译。开发人员可以选择将整个应用程序转换成本地代码,或者可以选择关键模块转换。如果仅仅转换关键部分模块,Java程序在使用这些模块时,需要使用JNI技术进行调用。当然,在使用这种技术保护Java程序的同时,也牺牲了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的本地代码,这将加重软件支持和维护的工作。不过对于一些关键的模块,有时这种方案往往是必要的。为了保证这些本地代码不被修改和替代,通常需要对这些代码进行数字签名。在使用这些本地代码之前,往往需要对这些本地代码进行认证,确保这些代码没有被黑客更改。如果签名检查通过,则调用相关JNI方法.
4.代码混淆
代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来说,黑客如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译。下面我们会详细介绍混淆技术,因为混淆是一种保护Java程序的重要技术 。
5.第三方工具加密
上面四种方式可能要耗费开发者很大一部分精力和时间,如果想要方便的话,可以寻求第三方的加密工具。目前市场上有一些工具是可以帮助APK加密的,比较知名的是爱加密的加密平台。相对于上面四种方式,这种第三方的加密工具要更全面和专业,可以有效的保护dex文件,so库文件,xml主配文件以及其他资源文件不被反编译和恶意篡改。
爱加密专家提醒,这些方式并不是独立运用的,有时候可以混合使用,根据自己的情况来定,比如说高级混淆之后还是可以使用第三方的爱加密工具进行高级保护,多一重安全。
⑥ Android逆向 ida动态调试问题
先输入”adb shell”,然后输入”su root”获取root权限。
接着输入” chmod 777 /data/local/tmp/android_server” 给android_server加上相应的权限。
接着输入” /data/local/tmp/android_server”启动android_server。
如下图所示:
输入”adb forward tcp:23946 tcp:23946”进行tcp端口转发
命令,启动所要调试的Activity。
app会弹出”Waitting for debugger”对话框,如下图所示:
点击”Debug options”按钮,在”Suspend on process entry point”, ”Suspend on thread start/exit”, ”Suspend on library load/unload” 等选项的前面打上勾,如下图所示:
点击”ok”后会在以下对话框的hostname中填上”localhost”
在弹出和物的”Choose process to attach to”窗口中找到”com.example.testjniso”进程,选中该进程,然后点击”ok”按钮。
其中可以看到com.example.testjniso进程的端口为8700。
如下图所示:
在ida弹出的”Add map”窗口中,一律点击”Cancle”按钮。
点击ida中的暂停调试按钮,暂停当前的调试,如下图所示:
右击libTestJniSo.so文件,在弹出的隐告框中点击”Jump to mole base”,跳转到libTestJniSo.so文件的起始地址。
按下Alt+T,弹出查找对话框中输入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下图所示:
点击”ok”按钮后,即可跳转到 Java_com_example_testjniso_MainActivity_helloFromJni 函数所在的起始地址。
然后在地址处下断点唤携液:
再按F9重新开始调试,点击app中的”点击加载so文件”按钮重新加载libTestJniSo.so,即可看到程序成功地停在了断点处:
到此处就可以正常地调试so文件了。
Linker是什么?
Linker就是/system/lib/linker,它是进程启动时第一个加载的模块,它负责管理elf可执行文件以及各个so文件的加载执行,还参与了调试的一些东西。通俗地说,它是一个elf文件的解释器。它可以加载elf可执行文件及so动态库。
在android 5.0下,不能执行android_server是因为android5.0自带的linker不支持加载非pie的elf文件,但如果自己实现一个可以加载pie的linker,不就可以解决这个问题了吗?对的,就是酱紫,补上自己的自定义linker在附件.
https://bbs.pediy.com/thread-206084.htm