安卓逆向之 前言

安卓逆向用到哪些工具,他们的作用是什么?

序号软件名称功能描述增加时间修改备注
1AndroidKiller(推荐)

安卓APK反汇编工具

注意:

正常情况可以完成反编译,特殊(加固等)情况无法实现,需要其他知识

2021-07-12

下载地址

功能说明

升级apktool

2

IDA(推荐)

动态调试,分析使用的开发工具

官网地址

上传到模拟器后:

1:重命名为

 mv android_server ad

2:赋权:

chmod 777 ad

3:启动:

 ./ad

3android_server(推荐)位于{IDA_dir}/dbgsrv目录
4JEB安卓应用程序反编译工具,用于逆向工程或者审计apk文件Jeb3beta版安装即可使用
链接:https://pan.baidu.com/s/1A39COOOvfh_OM3WNQ-M8eA
提取码:m4cx
5获取apk签名值
601editor  分析apk的xml文件                                        
7jadx(推荐)静态分析工具

可以直接把dex拖到应用里

github源码位置

图形化界面运行bin/jadx-gui.bat

8xposed可以自己写java代码进行实现逻辑可以做java层代码代理,但是不可以做到nav层代码代理
9CydiaSubStrate需要使用真机
10adbi框架adbi 是一个android平台(arm 32 )的so注入+挂钩框架2021-07-12

源码位置 链接

预读说明 链接

11ELFARMHOOK2021-07-12

对so进行hook

手游使用

12Zygote2021-07-12
13GEA将odex转成dex的工具2021-07-12
14winHex查看odex是否完整2021-07-12
15安卓逆向助手(推荐)逆向安卓时用到的多种工具的集成2021-07-12下载地址
16ddms(推荐)sdk目录下\tools\monitor.bat2021-07-12

运行方式?

安装位置:

C:\Users\{用户名}\AppData\Local\Android\Sdk\tools

执行:monitor.bat

17dev C++2021-07-12
18beycompare文档对比工具2021-07-12
19ideasmali2021-07-12说明文档
20dexDump2021-07-12解析dex时使用的工具
21aapt2021-07-14解析安卓arsc文件        
22mmap
23dexhunter2021-07-14第三代,开源项目,得到的是dex文件
24ida自动插件脱壳得到的是odex文件,需要使用工具进行转化获得dex,比dexhunter更先进些        
25zjDroid第二代\第三代脱壳神器
26inotifywait辅助工具1,监听文件的打开和关闭
27memcmpdump辅助工具2
28android_server

作用是什么?

使用时要注意什么?

29360动态脱壳机                                                                                
30apk查壳工具链接
31其他加壳厂商可先看视频再继续研究
32dex2jar

github上的源码

gitee上的源码

33

开源项目

FRIDA-DEXDump

 https://github.com/hluwa/FRIDA-DEXDump(1)

34apk上上签安卓项目加签工具链接地址
35frida(推荐)

示例1

示例2

示例3

frida工具包hook

提取dex,参读文章

jsAPI

36QBDI(推荐)是一个模块化的跨平台以及跨架构的 DBI 框架。该工具目前支持 Linux、macOS、Android、iOS 和 Windows 操作系统
37xml2axml(推荐)

pc端将AndroidManifest.xml反编译和回编译

参考文档

源码位置

38MT管理器(推荐,移动端使用)

我已经是会员了。

使用说明,关注:

1:文件管理里的文本对比

2:逆向功能

3:安装包提取功能

39开发者助手(推荐,移动端使用)
40反射大师(推荐,移动端使用)
42AndBug动态逆向分析工具(https://github.com/anbc/AndBug/看雪文章:Android动态逆向分析工具 : Andbug之基本操作 Andbug扩展功能 
43jswat 

java写的GUI,

https://code.google.com/p/jswat/

jswat无源码动态调试工具
44androguard 

动态分析工具

github托管:https://github.com/androguard/androguard/ 

看雪文章 关于androguard那点事 Androguard软件安装方法
45Dev-c++c++学习会用到

文件转换过程及工具

序号文件转换转换流程使用工具备注
1odex -> dex直接转
2dex -> javadex ->smali ->jar -> java
3dex -> smali直接转

用 baksmali工具

Baksmali源码位置

使用安卓逆向助手吧,使用jar包我没有执行成功
4dex -> jardex ->smali ->jar
5dex->oatobjdump

待定

winHex打开dex进行阅读

6oat->dex直接转

extractDexFromOat

插件:oatract1.0分析oat文件

7
8
9

adb常用命令


序号       命令行功能介绍
1adb devices查看已经连接的设备列表
2adb -s 指定设备  shell去连接某个设备并进入手机管理
3adb shell如果只有一个设备的情况下,进入手机管理
4adb install {安装包文件}将某个apk安装到手机上
5adb push {电脑端文件路径} {手机端文件路径}将电脑端的文件推到手机端
6adb pull {手机端文件路径} {电脑端文件路径} 将的手机端文件拉取到电脑端
7chmod 777 {指定要给权限的文件或者文件夹}指定文件或者文件夹的权限
8cd  进入目录进入某个目录
9cat 查看文件内容
10id 获取当前用户信息
11ps查看当前系统所有进程
12kill -9  {pid}杀死进程杀死某个进程
13ls 列出当前文件夹下的文件列出当前文件夹下的文件
14mkdir 创建文件夹

创建文件夹,

例如  mkdir  adir  在当前文件夹下创建一个名字为adir的文件夹

15touch  文件名        创建一个文件
16

rm  文件名

rm  -r  文件夹名称

删除文件,删除文件夹要使用-r参数,级联删除
17cp   源文件  目标文件位置复制
18mv   源文件  目标位置移动文件、重命名文件

 正向开发需要需要了解的知识:


   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动态调试进行脱壳

5:Android中的Apk的加固 加壳 原理解析和实现

6:上文作者已经注销,但是有部分文件还是很好的,可以研究下。链接

安卓逆向主要修改逆向哪些文件?


序号文件名理由       方法
1AndroidManifest.xml

视频说明1

视频2

2values文件夹                              
3dex文件
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文件,更换下试试。

Frida技术网站


1: https://www.zygx8.com/forum-157-1.html

2:https://github.com/r0ysue/AndroidSecurityStudy

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值