查看: 457|回复: 5

[技术分享] 《安卓逆向这档事》十二、大佬帮我分析一下

[复制链接]
累计签到:206 天
连续签到:1 天

219

主题

1689

回帖

9975

积分

版主

自出洞来无/敌手,得饶人处且饶人。

名望
145
星币
2115
星辰
38
好评
411

夜猫子勋章实习版主勋章版主勋章中秋勋章星座专属勋章星辰勋章灌水天才奖鼎力支持奖热心助人奖优秀会员奖明星会员奖魅力会员奖欢乐天使奖国庆节勋章在线大神动漫大使幸运猪

发表于 2023-7-27 20:10:20 | 显示全部楼层 |阅读模式

注册登录后全站资源免费查看下载

您需要 登录 才可以下载或查看,没有账号?立即注册

×
转载自吾爱破/解精华帖正已手下的文章

一、课程目标
1.了解汇编寄存器知识、so加载流程
2.了解常见so防护手段,以ollvm为例
3.学习动态调试技巧以及常见反调试
二、工具
1.教程Demo(更新)
2.MT管理器/NP管理器
3.IDA PRO
4.Android Studio
5.010 Editor
三、课程内容
1.so加载流程
作用:反调试、脱壳、注入等
流程图:
函数的基本介绍:
函数名
描述

android_dlopen_ext() 、dlopen()、do_dlopen()这三个函数主要用于加载库文件。android_dlopen_ext 是系统的一个函数,用于在运行时动态加载共享库。与标准的 dlopen() 函数相比,android_dlopen_ext 提供了更多的参数选项和扩展功能,例如支持命名空间、符号版本等特性。
find_library()find_library() 函数用于查找库,基本的用途是给定一个库的名字,然后查找并返回这个库的路径。
call_constructors()call_constructors() 是用于调用动态加载库中的构造函数的函数。
init库的构造函数,用于初始化库中的静态变量或执行其他需要在库被加载时完成的任务。如果没有定义init函数,系统将不会执行任何动作。需要注意的是,init函数不应该有任何参数,并且也没有返回值。
init_arrayinit_array是ELF(Executable and Linkable Format,可执行和可链接格式)二进制格式中的一个特殊段(section),这个段包含了一些函数的指针,这些函数将在main()函数执行前被调用,用于初始化静态局部变量和全局变量。
jni_onload这是Android JNI(Java Native Interface)中的一个函数。当一个native库被系统加载时,该函数会被自动调用。JNI_OnLoad可以做一些初始化工作,例如注册你的native方法或者初始化一些数据结构。如果你的native库没有定义这个函数,那么JNI会使用默认的行为。JNI_OnLoad的返回值应该是需要的JNI版本,一般返回JNI_VERSION_1_6。
下断点时机:
应用级别的:java_com_XXX;
外壳级别的:JNI_Onload,.init,.init_array(反调试);
系统级别的:fopen,fget,dvmdexfileopen(脱壳);
安卓在线源码查看
AOSPXRef
2.IDA动态调试1.前置操作:
1.在IDA目录下的dbgsrv,选择跟手机架构一致的server
2.adb push as /data/local/tmp/
3.进入手机命令:adb shell
4.切换获取手机的root权限:su
5.跳到对应路径:cd /data/local/tmp/
6.提权:chmod 777 as
7.XappDebug hook
2.调试步骤
分为两种模式,一种是以debug模式启动,第二种则以普通模式启动,二者的区别在于使用场景,有时候要动态调试的参数在app一启动的时候就产生了,时机较早,所以需要以debug模式去挂起app
复制代码 隐藏代码
adb shell am start -D -n com.zj.wuaipojie/.ui.ChallengeEight (去掉-D 则表示不以debug模式启动app)adb forward tcp:23946 tcp:23946 (端口转发)adb forward tcp:8700 jdwp:PID (pid监听)jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 (jdb挂起)
PS:若不是以debug启动则不需要输入后两条命令
其他的步骤具体看视/频
3.常见寄存器知识
在进行动态调试,以下是一些常用的寄存器介绍:
寄存器名称
功能介绍

R0-R12通用寄存器,用于存储临时数据。在函数调用时,R0-R3用于存储前四个参数,其余的参数通过堆栈传递。返回值也通过R0和R1传递。
R13 (SP)堆栈指针寄存器,指向当前堆栈的顶部。
R14 (LR)链接寄存器,存储子程序的返回地址。
R15 (PC)程序计数器,指向下一条要执行的指令。
CPSR当前程序状态寄存器,保存程序的状态信息,如算术运算的结果标志、中断禁止标志等。
FPSCR浮点状态和控制寄存器,如果你在调试的代码中涉及到浮点运算,那么这个寄存器会比较重要。4.常用快捷键
快捷键
功能

F2在所在行下断点
F5可以将ARM指令转化为可读的C代码,同时可以使用Y键,对JNIEnv指针做一个类型转换,从而对JNI里经常使用的JNIEnv方法能够识别
F7单步进入调试
F8按照顺序一行一行,单步调试
F9直接跳到下一个断点处
Shift + F12快速查看so文件中的字符串信息,分析过程中通过一些关键字符串能够迅速定位到关键函数
Ctrl + s有两个用途,在IDA View页面中可以查看文件so文件的所有段信息,在调试页面可以查看程序中所有so文件映射到内存的基地址。tips:在进行so调试过程中,很有用的一个小技巧就是IDA双开,一个用于进行静态分析;一个用于动态调试。比如说调试过程中要找到一个函数的加载到内存中的位置
Esc回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
g直接跳到某个地址
y更改变量的类型
x对着某个函数、变量按该快捷键,可以查看它的交叉引用
n更改变量的名称
p创建函数5.可能遇到的问题 复制代码 隐藏代码
1.'jdb' 不是内部或外部命令,也不是可运行的程序或批处理文件。 复制代码 隐藏代码
2.java.io.IOException: handshake failed - connection prematurally closed        at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136)        at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)        at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)        at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)        at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)        at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)        at com.sun.tools.example.debug.tty.Env.init(Env.java:63)        at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1066)致命错误:无法附加到目标 VM。解决方法:有可能是手机问题,建议低版本真机,不要用模拟器!切命令顺序不要乱!另外也有可能软件有反调试! 复制代码 隐藏代码
3.动态调试中找不到so文件解决方法:可以尝试手动复制一份对应的so文件放到data/app/包名/lib目录下 复制代码 隐藏代码
4.device offline解决方法:重新插拔usb,再不行就重启机子 复制代码 隐藏代码
5.0.0.0.0:23946: bind: Address already in use解决方案:adb shell "su -c 'lsof | grep 23946'" //获取pidadb shell "su -c 'kill -9 PID'" //这里的pid要根据上一步获取的填写6.常见反调试
1.调试端口检测
检测常见的23946端口,所以在运行时可以加 -p 指定一个另外的端口来过掉这个检测
2.调试进程名检测
固定的进程名 android_server gdb_server等等,所以要改个名字,例如as64
3.ptrace检测
每个进程同时刻只能被1个调试进程ptrace ,主动ptrace本进程可以使得其他调试器无法调试
实现代码:
复制代码 隐藏代码
int ptrace_protect()//ptrace附加自身线程 会导致此进程TracerPid 变为父进程的TracerPid 即zygote{    return ptrace(PTRACE_TRACEME,0,0,0);;//返回-1即为已经被调试}3.SO防护手段
常见防护手段:
主要功能
描述

SO加壳对C/C++源码编译出来的SO文件进行加壳,使SO文件无法正确反编译和反汇编。
SO源码虚拟化保护将原始汇编指令翻译为自定义的虚拟机指令,跳转到自定义的虚拟机中执行,每次保护生成的虚拟机指令随机,且对虚拟机解释器再度混淆
SO防调用对SO文件进行授权绑定,防止SO文件被非授权应用调用运行。
SO Linker对整个SO文件进行加密压缩,包括代码段、符号表和字符串等,运行时再解密解压缩到内存,从而有效的防止SO数据的泄露。
SO源码混淆常量字符串加密、分裂基本块、等价指令替换、虚假控制流、控制流平坦化。
SO环境监测防frida\xposed\root、防动态调试、防模拟器、防多开等1.ollvm简介
LLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度,只不过仅更新到llvm的4.0,2017年开始就没在更新。
项目地址
复制代码 隐藏代码
源代码(c/c++)经过clang--> 中间代码(经过一系列的优化,优化用的是Pass)--> 机器码
感受一下被ollvm支配的恐惧







2.ollvm的分类
分类
描述

指令替换(Instructions Substitution)(Sub)将一条运算指令替换为多条等价的运算指令,例如:y=x+1变为y=x+1+1-1
虚假控制流(Bogus Control Flow)(bcf)通过加入包含不透明谓词的条件跳转和不可达的基本块,来干扰IDA的控制流分析和F5反汇编
控制流平坦化(Control Flow Flattening)(Fla)主要通过一个主分发器来控制程序基本块的执行流程,将所有基本代码放到控制流最底部,然后删除原理基本块之间跳转关系,添加次分发器来控制分发逻辑,然后过新的复杂分发逻辑还原原来程序块之间的逻辑关系
字符串加密编写一个pass将其中的字符串信息使用一些加密算法进行加密,然后特定的时间进行还原1.2.1 指令替换(Sub)
指令替换,将一条运算指令,替换为多条等价的运算指令。例如:y=x+1变为y=x+1+1-1
1.2.2 虚假控制流(bcf)
虚假控制流混淆主要通过加入包含不透明谓词(相邻数字相乘恒为偶数)的条件跳转和不可达的基本块,来干扰IDA的控制流分析和F5反汇编
常见特征:不透明谓词-->例如y > 10 || x * (x + 1) % 2 != 0
1.2.3 控制流平坦化(Fla)
控制流平坦化,主要通过一个主分发器来控制程序基本块的执行流程。该方法将所有基本代码放到控制流最底部,然后删除原理基本块之间跳转关系,添加次分发器来控制分发逻辑,然后过新的复杂分发逻辑还原原来程序块之间的逻辑关系。
常见的特征:一大堆分支函数

1.2.4 字符串加密
字符串加密的原理很简单,编写一个pass将其中的字符串信息使用一些加密算法进行加密,然后特定的时间进行还原。一般含有字符串混淆、函数名混淆、不在init_array解密等
常见的特征:datadiv_decoded
3.ollvm对抗
1.简单ollvm可以通过交叉引用分析
2.angr去除不透明谓词
3.Unicorn/Unidbg/AndroidNativeEmu模拟执行
4.IDA Trace
5.binary ninja
6.后端编译优化
7.frida辅/助分析
4.IDA Trace 实战分析ollvm
1.在要trace的函数前后下断,触发断点
2.配置trace的log输出路径,并选择trace模式
  • Instruction tracing 调试器将为每条指令保存所有修改后的寄存器值。
  • Basic block tracing 调试器将保存到达临时基本块断点的所有地址。
  • Function tracing 调试器将保存发生函数调用或函数返回的所有地址。
    3.run并触发trace
感谢SharkFall大佬帮忙编译的样本
四、课后小作业
待更新
五、答疑
待更新
六、视/频及课件地址
百度云
阿里云
哔哩哔哩
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
七、其他章节
《安卓逆向这档事》一、模拟器环境搭建
《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改
《安卓逆向这档事》三、初识smail,vip终结者
《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡
《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩
《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向
《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api
《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook
《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗
《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?
PS:没十一的原因在视/频里讲了
八、参考文档

评分

参与人数 1好评 +1 收起 理由
无踪的风 + 1 好小子,那就给你给好评

查看全部评分

回复

使用道具 举报

累计签到:342 天
连续签到:108 天

198

主题

497

回帖

1万

积分

督查

PAI-清风

名望
2000
星币
665
星辰
26
好评
490

夜猫子勋章实习版主勋章版主勋章中秋勋章灌水天才奖鼎力支持奖热心助人奖优秀会员奖明星会员奖魅力会员奖欢乐天使奖国庆节勋章在线大神动漫大使幸运猪伯乐奖星座专属勋章星辰勋章我是土豪督察勋章五一勋章

发表于 2023-7-27 21:40:39 | 显示全部楼层
本帖最后由 无踪的风 于 2023-7-27 21:42 编辑
枫原万叶的狗 发表于 2023-7-27 20:11
@春娇 ok帮你搬了亿点吾爱破/解精华精华精华帖子过来

补充内容 (2023-7-27 20:56):

名望可以自己换,好评大家都能点,这就是“缘分”,可遇不可求的
给你加一个好评~继续努力~
至于星辰,你是拉人了么(好奇

点评

哪里换啊,星辰不告诉你  发表于 2023-7-27 21:49
回复 支持 1 反对 0

使用道具 举报

累计签到:206 天
连续签到:1 天

219

主题

1689

回帖

9975

积分

版主

自出洞来无/敌手,得饶人处且饶人。

名望
145
星币
2115
星辰
38
好评
411

夜猫子勋章实习版主勋章版主勋章中秋勋章星座专属勋章星辰勋章灌水天才奖鼎力支持奖热心助人奖优秀会员奖明星会员奖魅力会员奖欢乐天使奖国庆节勋章在线大神动漫大使幸运猪

 楼主| 发表于 2023-7-27 20:11:02 | 显示全部楼层
@春娇 ok帮你搬了亿点吾爱破/解精华精华精华帖子过来

补充内容 (2023-7-27 20:56):
阔以给点名望和好评吗,求求啦
回复 支持 反对

使用道具 举报

累计签到:206 天
连续签到:1 天

219

主题

1689

回帖

9975

积分

版主

自出洞来无/敌手,得饶人处且饶人。

名望
145
星币
2115
星辰
38
好评
411

夜猫子勋章实习版主勋章版主勋章中秋勋章星座专属勋章星辰勋章灌水天才奖鼎力支持奖热心助人奖优秀会员奖明星会员奖魅力会员奖欢乐天使奖国庆节勋章在线大神动漫大使幸运猪

 楼主| 发表于 2023-7-27 21:54:14 来自手机 | 显示全部楼层
无踪的风 发表于 2023-7-27 21:40
名望可以自己换,好评大家都能点,这就是“缘分”,可遇不可求的
给你加一个好评~继续努力~
至于星辰,你 ...

星辰的话我是发了个mt管理器去广告帖子
默认签名:偏爱是我家,发展靠大家! 社区反馈邮箱Mail To:service@pai.al或paijishu@outlook.com
回复 支持 反对

使用道具 举报

累计签到:237 天
连续签到:2 天

0

主题

1495

回帖

4147

积分

练星

名望
0
星币
2595
星辰
0
好评
12

星座专属勋章在线大神灌水天才奖欢乐天使奖幸运猪鼎力支持奖五一勋章

发表于 2023-7-28 09:51:40 | 显示全部楼层
6
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网--教开服-游戏源码

偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网-游戏源码

Powered by Discuz! X3.5

GMT+8, 2024-5-7 12:03 , Processed in 0.100779 second(s), 50 queries .

快速回复 返回顶部 返回列表