安卓逆向用到哪些工具,他们的作用是什么?
序号 | 软件名称 | 功能描述 | 增加时间 | 修改备注 |
1 | AndroidKiller(推荐) | 安卓APK反汇编工具 注意: 正常情况可以完成反编译,特殊(加固等)情况无法实现,需要其他知识 | 2021-07-12 | |
2 | IDA(推荐) | 动态调试,分析使用的开发工具 | 上传到模拟器后: 1:重命名为 mv android_server ad 2:赋权: chmod 777 ad 3:启动: ./ad | |
3 | android_server(推荐) | 位于{IDA_dir}/dbgsrv目录 | ||
4 | JEB | 安卓应用程序反编译工具,用于逆向工程或者审计apk文件 | Jeb3beta版安装即可使用 链接:https://pan.baidu.com/s/1A39COOOvfh_OM3WNQ-M8eA 提取码:m4cx | |
5 | 获取apk签名值 | |||
6 | 01editor | 分析apk的xml文件 | ||
7 | jadx(推荐) | 静态分析工具 | 可以直接把dex拖到应用里 图形化界面运行bin/jadx-gui.bat | |
8 | xposed | 可以自己写java代码进行实现逻辑 | 可以做java层代码代理,但是不可以做到nav层代码代理 | |
9 | CydiaSubStrate | 需要使用真机 | ||
10 | adbi框架 | adbi 是一个android平台(arm 32 )的so注入+挂钩框架 | 2021-07-12 | 源码位置 链接 预读说明 链接 |
11 | ELFARMHOOK | 2021-07-12 | 对so进行hook 手游使用 | |
12 | Zygote | 2021-07-12 | ||
13 | GEA | 将odex转成dex的工具 | 2021-07-12 | |
14 | winHex | 查看odex是否完整 | 2021-07-12 | |
15 | 安卓逆向助手(推荐) | 逆向安卓时用到的多种工具的集成 | 2021-07-12 | 下载地址 |
16 | ddms(推荐) | sdk目录下\tools\monitor.bat | 2021-07-12 | 运行方式? 安装位置: C:\Users\{用户名}\AppData\Local\Android\Sdk\tools 执行:monitor.bat |
17 | dev C++ | 2021-07-12 | ||
18 | beycompare | 文档对比工具 | 2021-07-12 | |
19 | ideasmali | 2021-07-12 | 说明文档 | |
20 | dexDump | 2021-07-12 | 解析dex时使用的工具 | |
21 | aapt | 2021-07-14 | 解析安卓arsc文件 | |
22 | mmap | |||
23 | dexhunter | 2021-07-14 | 第三代,开源项目,得到的是dex文件 | |
24 | ida自动插件脱壳 | 得到的是odex文件,需要使用工具进行转化获得dex,比dexhunter更先进些 | ||
25 | zjDroid | 第二代\第三代脱壳神器 | ||
26 | inotifywait | 辅助工具1,监听文件的打开和关闭 | ||
27 | memcmpdump | 辅助工具2 | ||
28 | android_server | 作用是什么? 使用时要注意什么? | ||
29 | 360动态脱壳机 | |||
30 | apk查壳工具 | 链接 | ||
31 | 其他加壳厂商可先看视频再继续研究 | |||
32 | dex2jar | |||
33 | 开源项目 | |||
34 | apk上上签 | 安卓项目加签工具 | 链接地址 | |
35 | frida(推荐) | 示例1 | ||
36 | QBDI(推荐) | 是一个模块化的跨平台以及跨架构的 DBI 框架。该工具目前支持 Linux、macOS、Android、iOS 和 Windows 操作系统 | ||
37 | xml2axml(推荐) | pc端将AndroidManifest.xml反编译和回编译 | ||
38 | MT管理器(推荐,移动端使用) | 我已经是会员了。 使用说明,关注: 1:文件管理里的文本对比 2:逆向功能 3:安装包提取功能 | ||
39 | 开发者助手(推荐,移动端使用) | |||
40 | 反射大师(推荐,移动端使用) | |||
42 | AndBug | 动态逆向分析工具(https://github.com/anbc/AndBug/) | 看雪文章:Android动态逆向分析工具 : Andbug之基本操作 、Andbug扩展功能 | |
43 | jswat | java写的GUI, | jswat无源码动态调试工具 | |
44 | androguard | 动态分析工具 | 看雪文章 关于androguard那点事 Androguard软件安装方法 | |
45 | Dev-c++ | c++学习会用到 |
文件转换过程及工具
序号 | 文件转换 | 转换流程 | 使用工具 | 备注 |
1 | odex -> dex | 直接转 | ||
2 | dex -> java | dex ->smali ->jar -> java | ||
3 | dex -> smali | 直接转 | 用 baksmali工具 | 使用安卓逆向助手吧,使用jar包我没有执行成功 |
4 | dex -> jar | dex ->smali ->jar | ||
5 | dex->oat | objdump | 待定 winHex打开dex进行阅读 | |
6 | oat->dex | 直接转 | extractDexFromOat 插件:oatract1.0分析oat文件 | |
7 | ||||
8 | ||||
9 |
adb常用命令
序号 | 命令行 | 功能介绍 |
1 | adb devices | 查看已经连接的设备列表 |
2 | adb -s 指定设备 shell | 去连接某个设备并进入手机管理 |
3 | adb shell | 如果只有一个设备的情况下,进入手机管理 |
4 | adb install {安装包文件} | 将某个apk安装到手机上 |
5 | adb push {电脑端文件路径} {手机端文件路径} | 将电脑端的文件推到手机端 |
6 | adb pull {手机端文件路径} {电脑端文件路径} | 将的手机端文件拉取到电脑端 |
7 | chmod 777 {指定要给权限的文件或者文件夹} | 指定文件或者文件夹的权限 |
8 | cd 进入目录 | 进入某个目录 |
9 | cat 查看文件内容 | |
10 | id | 获取当前用户信息 |
11 | ps | 查看当前系统所有进程 |
12 | kill -9 {pid}杀死进程 | 杀死某个进程 |
13 | ls 列出当前文件夹下的文件 | 列出当前文件夹下的文件 |
14 | mkdir 创建文件夹 | 创建文件夹, 例如 mkdir adir 在当前文件夹下创建一个名字为adir的文件夹 |
15 | touch 文件名 | 创建一个文件 |
16 | rm 文件名 rm -r 文件夹名称 | 删除文件,删除文件夹要使用-r参数,级联删除 |
17 | cp 源文件 目标文件位置 | 复制 |
18 | mv 源文件 目标位置 | 移动文件、重命名文件 |
正向开发需要需要了解的知识:
ndk开发流程,这个是我自己按照官方的例子重写了一下。
逆向动态调试需要了解的知识:
1 JNI_OnLoad 方法(调试点)
当Android的VM(Virtual Machine)执行到C组件(即*so档)里的System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。JNI_OnLoad和JNI_OnUnLoad函数
就像是DLL中的PROCESS ATTATCH和DEATTATCH的过程一样,可以同样做一些初始化和反初始化的动作
Android系统加载JNI Lib的方式有如下两种:
1) 通过JNI_OnLoad
2) 如果JNI Lib没有定义JNI_OnLoad,则dvm调用dvmResolveNativeMethod进行动态解析
如果JNI Lib中没有JNI_OnLoad,即在执行System.loadLibrary时,
无法把此JNI Lib实现的函数在进程中的地址增加到ClassObject->directMethods。
则直到需要调用的时候才会解析这些javah风格的函数 。
这样的函数dvmResolveNativeMethod(dalvik/vm/Native.cpp)来进行解析,
其执行流程如下所示:
void dvmResolveNativeMethod(const u4* args, JValue* pResult,
const Method* method, Thread* self) --> (Resolve a native method and invoke it.)
1) void* func = lookupSharedLibMethod(method)(根据signature在所有已经打开的.so中寻找此函数实现)
dvmHashForeach(gDvm.nativeLibs, findMethodInLib,(void*) method)->
findMethodInLib(void* vlib, void* vmethod)->
dlsym(pLib->handle, mangleCM)
2) dvmUseJNIBridge((Method*) method, func);
3) (*method->nativeFunc)(args, pResult, method, self); (调用执行)
跟多信息请阅读文章,https://blog.csdn.net/fireroll/article/details/50102009
反调试方法集锦及对应处理方法
反调试方法集锦
java层的Debug类的isDebugger方法
native层的isDebugged方法
检测status文件的TracePid
检测开放端口
isnotify文件监控/proc、pid/maps等文件打开事件与检测其中内存运行的文件
gettimeofday时间循环检测
fork父子循环检测
异常触发、非法指令、引入与异常信号陷阱
检测代码暂停时间
内存代码MD5自检查
inline函数监控
对应经典处理办法:
1:修改java层isDebugged方法返回
2:利用py脚本HOOK native层Debug方法
3:HOOK open、fopen函数动态下断点修改TracePid的值或者修改过反调试的内核
4:修改其他端口调试
5:修改内核改变文件打开事件响应与修改打开/proc/pid/mps后内存运行文件的结果:
6:HOOK gettimeofday函数让其不能循环
7:修改内核fork方法与多IDA挂起kill19等方法调试
8:修改异常指令信号与识别非发指令使用异常HOOK
9:HOOK常用获取时间的系统函数
10:修改检测时间,让其只检测一次
11:inline回敬
推荐课程:
1 内存扣取dex 链接地址
2: 动态调试smali 链接地址
3: 安卓动态调试、过反调试和动态扣取dex文件 链接地址1, 链接地址2
3.1 使用了“ida动态扣取dex脚本” 链接
3:使用fidder怎么样抓包 链接地址1 链接地址2 链接地址3
4: jeb如何使用? 在bili上搜索查看
5: 安卓asc文件和xml文件的讲解。链接
6: 《android so加载深入分析》 链接,建议课程把101,102,103,104,105,106,107,108,109,110等都看下
脱壳方法
腾讯乐固2019 或者 https://blog.quarkslab.com/a-glimpse-into-tencents-legu-packer.html
脱壳方法
1:修改系统源码自动脱壳
2:通过hook方式对关键函数进行脱壳
3:开源工具入zjdroid,dexhunter进行脱壳
4:利用IDA或者GDB动态调试进行脱壳
6:上文作者已经注销,但是有部分文件还是很好的,可以研究下。链接
安卓逆向主要修改逆向哪些文件?
序号 | 文件名 | 理由 | 方法 | |
1 | AndroidManifest.xml | |||
2 | values文件夹 | |||
3 | dex文件 | |||
4 | ||||
安卓逆向步骤?
1: 如果有经验直接跳转到步骤3,无经验进入步骤2;
2:从网上搜索一些资料,读取完后执行步骤;
3:如果有壳,先脱壳。
4
Dalvik里使用的classloader
http://androidxref.com/4.4_r1/xref/libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java
存放目录
虚拟机的下列目录/system/framework/core-libart.jar
解析完smali文件后需要哪些文件才可以重新打包?
保护应用的方法?
1:反调试
1.1 应用反调试
1.2 系统反调试
个人实现哪些代码开发学习目标是什么?
1:代理模式
1.1 静态代理
1.2 动态代理
论坛:
www.LtHack.com
https://crifan.github.io/android_app_security_crack/website/
https://blog.csdn.net/wozaipermanent/article/details/103080252
https://www.kanxue.com/course.htm
安卓逆向基础教程
第一课:环境搭建与工具使用介绍
环境搭建
JAVA JDK
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
工具使用介绍:
BlueStacks
Apk IDE
ApkToolkit
APK上上签
IDA Pro 6.1
靠谱助手 重写模拟器里的imei和清除数据
NEXT
C:\Program Files\Java\jdk1.7.0_45
JAVA_HOME
;C:\Program Files\Java\jdk1.7.0_45\bin
java -version
下载地址:
https://blog.csdn.net/m0_37360803/article/details/107917940
https://bitbucket.org/iBotPeaches/apktool/downloads/
https://down.52pojie.cn/Tools/Android_Tools/
动态调试协议字段会用到的命令
以调试模式启动
adb shell
am start -D -n com.m4399.gamecenter/com.m4399.gamecenter.controllers.splash.SplashActivity
进行端口转发
adb forward tcp:8700 jdwp:2561
frida 在手机端安装
Frida官网:https://www.frida.re/
Frida源码:https://github.com/frida
PC端安装:
https://frida.re/docs/installation/
通过下列命令查看Android手机设备设置
getprop ro.product.cpu.abi
在下列网址下载frida-server的安装包,https://github.com/frida/frida/releases
将frida-server下载下来,解压出来,为了简单,使用push命令将frida-server放到手机,运行frida
adb push frida-server /data/local/tmp/
adb shell "chmod 777 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
或者
adb shell "/data/local/tmp/frida-server"
如果要升级frida使用命令,不升级可跳过。
pip3 install -U frida-tools
pip3 install -U frida
然后在windows主机上另外开启一个cmd,输入命令
frida-ps -U
,这行命令是列出手机上所有的进程信息,如果出现进程信息则说明环境搭配成功,注意手机端与pc端的fridab版本必须一致,否则看不到数据。
# pc端通过该命令查看frida的版本
frida --version
新开一个cmd: 转发android tcp端口到本地
adb forward tcp:27042 tcp:27042
frida调试一个oncreate方法
参考网址:连接
步骤
1:frida -U -f app完整名
2:启动hook脚本
3:在命令行输入命令:%resume
如图:
IDA动态调试
参考文档:
https://www.cnblogs.com/xuan52rock/p/11010304.html
注意:
1:其中第一步实际上是只要安装需要调试的apk就可以了,它给出的命令是错误的。
2:第三步应该优先执行,目标是安装android_server,并通常将android_server改名为am.改名后启动.android_server位于IDA中dbgsrv文件夹;
2.1 pd端执行 adb push android_server /data/local/tmp
2.2 连接模拟器后执行.执行命令“adb shell”连接模拟器
2.2.1 cd /data/local/tmp
2.2.2 mv android_server ad
2.2.3 chmod 777 ad
2.2.4 ./ad 。运行android_server。
3: 第四步应该第二执行,目标是运行android_server。
4:第五步应该第三执行,目标是转换端口。在pc端的cmd里执行.adb forward tcp:23946 tcp:23946
5: 第一步应该第四执行,目标是挂起应用。am start -D -n com.xunlei.downloadprovider/com.xunlei.downloadprovider.launch.LaunchActivity 其中最后一个参数是"包名/要运行的Activity"
6:第二步应该第五执行,目标是端口转换。查找运行的应用的端口号,并执行端口转换:
6.1 ps |grep 'xunlei'
6.2 adb forward tcp:5005 jdwp:{端口}
7:运行 IDA,设置Debugger
8: 设置Debugger完后,IDA 会自动暂停,这时候执行 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005
9:之后回到 IDA,可以先找到自己想要断点的地方设置好断点后,按 F9 继续执行下去,刚才的jdb 命令就会看到结果
改进后的方式:
1:启动android_server
2:另起窗口进行端口转换,adb forward tcp:23946 tcp:23946
3:另起窗口执行
3.1 adb shell
3.2 am start -D -n com.xunlei.downloadprovider/com.xunlei.downloadprovider.launch.LaunchActivity
4:PC端打开IDA调试窗口,连接上线程
5:在3开启的窗口执行
5.1 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port={ddms查看到的端口}
IDA动态调试常见问题
1:IDA报异常.Bogus or irresponsive remote server和recv:Connection closed by peer when connecting to localhost:23946
1.1 问题原因SELinux安全策略限制
1.1.1 adb shell
1.1.2 su
1.1.3 setenforce 0
1.1.4 再重新运行 android_server 重新转发,再试。
2: 如何查找android_server占用的进程,方便进行杀死进程
2.1 方案1,执行命令> ps | grep './ad' 。其中 './ad' 是启动命令
2.2 方案2 执行命令> netstat -nlp|grep :23946 。其中 '23946 ' 是android_server占用的端口
3:报异常:incompatible debugging server: address size is 4 bytes,expect at least 8
3.1 IDA有ida.exe和ida64.exe两个启动用的exe文件,更换下试试。