JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互
jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一部分,它提供的一系列的API允许java和其他语言进行交互,实现了在java代码中调用其他语言的函数。通过jni的调用,能够实现这些功能:
1.当java无法独立完成时,可借助其他的语言,保证了跨平台的的同时对底层的控制
2.直接调用其他语言已经完成的一些现成功能
3.使用更加底层的语言实现程序对时间敏感性或对性能的要求
参考
NDK定义:Native Development Kit,是 Android的一个工具开发包
NDK是属于 Android 的,与Java并无直接关系
作用:快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK
即可通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互
应用场景:在Android的场景下 使用JNI
即 Android开发的功能需要本地代码(C/C++)实现
参考
0x00 时间相关反调试
通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time、gettimeofday,或者直接通过sys call来获取当前时间。另外,还可以通过自定义SIGALRM信号来判断程序运行是否超时。
0x01 检测关键文件
(1)/proc/pid/status、/proc/pid/task/pid/status
在调试状态下,Linux内核会向某些文件写入一些进程状态的信息,比如向/proc/pid/status或/proc/pid/task/pid/status文件的TracerPid字段写入调试进程的pid,在该文件的statue字段中写入t(tracing stop):
(2)/proc/pid/stat、/proc/pid/task/pid/stat
调试状态下/proc/pid/stat、/proc/pid/task/pid/stat文件中第二个字段是t(T):
(3)/proc/pid/wchan、/proc/pid/task/pid/wchan
若进程被调试,也会往/proc/pid/wchan、/proc/pid/task/pid/wchan文件中写入ptrace_stop。
0x02 检测端口号
使用IDA动态调试APK时,android_server默认监听23946端口,所以通过检测端口号可以起到一定的反调试作用。具体而言,可以通过检测/proc/net/tcp文件,或者直接system执行命令 netstat -apn 等。
0x03 检测android_server、gdb、gdbserver
在对APK进行动态调试时,可能会打开android_server、gdb、gdbserver等调试相关进程,一般情况下,这几个打开的进程名和文件名相同,所以可以通过运行状态下的进程名来检测这些调试相关进程。具体而言,可以通过打开/proc/pid/cmdline、/proc/pid/statue等文件来获取进程名。当然,这种检测方法非常容易绕过――直接修改android_server、gdb、gdbserver的名字即可。
0x04 signal
信号机制在apk调试攻防中有着非常重要的作用,大部分主流加固厂商都会通过信号机制来增加壳的强度。在反调试中最常见的要数SIGTRAP信号了,SIGTRAP原本是调试器设置断点时发出的信号,为了能更好的理解SIGTRAP信号反调试,先让我们看看一下调试器设置断点的原理:
参考
1、字符串加密:
现状:对于字符串来讲,程序里面的明文字符串给静态分析提供了极大的帮助,好比说根据界面特殊字符串提示信息,从而定义到程序代码块,或者获取程序使用的一些网络接口等等。
加固:对程序中使用到字符串的地方,首先获取到使用到的字符串,固然要注意哪些是能加密,哪些不能加密的,而后对字符串进行加密,并保存加密后的数据,再在使用字符串的地方插入解密算法,这样就很好的保护了明文字符串。
2、类名方法名混淆
现状:目前市面上的IOS应用基本上是没有使用类名方法名混淆的,因此只要咱们使用class-dump把应用的类和方法定义dump下来,而后根据方法名就可以判断不少程序的处理函数是在哪。从而进行hook等操做。
加固:对于程序中的类名方法名,本身产生一个随机的字符串来替换这些定义的类名和方法名,可是不是全部类名,方法名都能替换的,要过滤到系统有关的函数以及类,能够参考下开源项目:https://github.com/Polidea/ios-class-guard
3、程序代码混淆
现状:目前的iOS应用找到可执行文件而后拖到Hopper Disassembler或者IDA里面程序的逻辑基本一目了然。
加固:能够基于Xcode使用的编译器clang,而后在中间层也就是IR实现本身的一些混淆处理,好比加入一些无用的逻辑块啊,代码块啊,以及加入各类跳转可是又不影响程序原有的逻辑。能够参考下开源项目:https://github.com/obfuscator-llvm/obfuscator/ 固然开源项目中也是存在一些问题的,还需本身再去作一些优化工做。
4、加入安全SDK
现状:目前大多数IOS应用对于简单的反调试功能都没有,更别说注入检测,以及其它的一些检测了。
加固:加入SDK,包括多处调试检测,注入检测,越狱检测,关键代码加密,防篡改等等功能。并提供接口给开发者处理检测结果。
参考
什么是加固加壳
对App资源代码进行保护,使其不容易被反编译工具解开。
加固的核心在于保证软件正常运行的同时又能保证源码的安全性。
为什么要加固加壳
若应用不做任何安全防护,极易被病毒植入、广告替换、支付渠道篡改、钓鱼、信息劫持等,严重侵害开发者的利益。
加固的方向有哪些
从对抗静态分析入手
资源文件保护
dex文件保护
AndroidManifest.xml文件的保护
从对抗动态分析入手
反调试
反hook
从对抗重打包入手
Apk签名校验
安装包文件完整性校验
加固具体思路
dex和elf文件是加固的重心
为了避免dex文件被直接还原成java文件被读出核心逻辑,一般会把dex写到so文件里面。
而elf文件本身是so文件,一般会通过混淆加反调试等操作
几代加固方案对比
针对dex/elf的加固发展出不同的方案,一般分为5代或者四代。但是说实话这种分代的说法也是一种个人说法,不算是一种标准。
参考
当一个产品上线后,如果出现了bug,传统的方式是,收集bug,修复,重新发布新版本。这样用户还得重新下载apk,在这介绍的是不用重新安装apk修复bug,这样的技术就称之为热修复技术。
参考
(1)反汇编工具
反汇编工具是逆向分析中,最重要的工具,它不仅仅能够将可执行文件的.二进制代
码翻泽成汇编代码,同时还可以根据软件内部的互相调用关系分析软件的结构,识别
软件的函数调用。反汇编工具在逆向分析中作为前期的处理者,能够极大的减少人工
工作。我们主要使用的反汇编工具有:
Ollydbg l.10(自由软件,功能强大,结合静态反汇编与动态调试的分析器)
Win32Dasml (自由软件,静态分析工具)
IDA pr0 5.0 (商业软件,最强大的静态反汇编工具)
(2)动态调试工具
动态调试工具是人工逆向分析中所用到的主要工具,在经过反汇编工具的处理之
后,我们可以获得人量的软件信息,但是软件的行为和许多细节,必须在运行过程中
才能寻找出来,因此我们需要结合动态调试上具进行分析。我们主要使用的动态调试
工具有:
Ollydbg l.10(自由软件,功能强大,结合静态反汇编与动态调试的分析器)
Windbg 6.7【8】(免费软件,Microsoft公司的内核级调试工具)
(3)软件信息识别和修改工具
软件信息识别和修改工具,是软件信息分析的重要辅助工具,通过这些工具灼帮
助我们能够方便的获取软件的内部资源信息,问时还可以修改一砦细节,方便调试。
我们常州的软件信息识别和修改工具有:
Hedit l.0(共享软件,16进制编辑器)
PEiD 0.94(免费较件,软件信息和编写语言分析工具)
(4)系统监视工具
作为黑箱分析的重要辅助手段,对于软件的各方面进行监视的工具是必不可少
的,我们将其分成网络监视,进程监视,文件监视和注册表监视网个方面:
Wireshark l.0 (免费软件,网络监视和包分析类软件)
Outpost Firewall 4.01 (共享软件,使用hook技术的Windows防火墙)
ProcExp 10.21 (免费软件,强人的进程分析软件)
FileMon 7.04 (免费软件,强大的文件读写监视软件)
RegMon 7.04 (免费软件,强大的注册表读写监视软件)
(5)专用反保护工具
LordPE (Win32 PE文件修改,转存工具)
ImportREC (Win32 PE文件结构修复软件)
AIl versions ASPack unpacker (免费软件,ASPack压缩壳脱壳工具)
UnPECompact2.02[19](免费软件,PECompact压缩壳脱壳工具)
UPX 3.0[20](自由软件,UPX压缩壳加壳和脱壳工具)