Android逆向目录
逆向工程
来自维基百科的定义:https://zh.wikipedia.org/zh-hans/逆向工程
逆向工程(又称反向工程),是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在不能轻易获得必要的生产信息下,直接从成品的分析,推导出产品的设计原理。逆向工程可能会被误认为是对知识产权的严重侵害,但是在实际应用上,反而可能会保护知识产权所有者。例如在集成电路领域,如果怀疑某公司侵犯知识产权,可以用逆向工程技术来寻找证据。
对最终程序的二进制代码所进行的逆向工程被称为“代码反向工程”,或简称RCE(Reverse Code Engineering)。
逆向技术常见的应用场景
app安全审查
系统漏洞挖掘
恶意代码杀查
同行业竞品技术原理分析
移除安全机制
知识点
Java基础(JCA、JSSE)
文件格式(DEX、OAT、ELF、Smali、resources.arsc)
Smali阅读、arm反汇编阅读
Apktool、smali/baksmali、enjarify、android-classyshark、jadx、JD-GUI、BytecodeViewer、Android Killer的使用
JEB、jdb、Android Studio/Intellij IDEA、gdb、IDA Pro的使用
需要掌握的技能表
操作系统的安全架构
操作系统中可执行文件格式
反汇编工具的使用
反汇编代码的阅读理解
调试器的使用
网络抓包工具的使用
加解密知识
逆向工具使用
1.反编译工具
Apktool/Shakaapktool
、smali/baksmali
、dex2jar
、enjarify
2.静态分析工具
android-classyshark
、jadx
、JD-GUI
、BytecodeViewer
、Android Killer
的使用
3.动态调试工具
JEB
、jdb
、Android Studio/Intellij IDEA
、gdb
、IDA Pro
的使用
4.Hook框架
Cydia Substrate
、Xposed
、adbi
、Frida
等。
5.沙盒环境
DroidBox
反编译工具
Apktool
https://bitbucket.org/iBotPeaches/apktool/
Shakaapktool
http://www.rover12421.com/shakaapktool/
为什么选择Shakaapktool?
Shaka
(沙加,黄金圣斗士之一)
处女座沙加(SHAKA):被誉为最接近神的圣斗士,平时闭著双眼,但当他张开眼睛时,其力量会大为增加,并使出天舞宝轮,夺去敌人的五感。
Shakaapktool
http://www.rover12421.com/shakaapktool/
增强功能:
对抗反反编译:
修正官方Bug:
smali/baksmali
https://bitbucket.org/JesusFreke/smali
安卓反汇编的基石
Smali反汇编
Smali->Dex/Dex->Smali/Odex->Dex
Smali
动态调试->smalidea
smali/baksmali
https://bitbucket.org/JesusFreke/smali
Dex字节码
:https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
Dex文件格式:
https://source.android.com/devices/tech/dalvik/dex-format.html
Smali寄存器与参数传递:
https://github.com/JesusFreke/smali/wiki/Registers
Smali动态调试:
https://github.com/JesusFreke/smali/wiki/smalidea
反编译工具
Dex2jar
https://github.com/pxb1988/dex2jar
Enjarify
https://github.com/google/enjarify
VS
AndroidCrackTool
http://www.pd521.com/thread-1194-1-1.html
Android逆向助手
http://weibo.com/kgdiwss
JD-GUI
http://jd.benow.ca/
静态分析工具
android-classyshark
https://github.com/google/android-classyshark
jadx
https://github.com/skylot/jadx
BytecodeViewer
https://github.com/Konloch/bytecode-viewer
Android Killer
Dalvik Debugger
jdb
adb shell am start -D -n com.droider.crackme0201/.MainActivity
monitor
jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=127.0.0.1
methods com.tencent.crackme0201.MainActivity
stop in com.droider.crackme0201.MainActivity.checkSN(java.lang.String, java.lang.String)
where
step
step
step
locals
dump this
动态调试工具
Dalvik Debugger
Android Studio/Intellij IDEA + smalidea
https://github.com/JesusFreke/smali/wiki/smalidea
Native Debugger
gdb
gdb: ~/Library/Android/android-ndk-r12b/prebuilt/darwin-x86_64/bin/gdb
gdbserver: ~/Library/Android/android-ndk-r12b/prebuilt/android-arm/gdbserver
Native Debugger
gdb
gdbserver :3333 --attach pid
or
gdbserver :3333 /data/local/tmp/xxx
/* android_gdb
#!/bin/sh
~/Library/Android/android-ndk-r12b/prebuilt/darwin-x86_64/bin/gdb "$@”
*/
adb forward tcp:3333 tcp:3333
android_gdb /xxx
(gdb) target remote :3333
(gdb) set disassemble-next on
(gdb) break *xxx
(gdb) layout asm
(gdb) layout regs
(gdb) c
Native Debugger
gdb + Affinic Debugger
Native Debugger
lldb + ds2
https://github.com/facebook/ds2
Dalvik Debugger + Native Debugger
JEB2
https://www.pnfsoftware.com
Dalvik Debugger + Native Debugger
IDA Pro
Hook 框架
JEB2
https://www.pnfsoftware.com
Cydia Substrate
http://www.cydiasubstrate.com
DumpDex
: https://github.com/WooyunDota/DumpDex
最为强大的安卓Java层Hook框架
1.Apk方法Hook
2.系统方法Hook
3.系统资源修改
4.系统增强补丁
Xposed
https://github.com/rovo89/Xposed
最为强大的安卓Java层Hook框架 微信抢红包?
1.Apk方法Hook
聊天消息防撤回?
https://github.com/fkzhang/WechatUnrecalled
public void hookMethod(ClassLoader classLoader) {
try {
XposedBridge.log("now hook crypt...");
Class<?> clzAC = XposedHelpers.findClass("com.cxx.b.ac", classLoader);
XposedBridge.hookAllMethods(clzAC, "h", new HookedMD5Method());
} catch (Throwable t) {
XposedBridge.log(t);
}
}
public static class HookedMD5Method extends XC_MethodHook {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
CommLog.e(TAG, "after " + param.method.getName() + "...");
String r0 = (String) param.args[0];
String ret = (String) param.getResult();
String pre = param.method.getName();
CommLog.e(TAG, pre + " data:" + r0);
CommLog.e(TAG, pre + " ret:" + ret);
super.afterHookedMethod(param);
}
}
Xposed
https://github.com/rovo89/Xposed
最为强大的安卓Java层Hook框架
https://github.com/AndroidKnife/XposedDebug
https://github.com/rovo89/XposedInstaller
2.系统方法Hook
Xposed
https://github.com/rovo89/Xposed
最为强大的安卓Java层Hook框架
http://repo.xposed.info/module-overview
3.系统资源修改
Xposed
https://github.com/rovo89/Xposed
最为强大的安卓Java层Hook框架
4.系统增强补丁
App Settings
: https://github.com/rovo89/XposedAppSettings
Xprivacy
https://github.com/M66B/XPrivacy
NekoSMS
https://github.com/apsun/NekoSMS
……
Hook
框架
adbi
https://github.com/crmulliner/adbi
鹰眼
https://github.com/MindMac/AndroidEagleEye
Frida
https://github.com/frida/frida
Hook Native
,打印调用参数
Hook Java:
加解密基础
1.安卓中的JCA与JSSE
2.对称加密
3.非对称加密
4.数字证书
5.算法工具
安卓中的JCA与JSSE
JCA( Java Cryptography Architecture)
设计原则:
1.实现的独立性与互用性
2.算法的独立性与扩展性
实现的独立性-使用密码学服务( cryptographic services
),加密解密、数字
签名、数据摘要等算法的实现都基于这些概念。
算法的独立性-使用基于provider
的架构,Cryptographic Service Provider (CSP)
必须实现一个或多个密码学服务。
实现的互用性-每个实现能够协同合作,如密钥的使用、签名的验证,对于同一
个算法而言, providerA生成的密钥要能被providerB
使用,
providerA
生成的签名要能被providerB
验证。
算法的扩展性-新算法要易于添加。
CSP( Cryptographic Service Providers)
MessageDigest md = MessageDigest.getInstance(“MD5”);
MessageDigest md = MessageDigest.getInstance(“MD5”, “ProviderC”);
CSP( Cryptographic Service Providers)
Android中的Provider
Provider[] providers = java.security.Security.getProviders();
for (Provider p : providers) {
System.out.printf("%s/%s/%f\n", p.getName(), p.getInfo(), p.getVersion());
Set<Provider.Service> services = p.getServices();
for (Provider.Service s : services) {
System.out.printf("\t%s/%s/%s\n", s.getType(),
s.getAlgorithm(), s.getClassName());
}
}
CSP( Cryptographic Service Providers)
Android中的Provider
Android 4.4:
AndroidOpenSSL/Android’s OpenSSL-backed security provider/1.000000
DRLCertFactory/ASN.1, DER, PkiPath, PKCS7/1.000000
BC/BouncyCastle Security Provider v1.49/1.490000
Crypto/HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)/1.000000
HarmonyJSSE/Harmony JSSE Provider/1.000000
AndroidKeyStore/Android KeyStore security provider/1.000000
Android 6.0.1:
AndroidOpenSSL/Android’s OpenSSL-backed security provider/1.000000
AndroidKeyStoreBCWorkaround/Android KeyStore security provider to work around BC/1.000000
BC/BouncyCastle Security Provider v1.52/1.520000
Crypto/HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)/1.000000
HarmonyJSSE/Harmony JSSE Provider/1.000000
AndroidKeyStore/Android KeyStore security provider/1.000000
Android N: Deprecated?
http://android-developers.blogspot.com/2016/06/security-crypto-provider-deprecated-in.html
SPI(Service Provider Interface)
Providers中的接口通过SPI定义。 Signature -> SignatureSpi Cipher -> CipherSpi
JCA主要的API:
引擎类与算法:
加解密操作、密钥与算法参数转换、对象高层表示
JCA主要的API:
核心类与接口:
SPI Service Provider Interface
安全相关的API:
java.security
javax.crypto
java.security.cert
java.security.spec
javax.crypto.spec
java.security.interfaces
javax.crypto.interfaces
import javax.crypto.*;
Cipher c = Cipher.getInstance("AES");
c.init(ENCRYPT_MODE, key);
KeyStore 密钥存储
KeyStore类型:
1.jks。SunJCE Provider提供,安卓中无法使用。
2.bks。BC Provider提供,安卓默认支持。
3.pkcs12。JDKPKCS12KeyStore, BC Provider提供,安卓默认支持。
4.dks。Domain KeyStore。不常用。
bks
pkcs12
JSSE(Java Secure Socket Extension)
JSSE的用途:为Java版本的SSL(Secure Sockets Layer )与
TLS(Transport Layer Security )提供框架实现
。
JSSE标准API:
ServerSocketFactory
、SocketFactory
2.非阻塞引擎用于处理SSL/TLS数据流(SSLEngine)
3.创建套接字、服务套接字、SSL服务套接字以及使用的类
4.套接字的类表示:安全套接字上下文类、安全工厂类与引擎类
5.密钥与信任管理器接口(X509KeyManager、X509TrustManager)
安卓JSSE中的Provider:
HarmonyJSSE Provider
:旧版本使用,代码基于Java实现。
OpenSSL Provider
:新版本使用,代码基于JNI Native调用。
安卓中的证书绑定(Cert Pinning)
https://developer.android.com/training/articles/security-ssl.html
绕过证书绑定!!!(Breaking Cert Pinning)
Hook绕过
基于Xposed:JustTrustMe
https://github.com/Fuzion24/JustTrustMe
基于Substrate:Android-SSL-TrustKiller
https://github.com/iSECPartners/Android-SSL-TrustKiller
Cipher类
algorithm/mode/padding
algorithm
:算法。AES、DES、DESede等。
mode
:分组模式。ECB、CBC、CFB、OFB、CTR等。
padding
:填充模式。PKCS5Padding、PKCS7Padding、NoPadding、ZeroPadding
常见的对称加密算法
公钥与私钥
存储格式:
DER(Distinguished Encoding Rules)
:区分编码规则。二进制格式,记录的第一个字段信息是一个
ASN.1(Abstract Syntax Notation One)对象。DER可用于编码公钥、私钥与证书。
PEM(Privacy Enhanced Mail)
:保密邮件的编码标准。信息转换为ASCII码或其他编码,使用BASE64对
加密后的信息进行编码。 DER可用于编码公钥、私钥与证书。
XML
:一些密码学的库支持使用XML保存公钥与私钥信息。
存储规范:
PKCS#1: RSA Public/Private Key file
。Java默认支持。
PKCS#8: Public/Private Key file
。OpenSSL默认支持。
ASN.1 git://git.savannah.gnu.org/libtasn1.git
公钥与私钥
公钥与私钥-DER with PKCS#1
DER PrivateKey:
->
DER PublicKey:
->
公钥与私钥-DER with PKCS#8
DER PrivateKey:
->
DER PublicKey:
->
公钥与私钥-PEM with PKCS#8
PEM PrivateKey:
PEM PublicKey:
公钥与私钥-XML
XML PrivateKey:
PEM PublicKey:
数字证书
什么是数字证书?
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书
包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时
间段内有效。
简单的说:在密码学领域,数字证书就是带有数字签名的公钥!
存储格式:
DER(Distinguished Encoding Rules)
:区分编码规则。二进制格式,记录的第一个字段信息是一个
ASN.1(Abstract Syntax Notation One)对象。DER可用于编码公钥、私钥与证书。
PEM(Privacy Enhanced Mail)
:保密邮件的编码标准。信息转换为ASCII码或其他编码,使用BASE64对
加密后的信息进行编码。 DER可用于编码公钥、私钥与证书。
存储规范:
X509
:安卓系统大量使用的证书规范。目前使用v3版本。
PKCS#7
: .p7c格式结尾。PEM存储的话,会以“-----BEGIN PKCS7-----” 和 “-----END PKCS7-----”
做头尾标记,存储证书链与单个证书。
PKCS#12
: .pfx或.p12格式结尾。可存储证书、私钥及公钥。
X509 PEM证书
算法工具
JCrypTool/CrypTool
http://www.cryptool.org
openssl
https://github.com/openssl/openssl
echo -n "hello" | openssl aes-128-cbc -a -e -K e0e0e0e0f1f1f1f1e0e0e0e0f1f1f1f1 -iv e0e0e0e0f1f1f1f1e0e0e0e0f1f1f1f1
tv611lW0N+HKtQi+ysr2TQ==
RECalcTool
协议分析
1.网络抓包
2.数据包分析与识别
3.日志分析
4.代码分析与算法识别
5.Hook输出或动态调试
6.测试结果
抓包工具
Http/Socket抓包
:
tcpdump
:
adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap
tcpdump -> WireShark
Http/Https抓包:
Fiddler、Burpsuite、Charles
1.手机导入FakeCert.crt
2.抓包工具配置Https代理
3.手机设置代理服务器
4.手机Hook Breaking SSL Pinning
5.抓包测试
Http/Https抓包配置
通信协议
数据格式
红色与绿色部分:
对应的部分是固定值,猜测
是协议的固定字段部分。
黑色部分:
应该是通信的真正数据,数据的长度为16字节的整数倍,猜测是使用对称或非对称加密,而通信传输一般使用对称加密,故猜测此处使用对称加密,接下来需要反编译代码,验证猜测,找到密钥与算法。
数据包分析与识别
通信协议
REST or SOAP
数据格式
JSON
application/octet-stream
常见的压缩算法
1F 8B 08 -> gzip
常见压缩算法数据头部:
gzip 1F 8B 08
zip 50 4B (PK)``
rar 52 61 72 21(Rar!)``
zlib 78 9c
lzma 6c 00
lz4 04 22 4D
日志分析
App日志输出
默认开启日志输出
自带了日志输出但默认关闭
过时的方法-Smali注入
针对日志输出语句被移除,但日志框架保留
代码分析与算法识别
IDA Pro + FindCrypt2
AES Init
Rijndael S-box
AES_cbc_encrypt with PKCS5padding
PKCS5Padding
有如下特点:
1.填充的字节都是一个相同的字节。
2.该字节的值,就是要填充的字节的个数。
如果要填充8个字节,那么填充的字节的值就是0×8;
要填充7个字节,那么填入的值就是0×7;
如果只填充1个字节,那么填入的值就是0×1;
PKCS5Padding
与PKCS7Padding
的区别:
前者只作用于块大小为64字节的数据,后者没有此限制。
CBC(密码分组链接模式)
CBC模式原理
RSA/ECB/PKCS1Padding
PKCS1Padding填充规则
RSA 1024 自定义Padding长度12,默认11,数据长117字节
Hook输出或动态调试
Hook:
App壳
1.简述 脱壳前学习的知识、壳的历史、脱壳方法
2.第一代壳
3.第二代壳
4.第三代壳
5.第N代壳
简述
1.Apk文件结构
2.Dex文件结构
3.壳史
4.壳的识别
Apk文件结构
Dex文件结构
壳史
第一代壳 Dex加密
1.Dex字符串加密
2.资源加密
3.对抗反编译
4.反调试
5.自定义DexClassLoader
第二代壳 Dex抽取与So加固
1.对抗第一代壳常见的脱壳法
1.Dex Method代码抽取到外部(通常企业版)
2.Dex动态加载
3.So加密
第三代壳 Dex动态解密与So混淆
1.Dex Method代码动态解密
2.So代码膨胀混淆
3.对抗之前出现的所有脱壳法
第四代壳 arm vmp(未来)
1.vmp
壳的识别
常用加固厂商特征
娜迦: libchaosvmp.so , libddog.solibfdog.so
爱加密:libexec.so, libexecmain.so
梆梆: libsecexe.so, libsecmain.so , libDexHelper.so
360:libprotectClass.so, libjiagu.so
通付盾:libegis.so
网秦:libnqshield.so
百度:libbaiduprotect.so
基于特征的识别代码
第一代壳
1.内存Dump法
2.文件监视法
3.Hook法
4.定制系统
5.动态调试法
内存Dump法
内存中寻找dex.035
或者dex.036
/proc/xxx/maps
中查找后,手动Dump
内存中寻找dex.035
或者dex.036
android-unpacker
https://github.com/strazzere/android-unpacker
升级版的android-unpacker
,read
和lseek64
代替pread
,匹配dex
代替匹配odex
IDA Pro + dumpDEX
dumpDex
https://github.com/CvvT/dumpDex
文件监视法
Dex优化生成odex
inotifywait-for-Android
https://github.com/mkttanabe/inotifywait-for-Android
监视文件变化
Dex优化生成odex
inotifywait-for-Android
https://github.com/mkttanabe/inotifywait-for-Android
监视DexOpt输出
hook法
Hook dvmDexFileOpenPartial
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp
Hook dvmDexFileOpenPartial
定制系统
修改安卓源码并刷机
DumpApk
https://github.com/CvvT/DumpApk
只针对部分壳
IDA Pro
动态调试法
gdb gcore法
.gdbserver :1234 –attach pid
.gdb
(gdb) target remote :1234
(gdb) gcore
coredump文件中搜索“dex.035”
第二代壳
1.内存重组法
2.Hook法
3.动态调试
4.定制系统
5.静态脱壳机
内存重组法
Dex篇
ZjDroid
http://bbs.pediy.com/showthread.php?t=190494
Dex篇
ZjDroid
http://bbs.pediy.com/showthread.php?t=190494
对付一切内存中完整的dex,包括壳与动态加载的jar
so篇
elfrebuild
构造soinfo
,然后对其进行重建
hook法
针对无代码抽取且Hook dvmDexFileOpenPartial失败
Hook dexFileParse`
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp
针对无代码抽取且Hook dexFileParse
失败
Hook memcmp
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp
针对无代码抽取且Hook dexFileParse
失败
Hook memcmp
http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp
针对无代码抽取且Hook dexFileParse失败
Hook memcmp
修改安卓源码并刷机-针对无抽取代码
https://github.com/bunnyblue/DexExtractor
DexHunter-
最强大的二代壳脱壳工具
https://github.com/zyq8709/DexHunter
DexHunter
的工作流程
工作原理
动态调试
绕过三进程反调试
http://bbs.pediy.com/showthread.php?p=1439627
gcore防Dump
解决方案:
http://bbs.pediy.com/showthread.php?t=198995
断点mmap调试
,针对Hook dexFileParse
无效
原理:
dexopt
优化时,dvmContinueOptimization()->mmap()
分析壳so逻辑并还原加密算法
http://www.cnblogs.com/2014asm/p/4924342.html
自定义linker脱so壳
https://github.com/devilogic/udog
main() -> dump_file()
第三代壳
dex2oat法
ART模式下,dex2oat生成oat时,内存中的DEX是完整的
http://bbs.pediy.com/showthread.php?t=210532
Hook Dalvik_dalvik_system_DexFile_defineClassNative
枚举所有DexClassDef
,对所有的class,调用dvmDefineClass
进行强制加载
第N代壳
so + vmp
动态调试 + 人肉还原
NOW AND FUTURE
安全防护
1.安全建议
2.其它安全技术
3.代码安全审计
4.安全测试框架
5.App加固
6.App测试平台
安全建议
Proguard混淆 proguard-android.txt
Log
清除
so符号strip g++ -fvisibility=hidden –s
so ollvm https://github.com/obfuscator-llvm/obfuscator
使用未公开的安全技术
安全审计
其他安全技术
DEX自修改技术
selfmodify
https://github.com/leonnewton/selfmodify
so模块隐藏技术
Android_memLoader
https://github.com/1683942030/Android_memLoader_src
代码平台审计框架
安卓平台审计框架
drozer https://github.com/mwrlabs/drozer
安全测试框架
MobSF
https://github.com/ajinabraham/Mobile-Security-Framework-MobSF
App加固
加固平台
加固宝
http://jiagu.360.cn/
扫描平台
网址
360捉虫猎手
阿里聚安全漏洞扫描
腾讯金刚审计系统
http://service.security.tencent.com/kingkong
百度移动云测试中心
http://mtc.baidu.com/startTest/safe
AppRisk Scanner
https://apprisk.newskysecurity.com
爱加密
梆梆加固
AppTest掌测
TestIn测试平台
腾讯优测
爱内测
AppScan
http://www-03.ibm.com/software/products/zh/appscan-mobile-analyzer
Fortify SCA
http://www8.hp.com/us/en/software-solutions/application-security/