安卓安全/逆向面试题

安卓逆向反调试

下面列出6种,不定期更新

ptrace检测

ptrace 目标进程后可读写目标进程的内存、寄存器,调试。

原理:
一个进程只能被ptrace一次,自己ptrace自己占坑。
特征:
系统调用,可查看导入表函数是否有 ptrace。
绕过:
静态修改检测函数或者hook。
扩展:
ida/frida应用此类技术。

TracerPid检测

TracerPid是进程的一个属性值

原理:
不为0表示被调试,TracePid 就是调试该进程的进程的的Pid。
特征:
一般需读取 /proc/进程号/status文件。

  1. native层进程号获取api getpid,文件读取api fget, 或者java层相关api 。
  2. 全局搜索字符串 /status

绕过:

  1. 静态修改检测函数或者hook。
  2. 编译安卓源码使让 TracerPid永久为0. 修改方法

android.os.Debug.isDebuggerConnected()

原理:
返回 true表示被调试
特征:
全局搜索字符串 isDebuggerConnected
绕过:
静态修改检测函数或者hook。

端口检测

原理:
根据常见逆向工具的通信端口检测
特征:
一般需读取 /proc/net/tcp 文件。

  1. native层文件读取api fget, 或者java层相关api 。
  2. 全局搜索字符串 /proc/net/tcp
  3. android_server 默认端口 23946
  4. frida-server 默认端口 27042

绕过:

  1. 静态修改检测函数或者hoo。
  2. 修改逆向工具默认端口号。

进程检测

高版本安卓不再适用。
特征:

  1. android_server。
  2. frida-server 安卓进程权限 。

运行时间差

特征:

  1. 获取时间相关函数time、gmtime、localtime、gettimeofday。
  2. cpu执行时间 clock。
    绕过:
  3. 静态修改检测函数或者hook。

汇编指令相关

LR(Link Register R14)
一是用来保存子程序返回地址;
二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2)
ARM状态下是LR-4,而Thumb状态下是LR-2

PC (Program Counter R15) 用于存放下一条指令的地址
通常在子程序返回后,先要将LR中的地址存入PC

SP(数据栈指针 R13)
ARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用Full descending类型堆栈

地址最低位如果是1,表示当前指令是Thumb指令,否则为ARM指令

常见hook框架原理

xposed/Edxposed

  1. java层hook。
  2. xposed 安卓7及以下,Edxposed 7以上。

原理:
安卓所有的APP进程是用 Zygote进程启动的。
Xposed替换了 Zygote 进程对应的可执行文件/system/bin/app_process,
每启动一个新的进程,都会先启动xposed替换过的文件,都会加载xposed相关代码。
这样就注入了每一个app进程

dalvik虚拟机在处理的时候有区别,一种是directMethod,即Java世界里面实现的方法,一种是nativeMethod

Xposed在对java方法进行hook时,先将虚拟机里面这个方法的Method改为nativeMethod(其实就是一个标识字段),然后将该方法的nativeFunc指向自己实现的一个native方法,这样方法在调用时,就会调用到这个native方法,接管了控制权

arthook
虚拟机调用方法之ArtMethod
inline hook啦
dex2oat

frida

  1. window/ios/android 跨平台hook,支持java层,native层。

原理ptrace
frida使用的是动态二进制插桩技术(DBI)。

Dobby:跨平台native层进行hook。

MonkeyDev。

ios hook框架。

windows特有

EasyHook/detourse。

magisk

magisk工具对boot.img打补丁,在ramdisk中植入新的init程序

riru

“native bridge” (ro.dalvik.vm.native.bridge) to inject zygote

常见抓包工具及其原理

安卓安全/逆向面试题_第1张图片

FIddler

原理:
中间人代理

sslping证书错误

  1. 服务端客户端校验证书
  2. 客户端校验服务端证书
  3. 双向校验证书
    fiddler自定义证书

特征:

  1. 提示证书错误或者网络不通
  2. check,verify,Cert,Trust

绕过:

  1. hook或者静态修改
  2. 工具JustTrustMe

tcpdump/wirshark

基于libpcap库

libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap 首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过 滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲 区,并传递给用户层缓冲区。

加固

dex加固

原始dex做加固处理,在运行时还原内存结构。
(动态加载,类抽取,混淆,vmp)

so加固

SO加载流程

so加固原理
安卓安全/逆向面试题_第2张图片

原码、反码和补码

正整数的补码是其二进制表示,与原码相同
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反

ollvm

  1. -mllvm -fla:控制流扁平化
  2. -mllvm -sub:指令替换
  3. -mllvm -bcf:虚假控制流程
  4. -mllvm -sobf: 字符串加密

ida不能f5

  1. 插入花指令
  2. 堆栈不平衡

ida不能f5

常见算法逆向

base64 md5 tea
需要对常见算法特征熟悉

内存布局

内存模块:BSS段、数据段、代码段、堆与栈

参考

安全客
ATPCS即ARM-THUMB procedure call standard
ARM 汇编基础

你可能感兴趣的:(逆向工程,android,安全)