├── images ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png └── 6.png ├── arm-images ├── 1.jpg ├── 2.png ├── 3.png ├── 4.png ├── 5.png └── 6.png ├── images_black ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 17.png ├── 18.png ├── 18png ├── 19.png ├── 2.png ├── 20.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png └── 9.png ├── Computer-System ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png └── 6.png ├── README.md ├── Computer-System.md ├── AndroRever1.md ├── ARM.md └── Black.md /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/3.png -------------------------------------------------------------------------------- /images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/4.png -------------------------------------------------------------------------------- /images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/5.png -------------------------------------------------------------------------------- /images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images/6.png -------------------------------------------------------------------------------- /arm-images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/1.jpg -------------------------------------------------------------------------------- /arm-images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/2.png -------------------------------------------------------------------------------- /arm-images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/3.png -------------------------------------------------------------------------------- /arm-images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/4.png -------------------------------------------------------------------------------- /arm-images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/5.png -------------------------------------------------------------------------------- /arm-images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/arm-images/6.png -------------------------------------------------------------------------------- /images_black/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/1.png -------------------------------------------------------------------------------- /images_black/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/10.png -------------------------------------------------------------------------------- /images_black/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/11.png -------------------------------------------------------------------------------- /images_black/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/12.png -------------------------------------------------------------------------------- /images_black/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/13.png -------------------------------------------------------------------------------- /images_black/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/14.png -------------------------------------------------------------------------------- /images_black/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/15.png -------------------------------------------------------------------------------- /images_black/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/16.png -------------------------------------------------------------------------------- /images_black/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/17.png -------------------------------------------------------------------------------- /images_black/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/18.png -------------------------------------------------------------------------------- /images_black/18png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/18png -------------------------------------------------------------------------------- /images_black/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/19.png -------------------------------------------------------------------------------- /images_black/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/2.png -------------------------------------------------------------------------------- /images_black/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/20.png -------------------------------------------------------------------------------- /images_black/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/3.png -------------------------------------------------------------------------------- /images_black/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/4.png -------------------------------------------------------------------------------- /images_black/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/5.png -------------------------------------------------------------------------------- /images_black/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/6.png -------------------------------------------------------------------------------- /images_black/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/7.png -------------------------------------------------------------------------------- /images_black/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/8.png -------------------------------------------------------------------------------- /images_black/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/images_black/9.png -------------------------------------------------------------------------------- /Computer-System/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/1.png -------------------------------------------------------------------------------- /Computer-System/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/2.png -------------------------------------------------------------------------------- /Computer-System/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/3.png -------------------------------------------------------------------------------- /Computer-System/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/4.png -------------------------------------------------------------------------------- /Computer-System/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/5.png -------------------------------------------------------------------------------- /Computer-System/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindXaa/Android-Reverse-interview/HEAD/Computer-System/6.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android 安全面试宝典 2 | > 主要针对移动安全中Android逆向工程师、漏洞挖掘工程师、渗透工程师的面试指南 3 | 4 |
42 |
--------------------------------------------------------------------------------
/Computer-System.md:
--------------------------------------------------------------------------------
1 | # 计算机操作系统面试——移动安全(Android方向)
2 |
3 | ## 一、前言
4 |
5 | 移动安全(Android)方向在计算机操作系统中主要考察第二章《进程与线程》,所以大家将主要精力放在第二章即可,本文只针对在移动安全面试中可能出现的高频考点。详细的知识点解释,进入星球,有计网+操作系统+数据结构+密码学的详细的pdf
6 |
7 | ## 二、考点集合
8 |
9 | ### 1.进程与线程
10 |
11 | #### (1)进程与线程的区别?
12 |
13 | - 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分派的基本单位;
14 | - 线程依赖于进程而存在,一个进程至少有一个线程;
15 | - 进程有自己的独立地址空间,线程共享所属进程的地址空间;
16 | - 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),和其他线程共享本进程的相关资源如内存、I/O、cpu等;
17 | - 在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少量的寄存器的内容,并不涉及存储器管理方面的操作,可见,进程切换的开销远大于线程切换的开销;
18 | - 线程之间的通信更方便,同一进程下的线程共享全局变量等数据,而进程之间的通信需要以进程间通信(IPC)的方式进行;
19 |
20 | #### (2)进程间的通信方式有哪些?
21 |
22 | - 管道(Pipe)
23 | - 命名管道
24 | - 消息队列
25 | - 信号(Signal)
26 | - 共享内存
27 | - 信号量(Semaphore):初始化操作、P操作、V操作;P操作:信号量-1,检测是否小于0,小于则进程进入阻塞状态;V操作:信号量+1,若小于等于0,则从队列中唤醒一个等待的进程进入就绪态
28 | - 套接字(Socket)
29 |
30 | #### (3)进程有几种状态?
31 |
32 | 
33 |
34 | 创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
35 |
36 | 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
37 |
38 | 执行状态:进程处于就绪状态被调度后,进程进入执行状态
39 |
40 | 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
41 |
42 | 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
43 |
44 | #### (4)Android中的进程通信方式?
45 |
46 | Android中的通信方式一般包括文件、AIDL、Binder、Messenger、ContentProvider、Socket
47 |
48 | 
49 |
50 | 其中AIDL、Messenger、ContentProvider都是基于Binder,所以我们着重了解Binder和Socket的通信方式
51 |
52 | #### (5)Android中的Binder原理?
53 |
54 | Binder是一种进程间通信机制,在Android中我们所使用的Activity,Service等组件都需要和AMS(system_server) 通信,这种跨进程的通信都是通过Binder完成。
55 |
56 | 这里应用刘舒望大佬的一章图
57 |
58 | 
59 |
60 | Binder在不同层面表现的含义不同:
61 |
62 | ```
63 | 机制:Binder是一种进程间通信机制。
64 | 应用层:Binder是一个能发起通信的Java类。
65 | 底层:Binder是一个虚拟物理设备驱动。
66 | ```
67 |
68 | Binder与传统的IPC机制对比:
69 |
70 | | **Binder** | **共享内存** | **Socket** | |
71 | | ---------- | ------------------------------------ | ---------------------------------------- | ---------------------------------------------------- |
72 | | 性能 | 需要拷贝一次 | 无需拷贝 | 需要拷贝两次 |
73 | | 特点 | 基于C/S架构,易用性高 | 控制复杂,易用性差 | 基于C/S 架构 作为一款通用接口,其传输 效率低,开销大 |
74 | | 安全性 | 为每个APP分配UID,同时支持实名和匿名 | 依赖上层协议,访问接入点是开放的,不安全 | 依赖上层协议,访问接入点是开放的,不安全 |
75 |
76 | Binder如何跨进程,实现依次Copy:
77 |
78 | 在Binder中,内核空间和进程2中分别另外开辟了一块虚拟内存,这两块虚拟内存指向物理内存中的同一块内存空间。然后传递数据的时候,将数据从进程1的物理内存1中复制到内核空间和进程2共同指向的物理内存块中,这样进程2就获得了数据,这样就实现了一次copy
79 |
80 | #### (6)Android中的Socket通信?
81 |
82 | 
83 |
84 | Socket 是对传输层TCP/UDP协议簇的封装,封装为几个简单的接口,供应用层调用实现进程在网络中的通信
85 |
86 | Socket的通信过程:
87 |
88 | 
89 |
90 | 实现步骤:
91 |
92 | ```
93 | Step 1:创建ServerSocket和Socket
94 |
95 | Step 2:打开连接到的Socket的输入/输出流
96 |
97 | Step 3:按照协议对Socket进行读/写操作
98 |
99 | Step 4:关闭输入输出流,以及Socket
100 | ```
101 |
102 | 这里我们着重关注APP通信时,Socket在抓包防护中的安全问题,我们知道很多APP可以通过Socket进行通信,我们只需要定位相应API进行hook,就可以成功抓包
103 |
104 | ```
105 | Java层Tcp: hook点 socketRead0、socketWrite0
106 | Java层Udp: hook点 sendtoBytes、readBytes
107 | Java层SSL:hook点 NativeCrypto.SSL_write、NativeCrypto.SSL_read
108 | ConscryptFileDescriptorSocket$SSLOutputStream.write、ConscryptFileDescriptorSocket$SSLOutputStream.read
109 | Jni层Tcp: hook点 recvfrom、sendto
110 | Jni层Udp: hook点 recvfrom、sendto
111 | Jni层ssl:hook点 read、write
112 | ```
113 |
114 | 更新待续(目前总结国内10所大厂的面试考点涉及相关,有后续继续更新)
115 |
116 | ## 三、推广
117 |
118 | 后续会整理最新的各个大厂的面试题库,并进行更新,面试宝典中详细的文档资料存放在知识星球,欢迎加入知识星球:《安全后厨》,与各个大佬一起学习移动安全
119 |
120 | 
121 |
--------------------------------------------------------------------------------
/AndroRever1.md:
--------------------------------------------------------------------------------
1 | # Android逆向篇——加载流程面试点(随风而行aa)
2 |
3 | 本文主要讲解Android逆向中的Android APK编译流程、编译原理、Android 系统加载流程、Android APP启动流程、Android APP类加载机制。
4 |
5 | ## 一、Android APK编译流程
6 |
7 | 我们用一张图来描述apk的构建流程:
8 |
9 |
10 |
11 | 上述的步骤为:
12 |
13 | **(1)aapt打包资源文件**
14 |
15 | 资源文件(res文件夹下的文件)通过aapt打包生成R.java(资源索引文件)、arsc资源文件和res文件
16 |
17 | **(2)处理aidl files**
18 |
19 | AIDL是Android接口定义语言,是Android提供的IPC的一种独特实现,这里生成对应的Java接口文件
20 |
21 | **(3)编译**
22 |
23 | 使用javac将R.java文件、工程源码文件、aidl.java文件编译成.class文件
24 |
25 | **(4)生成dex文件**
26 |
27 | 源码.class文件和第三方jar或者library通过dx工具打包成dex文件
28 |
29 | **(5)apkbuilder(生成未签名apk)**
30 |
31 | 将classes.dex、resources.arsc、res文件夹(res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理)、Other Resources(assets文件夹)、AndroidManifest.xml打包成apk文件
32 |
33 | **(6)对apk文件进行签名**
34 |
35 | apksigner工具会对未签名的apk验证签名。得到一个签名后的apk(signed.apk)
36 |
37 | **(7)zipalign(对齐)**
38 |
39 | release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理,以便2可以通过内存映射来访问
40 |
41 | 上面过程则完成了Android中的apk的编译流程,但是步骤(4)中将so库进行打包,这里so库一般存放在lib文件夹下,Android一般通过ndk将c/c++代码编译为so文件,这里我们可以详细了解一下编译原理。
42 |
43 | 详细参考博客:[Android APK编译流程](https://cloud.tencent.com/developer/article/1920027)
44 |
45 | ## 二、编译原理
46 |
47 | 
48 |
49 | 我们可以借助gcc来实现上面的过程:
50 |
51 | **(1)预处理阶段**
52 |
53 | 预处理器(cpp)根据以字符``#开头的命令修给原始的C程序,结果得到另一个C程序,通常以.i作为文件扩展名。主要是进行文本替换、宏展开、删除注释这类简单工作。
54 |
55 | ```
56 | 命令行:gcc -E hello.c hello.i
57 | ```
58 |
59 | 考点经常问include在哪个阶段处理,就是该阶段
60 |
61 | **(2)编译阶段**
62 |
63 | 将文本文件hello.i翻译成hello.s,包含相应的汇编语言程序
64 |
65 | **(3)汇编阶段**
66 |
67 | 将.S文件翻译成机器指令,然后把这些指令打包成一种可重定位目标程序的格式,并把结果保存在目标文件.o中(汇编——>机器)
68 |
69 | ```
70 | gcc -c hello.c hello.o
71 | ```
72 |
73 | **(4)链接阶段**
74 |
75 | hello程序调用了printf函数,链接器(``Id``)就把printf.o文件并入hello.o文件中,得到hello可执行文件,然后加载到存储器中由系统执行。
76 |
77 | ```
78 | 函数库包括静态库和动态库
79 | 静态库:编译链接时,把库文件代码全部加入可执行文件中,运行时不需要库文件,后缀为.a。
80 | 动态库:编译链接时,不加入,在程序执行时,由运行时链接文件加载库,这样节省开销,后缀为.so。(gcc编译时默认使用动态库)
81 | 再经过汇编器和连接器的作用后输出一个目标文件,这个目标文件为可执行文件
82 | ```
83 |
84 | 详细参考博客:[Android Hook技术学习——常见的Hook技术方案总结](https://bbs.pediy.com/thread-272870.htm)
85 |
86 | ## 三、Android系统启动流程
87 |
88 |
89 |
90 | 具体步骤如下
91 |
92 | ```
93 | (1)引导层: 手机开机后,引导芯片启动,引导芯片开始从固化在ROM里的预设代码执行,加载引导程序到到RAM,BootLoader检查RAM,初始化硬件参数等功能;
94 | (2)内核层: Kernel层主要加载一些硬件设备驱动,初始化进程管理等操作。在Kernel中首先启动swapper进程(pid=0),用于初始化进程管理、内管管理、加载Driver等操作,再启动kthread进程(pid=2),这些linux系统的内核进程,kthread是所有内核进程的鼻祖;
95 | (3)Native层:启动初始化进程管理等操作会启动init进程 ,这些在Native层中,init进程是所有进程的鼻祖,解析执行init.rc,到app_process进程,然后app_process孵化zygote进程
96 | (4)java框架层:zygote进程会加载虚拟机,启动System_Server进程
97 | ```
98 |
99 | 总结:
100 |
101 | ```
102 | 加载BootLoader --> 初始化内核 --> 启动init进程 --> init进程fork出Zygote进程 --> Zygote进程fork出SystemServer进程
103 | ```
104 |
105 | 详细参考:[Xposed定制](https://bbs.pediy.com/thread-269627.htm)
106 |
107 | ## 四、Android APP启动流程
108 |
109 |
110 |
111 | SystemServer启动了一个更加重要的服务`ActivityManagerService`,AMS其中很重要的一个作用就是启动`Launcher`进程
112 |
113 | ```
114 | (1)点击桌面APP图标时,Launcher的startActivity()方法,通过Binder通信,调用system_server进程中AMS服务的startActivity方法,发起启动请求
115 | (2)system_server进程接收到请求后,向Zygote进程发送创建进程的请求
116 | (3)Zygote进程fork出App进程,并执行ActivityThread的main方法,创建ActivityThread线程
117 | (4)创建ActivityThread线程--->handlerbindapplication进程
118 | 初始化————>Application的构造函数————>Application.attachBaseContext()————>Application.onCreate()函数
119 | 最后才会进入MainActivity中的attachBaseContext函数、onCreate函数
120 | ```
121 |
122 | 详细参考:[Android漏洞之战(12)——整体壳脱壳详解](https://bbs.pediy.com/thread-273293.htm)
123 |
124 | ## 五、Android APP类加载流程
125 |
126 | Android Java层的类加载流程:
127 |
128 |
129 |
130 | Android Native层:
131 |
132 | ```
133 | DefineClass--->
134 | LoadClass->LoadClassMembers->LoadMethod-->LinkCode--->Execute
135 | ```
136 |
137 | 详细参考:[Android漏洞之战(12)——整体壳脱壳详解](https://bbs.pediy.com/thread-273293.htm)
138 |
139 | 考点:LoadClass加载和forName加载的区别
140 |
141 | ```
142 | (1)使用LoadClass()加载 不会初始化静态块
143 | (2)使用forName()加载 会初始化静态块
144 | ```
145 |
146 | ## 总结
147 |
148 | 欢迎大家关注微信公众号和加入知识星球,相关的文档资料保存在知识星球,也欢迎大家与各位移动安全爱好者一起学习。
149 |
150 |
151 |
--------------------------------------------------------------------------------
/ARM.md:
--------------------------------------------------------------------------------
1 | # ARM汇编语言
2 |
3 |
4 |
5 | * 寄存器:ARM32和ARM64
6 | * [ARM32寄存器](#ARM32寄存器)
7 | * [ARM64寄存器](#ARM64寄存器的特点)
8 |
9 | * 汇编指令:ARM32和ARM64
10 | * [ARM32汇编](#ARM32汇编指令)
11 | * [ARM64汇编](#ARM64汇编指令)
12 |
13 | * ARM软中断
14 | * [Arm32软中断](#Arm32软中断)
15 | * [Arm64软中断](#Arm64软中断)
16 |
17 | * ARM三级流水线
18 |
19 | * [参考](#参考)
20 |
21 |
22 | ------
23 |
24 | ### ARM32寄存器
25 |
26 | 
27 |
28 |
29 |
30 | ##### ARM32寄存器的特点?
31 |
32 | 
33 |
34 | 32位arm的R0 - R7为低端寄存器(Thumb16模式下,只能使用R0-R7,R13,R14,R15这几个寄存器),这在所有ARM的工作模式下是共享的
35 |
36 |
37 | 参数寄存器:(R0-R3)
38 |
39 | ```
40 | R0寄存器: 通常用于函数传参(参数1)或者普通寄存器或者函数返回值。
41 | R1寄存器: 通常用于函数传参(参数2)或者普通寄存器。
42 | R2寄存器: 通常用于函数传参(参数3)或者普通寄存器。
43 | R3寄存器: 通常用于函数传参(参数4)或者普通寄存器。
44 | ```
45 |
46 | 特殊寄存器:
47 |
48 | ```
49 | R7寄存器: 系统调用时,存放系统调用号,有时也用于作为FP使用。FP又叫frame pointer即栈基指针,主要在函数中保存当前函数的栈起始位置,用于堆栈回溯;
50 | R13寄存器:R13又名SP,即栈指针寄存器,主要用于指向当前程序栈顶,配合指令pop/push等。栈主要用于存放局部变量,保存函数间调用的关键寄存器;
51 | R14寄存器:R14又名LR,即链接寄存器,主要用于存放函数的返回地址,即当前函数返回时,知道自己该回到哪儿去继续运行,通常这个是和BL/BLX/CALL指令搭配;
52 | R15寄存器:R15又名PC,即程序寄存器,主要用于存放CPU取指的地址,记住是取指地址,不是当前运行地址;
53 | ```
54 |
55 | ##### Arm32函数调用约定原理以及怎么判断参数个数?
56 | 函数调用约定:
57 |
58 |
59 | ```
60 | arm32位调用约定采用ATPCS,参数1~参数4 分别保存到 R0~R3 寄存器中 ,剩下的参数从右往左一次入栈,被调用者实现栈平衡,返回值存放在 R0 中。第5个参数需要通过sp + 4 访问,第n个参数需要通过sp + 4*(n-4)访问
61 | ```
62 |
63 | 函数的传参和返回:
64 |
65 | ```
66 | arm32函数调用参数传递顺序是从r0~r3,第一个参数在r0中,第二个参数在r1中,依次类推。参数超过4个,则要先入栈,从第五个参数开始从栈中取。 程序返回值如果是32位 则用R0进行返回,为64位时则R0返回低位, R1返回高位
67 | ```
68 |
69 | 函数的参数个数判断:
70 |
71 | ```
72 | 例如 Arm32 我们需要看blx后面的值,是不是寄存器,若是,判断小不小于4,若小于,则参数个数即是
73 | BLX Rn n<4 则参数个数为0-n
74 | 若n>4 比如 BLX R12 首先我们可以确定一定有4个参数 R0-R3 然后我们需要观察上面STR指令并结合伪代码函数参数个数,来确定,一般多余的参数会使用STR来存入堆栈
75 | ```
76 |
77 | ##### Arm32和Thumb的区别?
78 |
79 | 32位下有两种模式arm模式和Thumb模式
80 |
81 | ```
82 | A32模式(ARM instruction sets),指令固定的编码长度为32bit;
83 | T32模式(Thumb instruction sets),指令可以编码成16bit长,也可编码成32bit长;
84 | ```
85 |
86 | Arm32与Thumb的切换:
87 |
88 | ```
89 | ARM32指令集与Thumb指令集切换方法,是在BX和BLX指令跳转时,判断目标地址最低位是否为1
90 | 如果为1,跳转时将CPSR寄存器标志T置位,并将目标地址处的代码解释位Thumb代码,处理器切换到Thumb状态;
91 | 如果为0,跳转时将CPSR寄存器标志T复位,并将目标地址处的代码解释位ARM32代码,处理器切换到ARM32状态。
92 | ```
93 |
94 | Arm32与Thumb的区别:
95 |
96 | ```java
97 | (1)条件执行:ARM状态下的所有指令都支持条件执行。某些ARM处理器版本允许使用IT指令在Thumb中进行条件执行。条件执行提高了代码密度,因为它减少了要执行的指令数量,并节省了昂贵的分支指令。
98 | (2)32位ARM和Thumb指令:32位Thumb指令具有.w后缀。
99 | (3)桶形移位器是另一种ARM模式特有的功能。它可以将多个指令合并成一个。例如,您可以通过使用如下指令(将移位包含在MOV指令内)左移1位“Mov R1,R0,LSL#1; R1 = R0 * 2”从而代替两个乘法指令(只用乘法指令将寄存器的值乘以2,并使用MOV将结果存储到另一个寄存器中)。
100 | 要切换处理器的执行状态,必须满足以下两个条件之一:
101 | (4)我们可以使用分支指令BX(分支和状态切换)或BLX(分支,返回和状态切换),并将目标寄存器的最低有效位置1。这可以通过将1添加到偏移量(如0x5530+1)来实现。你可能会认为这会导致对齐问题,因为指令总是2或4字节对齐的。然而,这么做不会导致问题,因为处理器在读取指令时是忽略最低有效位的。更多的细节将在第6篇:条件分支中介绍。
102 | (5)如果当前程序状态寄存器中的T位置1,我们知道我们处于Thumb模式
103 | ```
104 |
105 | ### ARM64寄存器
106 |
107 | 
108 |
109 | ##### ARM64寄存器的特点?
110 |
111 | | 寄存器名称 | 用途 |
112 | | ---------- | ------------------------------------------------------------ |
113 | | x0~x7 | 用于传递子程序的参数,使用时不需要保存,多余参数保存在调用者栈中,通过栈传递给被调用函数。其中x0寄存器还可以作为返回值寄存器使用。 |
114 | | x8 | 间接结果寄存器,使用时不需要保存,一般用于传递间接结果的地址,比如函数返回一个大的结构体,x8保存结构体地址。 |
115 | | x9~x15 | 临时寄存器,子程序使用时不需要保存。 |
116 | | x16~x17 | 又名IP0、IP1,内部过程调用寄存器,常用于动态链接中的plt寻址等指令。 |
117 | | x18 | 平台预留寄存器,在不同的操作系统使用不一样。 |
118 | | x19~x28 | 临时寄存器,子程序使用时必须保存。 |
119 | | x29 | 帧指针寄存器(FP),用于连接栈帧,使用时必须保存。 |
120 | | x30 | 链接寄存器(LR),用于保存子程序的返回地址。 |
121 |
122 | **在ARM64下,PC的值只能间接读取或改变——**
123 |
124 | ```
125 | (1)64位可读取PC值的情况有:计算相对地址,如adr,adrp,文字池加载以及直接分支;子程序返回地址,比如bl,blr
126 | (2)可修改pc的方式为:使用控制流指令,如条件跳转、无条件跳转、异常生成和异常返回指令
127 | ```
128 |
129 | ##### Arm64函数调用约定原理以及怎么判断参数个数?
130 |
131 | 函数调用约定:
132 |
133 | ```
134 | arm64位调用约定采用AAPCS64。参数1~参数8 分别保存到 X0~X7 寄存器中 ,剩下的参数从右往左一次入栈,被调用者实现栈平衡,返回值存放在 X0 中。(第8个参数需要通过sp访问,第9个参数需要通过sp + 8 访问,第n个参数需要通过sp + 8*(n-8)访问)。
135 | ```
136 |
137 | 函数的传参和返回:
138 |
139 | ```
140 | arm64函数调用参数传递顺序是X0~X7:用于函数入参,最多支持8个函数入参,多余采用入栈方式,X0:用于返回函数结果。
141 | ```
142 |
143 | 函数的参数个数判断:
144 |
145 | 同上
146 |
147 | ### ARM32汇编指令
148 |
149 | 寻址指令:
150 |
151 | ```
152 | 立即寻址:MOV R0,#123 R0=123
153 | 寄存器寻址:MOV R0,R1 R0=R1
154 | 寄存器移位寻址:MOV R0,R1,LSL #2 R0=R1*4
155 | 寄存器间接寻址:LDR R0,[R1] 将R1寄存器中的值作为地址,取出地址中的值赋予R0
156 | 寄存器间接基址偏移寻址:LDR R0,[R1,#-4]将R1寄存器的值-0x4的值作为地址,取出地址中的值给R0
157 | ```
158 |
159 | 比较指令:
160 |
161 | ```
162 | CMP:比较
163 | CMP R0 #0 R0寄存器中的值与0比较
164 | 标志位:如z位,这个都可以在动态调试时,寄存器窗口看到
165 | ```
166 |
167 | 逻辑运算指令:
168 |
169 | ```
170 | 与:AND
171 | 或:ORR
172 | 异或:EOR
173 | 移位:实质是乘,除,类似于小数点移位,但相反。小数点左移,数变小;右移变大。
174 | 但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制。
175 | LSL:逻辑左移←
176 | LSR:逻辑右移←
177 | ```
178 |
179 | 算数运算指令:
180 |
181 | ```
182 | ADD,SUB,MUL,DIV 有符号,无符号运算;带进位运算
183 | ```
184 |
185 | 寄存器交互指令:
186 |
187 | ```
188 | LDR与STR
189 | LDR:从存储器中加载数据到寄存器 ← Load
190 | LDR R8,[R9,#4] R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元 R8=[R9+4]
191 |
192 | STR:将寄存器的数据存储到存储器 → Store
193 | STR R8,[R9,#4] 将R8寄存器的数据存储到R9+0x4指向的存储单元
194 |
195 | LDM与STM
196 | LDM:将存储器的数据加载到一个寄存器列表 →
197 | LDM R0,{R1-R3}将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器
198 |
199 | STM:将一个寄存器列表的数据存储到指定的存储器 ←
200 |
201 | PUSH与POP
202 | PUSH:将寄存器值推入堆栈
203 | POP:将堆栈值推出到寄存器
204 |
205 | SWP:将寄存器与存储器之间的数据进行交换
206 | SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换
207 | ```
208 |
209 | 跳转指令:
210 |
211 | ```
212 | B 无条件跳转
213 | BL 带链接的无条件跳转
214 | BX 带状态切换的无条件跳转
215 | BLX 带链接和状态切换的无条件跳转
216 | B loc_地址
217 | BEQ,BNE
218 | 带L是带连接跳转,带X是带状态的跳转 BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态
219 | ```
220 |
221 | ### ARM64汇编指令
222 |
223 | 
224 |
225 | 相比于ARM32,ARM32中的LDM、STM、PUSH、POP指令,在ARM64中并不存在。取而代之的是LDP、STP指令。
226 |
227 | ARM64栈处理指令:
228 |
229 | 由于在ARM64下,对于栈的操作都是要16个字节对齐的,所以都是双寄存器读写操作
230 |
231 | ```
232 | STP:写入指令,将数据从两个寄存器中读出来, 写入到栈中
233 | LDP:读取指令,将数据从栈中读取出来, 存到两个寄存器中
234 | ```
235 |
236 | ##### Arm指令条件?
237 |
238 | ARM指令所有指令都是带有条件的,默认是AL即无条件执行,当指令带有默认条件时不需要明确写出。ARM指令包含4位的条件码列表如下:
239 |
240 | 
241 |
242 | ### ARM软中断
243 |
244 | ##### Arm32软中断?
245 |
246 | 在使用软中断进行系统调时,系统调用号通过R7寄存器传递,用SWI指令产生软中断,实现从用户模式到管理模式的切换。例如,调用exit(0)的汇编代码如下:
247 |
248 | ```
249 | MOV R0, #0 //参数0
250 | MOv R7, #1 //系统功能号1为 exit
251 | SWI #0 //执行 exit(0)
252 | ```
253 |
254 | ##### Arm64软中断?
255 |
256 | 在使用软中断进行系统调时,系统调用号通过x8寄存器传递,用svc指令产生软中断,实现从用户模式到管理模式的切换。例如:
257 |
258 | ```
259 | mov x0, 123 // exit code
260 | mov x8, 93 // sys_exit() is at index 93 in kernel functions table
261 | svc #0 // generate kernel call sys_exit(123);
262 | ```
263 |
264 | ### ARM三级流水线?
265 |
266 | ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续
267 |
268 | ARM三级流水线分为:
269 |
270 | ```
271 | 取指:从存储器装载一条指令
272 | 译码:识别将要被执行的指令
273 | 执行:处理指令并将结果写会寄存器
274 | ```
275 |
276 | ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出,所以,ARM7流水线只有在取第4条指令时,第1条指令才算完成执行。无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,即下图中的第三条指令。
277 |
278 | 
279 |
280 | - 在ARM32状态下,当前执行指令的地址通常是pc-8,而Thumb状态下通常是pc-4。
281 | - 在AARCH64状态下,当前执行指令的地址通常是pc。
282 |
283 | ### 参考
284 |
285 | [ARM汇编基本指令](https://ayesawyer.github.io/2019/08/26/arm%E6%B1%87%E7%BC%96%E5%9F%BA%E6%9C%AC%E6%8C%87%E4%BB%A4/)
286 |
--------------------------------------------------------------------------------
/Black.md:
--------------------------------------------------------------------------------
1 | # Android安全面试宝典(01)——黑灰产篇(2020)
2 |
3 | # 前言
4 |
5 | 本文为永安在线2020黑灰产研究报告的阅读总结,文档微信公众号回复:永安黑灰产报告,自取。简易的思维导图上传至知识星球:安全后厨
6 |
7 | ## 一、黑产产业供应链
8 |
9 | 
10 |
11 | 风控情报库:
12 |
13 | ```
14 | (1)风险⼿机号识别——识别⼿机号是否是⿊灰产团伙所持有的虚假⼿机号或是被⿊产所劫持的真⼈号码
15 | (2)动态风险IP识别——实时识别代理、秒拨、混拨、代理秒拨等动态的风险IP
16 | (3)风险设备环境——识别群控、云控、箱控、云⼿机、模拟器、多开分身、Root越狱、设备调试、虚拟定位、挂机⾏为等30多种风险设备环境
17 | ```
18 |
19 | ## 二、黑产的演变趋势
20 |
21 | ### 1.商业模式转变带来黑灰产核心资源变化
22 |
23 | 黑灰产逐渐向移动互联网的场景转移
24 |
25 | ### 2.虚假账号的生产和流转呈规模化趋势
26 |
27 | 大量手机号在各个互联网核心业务场景注册恶意账号,并通过这些账号在业务场景中变现
28 |
29 | #### (1)恶意注册的黑产
30 |
31 | 直播平台进行刷单,识别虚假账号的困难性
32 |
33 | 
34 |
35 | #### (2)恶意注册规模效率
36 |
37 | 大量的恶意账号注册远远大于解封,这导致了接码平台和发卡平台变得十分重要
38 |
39 | 
40 |
41 | 接码平台提升黑灰产的虚假注册效率
42 |
43 | ⿊灰产购买猫 池设备,再插上上百张⼿机卡来模拟上百个自然⼈,完成对业务场景的恶意注册。恶意注册完之后再把设备和电话卡转卖或者租用给另外⼀个⿊灰产团队用于不同业务场景的恶意注册。
44 |
45 | 
46 |
47 | 接码平台:⽕云、爱乐赞、ema666、60码、thewolf、⽟米等
48 |
49 | 随着验证码对抗的升级,注册项目不再是通过单⼀的短信验证,有些需要语音验证,有些则 需要⼆次验证,即需要注册用户使用注册的⼿机号向指定号码发送⼀条验证短信。
50 |
51 | 发卡平台提升黑产账号流转的效率
52 |
53 | 发卡平台是把数字商品做自动化交易的平台,在号商完成⼤量账号的注册后,他们会把恶意账号整理后集中在发卡平台中列出,供处在产业链下游的用号⽅直接线上批量采购。
54 |
55 | 
56 |
57 | #### (3)企业对抗恶意注册的主要措施
58 |
59 | **防控-及时捕获黑灰产行为**
60 |
61 | <1>识别黑灰产资源:
62 |
63 | ⿊灰产在作恶和变现时都重度依赖于其⼿中持有的基础资源,包括但不限于⼿机号、IP、设备等。将这些数据与自身业务数据进行匹配,然后进行风险控制
64 |
65 | <2>分析黑产工具:
66 |
67 | 通过逆向分析黑灰产的工具,来了解自身的一些逻辑漏洞和风控策略,再进一步进行防护
68 |
69 | <3>监控黑灰产交易变化:
70 |
71 | ⿊灰产交易品类和价格的变动,能够反映出企业⼀定周期内风控策略的有效性。例如黑灰产交易的价格变高,说明企业风控产生了一定的效果
72 |
73 | **预警-对虚假账号进行风险预警**
74 |
75 | <1>新增的恶意注册项目:
76 |
77 | 对黑灰产实施恶意注册行为之前进行监控
78 |
79 | <2>正在发生的恶意注册行为:
80 |
81 | 通过对黑灰产进行恶意注册时的工具方式进行刻画,然后进行还原攻击逻辑,提高风险控制
82 |
83 | ### 3.从自动化工具向真人众包演变
84 |
85 | #### (1)黑产攻击趋势变化
86 |
87 | 现在的黑产攻击整合程度加深,集成接码、打码、宽带秒拨、⽹络代理等多个针对绕过业务安全风控节点的功能
88 |
89 | #### (2)将攻击隐藏于正常用户行为中
90 |
91 | 黑产使用众包等方式将自身的行为变得正常化,使得难以检测
92 |
93 | #### (3)黑产作恶方法的改变
94 |
95 | **手机号的转变-短信拦截卡比例增高**
96 |
97 | 干净身份的手机号先进行高利润的恶意账号注册,完成后再进行低利润的恶意账号注册
98 |
99 | 短信拦截卡的比例不断增高
100 |
101 | **真人作弊乱象-新客福利被黑会产和羊毛党恶意赚取**
102 |
103 | 
104 |
105 | 通过恶意注册来进行新人福利的薅羊毛
106 |
107 | **刷量⽅式隐蔽升级-从假⾁鸡到真⾁鸡**
108 |
109 | 通过恶意注册然后使用分身工具和IP代理工具进行恶意的刷量,例如有⽹页⼴告采用隐藏浮层的⽅式进⾏刷量,有软件⼴告通过 恶意弹窗进⾏刷量,还有利用小众宽带进⾏宽带劫持弹窗刷量。
110 |
111 | #### (4)新型黑灰产的应对方案
112 |
113 | **拦截卡黑卡的作恶方式**
114 |
115 | 需要以“是否为持卡⼈本⼈操作”来区分是不是被⿊产利用,这需要根据拦截卡本身特点和使用拦截卡攻击过程中的特征进⾏判定:
116 |
117 | 1)通过自身业务场景设置判断规则
118 |
119 | 2)根据拦截卡的出现频次,以及⼿机⿊卡、⿊IP的命中次数进⾏判定
120 |
121 | **真⼈众包作恶⽅式**
122 |
123 | 真⼈众包的作恶主要为通过发布众包任务的⽅式进⾏作恶,我们如果要应对的话首先需要知晓其作恶流程。
124 |
125 | 真⼈作弊的作恶可以通过情报维度和数据维度两个⽅面共同分析,对真⼈作弊帐号进⾏精准 的定位:
126 |
127 | ```
128 | (1)情报维度的信息,获知哪里记录了礼品最快领取流程,可以帮助我们直接抹去和⿊产之间 的信息差,并在最短的时间夺取主动权.
129 | (2)数据维度可以用是否有异地登陆、异地登陆设备等特征去进⾏复合判断,以发现⿊产动作特征,及时发现被⿊产控制的帐号。
130 | ```
131 |
132 | **刷量方式的应对措施**
133 |
134 | 对于广告投放商来说:通过统 计代码自带的页面统计功能发现恶意刷量的⾏径:
135 |
136 | ```
137 | 1)通过停留时长发现刷量的请求
138 | 2)可以通过对IP的检测发现是否是来自于刷量⼯作室的访问,从⽽清洗出相对⼲净的用户访问列表。
139 | ```
140 |
141 | 社交平台的刷量解决方案:结合真⼈作弊的定位⽅式进⾏分析,通过情报维度和数据维度发现被⿊产控制进⾏刷量的帐号,然后根据特征进⾏⼀⽹打尽
142 |
143 | ```
144 | 1)情报维度的信息,通过了解⿊产可以进⾏刷量的操作点,对相关环节进⾏监控,拦截来自 恶意⼿机卡和恶意IP的请求。
145 | 2)数据维度可以用是否有异地登陆、异地登陆设备等特征去进⾏复合判断,以发现⿊产动作特征,及时发现被⿊产控制的帐号。
146 | ```
147 |
148 | ### 4.真人作弊深度剖析
149 |
150 | 真人作弊是现在黑灰产中最难对抗的情况,主要原因:
151 |
152 | ```
153 | (1)真⼈作弊⿊灰产经过数年发展,模式和形态越发多元和丰富,已渗透⾄众多场景、众多⾏业
154 | (2)真⼈作弊⿊灰产发展迅猛,自2014年⾄2020年,真⼈作弊平台(app)的数量在增长了近40倍,参与⼈数增长了近百倍
155 | (3)相较于机器作弊,真⼈作弊对甲⽅的风控和安全能⼒提出了更⾼的要求,带来了新的挑战
156 | (4)以情报能⼒和数据能⼒为风控赋能,是识别新型欺诈模式的有效⽅式⽅法
157 | ```
158 |
159 | #### (1)发展现状
160 |
161 | 多行业、多场景、多任务广泛渗透
162 |
163 | 
164 |
165 | 
166 |
167 | 
168 |
169 | 真人作弊主要关注的任务是:下载注册、认证绑卡、评论关注
170 |
171 | #### (2)痛点和危害
172 |
173 | **真人作弊vs机器作弊**
174 |
175 | 
176 |
177 | **真人作弊vs传统风控**
178 |
179 | 传统风控更加倾向于黑产的特征进行检测,难以应对真人作弊:
180 |
181 | <1>防护手段失效
182 |
183 | ⽆论是规则层面的风险数据库、风险规则库、风险特征库等,还是模型层面的AI算法、决策引擎等,其知识的积累主要来自于长期对机器作弊的数据分析与沉淀。真人作弊的途径难以查寻,所以难以进行防护。
184 |
185 | <2>处置边界模糊
186 |
187 | 处置违规的真实账号难度增强。
188 |
189 | <3>风险响应滞后
190 |
191 | 从真人作弊风险事件发生,到最后产生影响,出现对抗方案,这个周期太长
192 |
193 | <4>溯源复盘困难
194 |
195 | 难以对真人作弊进行溯源
196 |
197 | **真人作弊的额外风险**
198 |
199 | 真⼈作弊还引⼊了个⼈信息被⿊产滥用和泄露的风险
200 |
201 | ⿊产收购真⼈用户注册的账号,用于不法用途。⿊产诱导真⼈用户协助完成好友辅助认证、 实名、⼈脸认证等,真⼈用户不但违反平台用户条款,甚⾄还需承担潜在的法律风险。例如认证绑卡风险,用户获得佣金,但是黑产可能拿用户信息进行获利。
202 |
203 | #### (3)对抗和解决
204 |
205 | 情报能⼒和数据能⼒为风控赋能,是对真⼈作弊新型欺诈模式的解决办法。
206 |
207 | **情报维度**
208 |
209 | 首先人工对多家的真人作弊平台进行特征的统计,比如统一的密码,包括密码特征、任务发布者信息、任务最早开始时间等等,然后第⼀时间把这些关键信息交给了该社交平台,然后进行溯源和定位。
210 |
211 | **数据维度**
212 |
213 | 真⼈作弊相关的风险数据包括:风险APP、风险设备、风险账号以及真⼈作弊中 任务的⼆维码、链接、教程、任务流程等等。
214 |
215 | 对真⼈作弊用户进⾏了风险设备的定位以及信息提取⼯作,另外也把这些风险设备、任务分享链接和结算链接等数据特征交付给了该支付平台。然后对这些账号进行共性分析,来进一步确定特征,然后进一步的溯源
216 |
217 | ## 三、攻防技术的迭代
218 |
219 | ### 1.黑产群控进化史
220 |
221 | #### (1)群控&箱控
222 |
223 | 群控,是⼀种通过操作多台⼿机进⾏批量攻击的⽅式,可以说是⿊产⼯作室的刚需,在市场需求的催⽣下,群控类设备的供应商都非常擅长与利用各类技术对其进⾏升级优化。
224 |
225 | 
226 |
227 | 箱控的内部构造。将⼗⼆台安卓⼿机的屏幕拆掉,把主板通过电路集成⽅式集成⾄⼀块⼤主板,进⾏统⼀供电和管理
228 |
229 | 
230 |
231 | ⾄于设备数量问题,它通过切割内存的⽅式,将每个⼿机主板切割为⼗个分身。最终达到,操作⼀台箱控相当于操作⼀百⼆⼗个不同⼿机的观感。
232 |
233 | ⿊产常常需要通过模拟点击的⽅式伪装正常用户操作,达到攻击目的。见的模拟点击⽅案是通过识别颜⾊、⽂字、形状来定位到需要点击的坐标,这种⽅式经常需要进⾏容错判断,箱控使用了appium。
234 |
235 | #### (2)黑产进化、优化攻击效率和成本
236 |
237 | **重度依赖黑产基础资源**
238 |
239 | 在⿊产市场,像设备这样需求庞⼤⽽稳定的“资源”还有很多:IP、身份证、银⾏卡、支付账 号、改机⼯具、自动化攻击软件、过滑动验证码、隐秘变现渠道等。
240 |
241 | 
242 |
243 | #### (3)黑产解决批量攻击的方式
244 |
245 | **箱控**
246 |
247 | 优化点:将通用类的攻击⼯具打包配套提供服务,降低了攻击的操作门槛
248 |
249 | 将通用类的攻击⼯具打包配套提供服务,降低了攻击的操作门槛,黑产将很多功能进行集成:VPN功能、改机功能、虚拟定位功能、云端备份功能等,降低黑产攻击的门槛
250 |
251 | 
252 |
253 | **租赁模式-“云⼿机”**
254 |
255 | 优化点:租赁模式,自由“扩容”,降低了维护设备成本,且⽅便备份传输设备信息
256 |
257 | “云⼿机”是⼀种攻击设备租用模式,操作者可以通过客户端或浏览器直接对远端的⼿机(或虚拟⼿机)进⾏操作,发起攻击。
258 |
259 | **中控**
260 |
261 | 优化点:解决了传统群控因数据线传输屏幕数据和指令数据造成的设备数量限制问题。
262 |
263 | ⼿机设备中安装客户端,用户在PC端客户端上统⼀管理⼿机并向其下发命令,由⽹络传输 后⼿机客户端执⾏模拟点击完成攻击。
264 |
265 | **云控**
266 |
267 | 优化点:设备⽆需在同⼀地点,脚本命令存储在云端,团伙间交易脚本时⽆需发送源码,⽅便了脚本传播和管理⼤量⼿机
268 |
269 | ⼀个⼴域⽹版本的“中控”,操作者通过任意浏览器对⼿机进⾏管理和下达命令。
270 |
271 | **群控**
272 |
273 | 优化点:早期的批量操作设备解决⽅案,在脚本开发上限制较多,为避免卡顿,设备数量限制在百台左右。
274 |
275 | 采用屏幕映射的⽅式将⼿机屏幕映射到电脑,通过集线器将⼿机与电脑通过数据线连接,从⽽传出屏幕内容和操作指令。
276 |
277 | #### (4)攻防建议
278 |
279 | 企业可通过反欺诈情报(事前预防,事后根据攻击⽅法找到防护点)+欺诈数据标签(定位攻击流量)的综合对抗,填补认知盲区,打平信息差,了解对⽅的目标、攻击思路和策略。
280 |
281 | ⿊产有庞⼤的上游基础资源供应,但同时也非常依赖这些资源,这些是产业链的关键结点,也同时是我们识别、打击和防护的有 效结点。
282 |
283 | 
284 |
285 | **反欺诈情报——业务安全攻防中的隐性⼒量**
286 |
287 | 反欺诈情报⼀般包括:⿊产准备攻击的接⼝、所涉及到的交易平台、攻击的目标接⼝、所利 用的攻击⼯具、所涉及到的相关资源(⼿机号、IP)等。通过这些节点的布控,可以有效的在⿊产资源准备时就及时发现风险,并了解⿊产的攻击路径和逻辑,提前做好风控策略。
288 |
289 | **欺诈数据标签——⾼效落地的判别⽅案**
290 |
291 | 可以针对这些⿊灰产做恶的虚假账号进⾏直接的拦截或降权。从⿊产基础资源识别的风控⽅式,能够⼀定程度上降低风控的误判率并提⾼可解释性。
292 |
293 | ### 2.黑产IP资源进化史
294 |
295 | 秒拨IP资源早已成为当下主流的⿊产IP资源
296 |
297 | #### (1)秒拨IP
298 |
299 | 自从甲⽅开始在IP层面根据⼀些简单的规则(如设定单位时间内IP的访问次数阈值、限制触 发特定⾏为的IP等)做风控起,就正式向⿊产在IP战场上宣战。
300 |
301 | 代理IP不适合黑产大规模批量化的攻击,不少甲方开始积累代理IP池,进一步打压了黑产使用代理IP的效果
302 |
303 | 秒拨的底层思路就是利用国内家用宽带拨号上⽹(PPPoE)的原理,每⼀次断线重连就会获取⼀个新的IP。与时俱进的⿊产掌握⼤量宽带线路资源,利用虚拟化和云计算的技术整体打包成了云服务,并利用ROS(软路由)对虚拟主机以及宽带资源做统⼀调配和管理。黑产用户可以控制云主机,部署自动断线重连切换IP以及攻击的⼯具后。
304 |
305 | 
306 |
307 | 秒拨的优势:
308 |
309 | ```
310 | (1)IP池巨⼤:假设某秒拨机上的宽带资源属于XX地区电信运营商,那么该秒拨机可拨到整个XX地区电信IP池中的IP,少则⼗万量级,多则百万量级;
311 | (2)秒拨IP难以识别:因为秒拨IP和正常用户IP取自同⼀个IP池,秒拨IP的使用周期(通 常在秒级或分钟级)结束后,⼤概率会流转到正常用户⼿中,所以区分秒拨IP和正常
312 | 用户IP难度很⼤。
313 | ```
314 |
315 | ⿊产对秒拨还做了升级,称为“混拨”,即⿊产把多个省市地区的秒拨资源打通,实现在单台秒拨机上就可以拨到全国上百个地区的IP资源。
316 |
317 | #### (2)攻防建议
318 |
319 | 秒拨已然成为支撑⿊产与甲⽅在IP层面攻防的核⼼技术,也是当下业务安全⾏业的痛点之⼀。
320 |
321 | 识别风险IP的核⼼依据应该是,该IP是否当下被⿊产持有,IP的⿊产使用周期和时间 有效性这两个指标尤为重要,尤其是对于像家庭宽带IP、数据中⼼主机IP这种“非共享型”的IP。针对基站、专用出⼝等“共享型”的IP,由于单个IP背后会有⼤量用户,风控阈值应该相 对更宽松,但是如果能准确识别IP是否当下被⿊产使用,也能提供很重要的参考价值。通过对⿊产ROS秒拨节点的布控,可实时监控和收集⿊产当下使用的秒拨IP。
322 |
323 | ### 3.秒拨IP识别技术案例
324 |
325 | IPv6的普及,无疑给黑产带来了巨大的空间,可以极大的扩大了自己的ip地址资源,而且现在秒拨也增加了对IPv6的支持
326 |
327 | #### (1)黑灰产已经开始利用IPv6资源
328 |
329 | 从早期的通过代理IP饶过风控规则的方式,到现在已经演化出“秒拨”“混拨”等,甲方的对抗策略在IPv4的环境下也有相应的提升和积累
330 |
331 | IPv4向IPv6过度过程中,企业需要考虑的问题:
332 |
333 | 海量的地址扫描、黑名单库失效、未知下的误判等
334 |
335 | 现目前黑灰产掌握的主要IP资源中都存在IPv6的踪迹:
336 |
337 | **代理**
338 |
339 | 由于当前IPv6普及率还较低,IPv6 代理商并不是直接提供IPv6地址和端⼝,提供的依旧是IPv4和端⼝,通过类似6in4加IPsec的 隧道协议,将IPv6数据包封装在IPv4数据包中。
340 |
341 | **秒拨**
342 |
343 | 秒拨IP是⿊灰产掌握的另⼀主要IP资源,现在已有部分秒拨厂商开始支持并提供IPv6的服务,而且IP池庞⼤到接近⽆限,并且IP地址更难以识别
344 |
345 | <1>无限IP池
346 |
347 | 监测到的10万数据中⼏乎不存在重复的IPv6地址,⽽实际的IPv6秒拨池中,远不⽌这个数。这意味着,传统的利用IP⿊名单库给IP打风险标签的⽅式将不再适用。
348 |
349 | <2>秒拨IP难以识别
350 |
351 | 由于秒拨IP和正常用户IP存在于同⼀个IP池,每次断开连接,原本属于被⿊产使用的秒拨IP,都有可能在下⼀次拨号的时候流⼊到正常用户⼿中,这会给秒拨IP和正常IP的区分带来非常⼤的难度。
352 |
353 | #### (2)攻防建议
354 |
355 | 针对IPv6的攻击手段进行提前的研究,以往以后的攻击
356 |
357 | ### 4.新工具“IP魔盒”案例分析
358 |
359 | #### (1)IP魔盒
360 |
361 | IP魔盒⼀款比⼿掌还小的硬件盒⼦,USB接⼊后,可以使普通PC拥有基站IP,IP魔盒的特征:
362 |
363 | ```
364 | 1) 关联用户多:⼀个基站IP背后会关联着⼤量的用户群体,如果对IP进⾏拦截,极易误杀正 常用户,影响用户体验,导致用户流失。
365 | 2) 切换IP简单:仅需要通过打开关闭飞⾏模式,即可实现IP切换。
366 | 2)切换IP简单:仅需要通过打开关闭飞行模式,就可以实现IP切换
367 | 3) 成本较低:据我们统计⼀般全国物联⽹卡,开卡价格为4-6元,10G流量价格仅需要15元。
368 | 4) 海量IP池:经测试⼀张全国物联⽹卡可以获取⾄少17个段的IP,且分布在不同的地区。
369 | ```
370 |
371 | 
372 |
373 | ### 5.定制化的ROM改机案例分析
374 |
375 | ⿊产改机的⼿段主要有安卓模拟器、改机⼯具、应用多开/分身。
376 |
377 | #### (1)定制ROM改机的技术原理
378 |
379 | 简单来说就是通过修改Android系统源代码,在底层直接修改并返回设备参数。这种修改是 全局的,即可以对所有的应用进程和shell进程都⽣效。
380 |
381 | **修改机型信息:**
382 |
383 | 我们以修改机型信息为例,获取机型信息⼤多会调用_system_property_get这个函数,位于/system/lib/libc.so这个系统库中。
384 |
385 | 
386 |
387 | 我们发现开发者对init进程做了深度定制,最终是在init中修改了机型信息
388 |
389 | **修改IMEI:**
390 |
391 | 获取IMEI信息通常会调用getDeviceID函数。这是⼀个phone服务的IPC调用,响应代码位于:packages/services/Telephony/src/com/android/phone/PhoneInterfaceManager.java中
392 |
393 | 根据IPC调用发起⽅的UID(可以看作⼀个用的唯⼀标识),来判断是否需要修改 IMEI。如果是,则调用getHookValue返回伪造的IMEI。为了⽅便使用,作者提供了设置接 ⼝,可以在使用前设置哪些应用需要修改IMEI。
394 |
395 | #### (2)定制ROM改机的使用
396 |
397 | 还可以将定制化改机ROM变的更为简单:
398 |
399 | ```
400 | 1)可镜像备份机型数据环境⾄云服务器,⽅便账号对应的设备环境管理;
401 | 2)打通系统调试接⼝,⽅便自动化脚本编写、降低开发成本;
402 | 3)傻瓜式⼀键式操作,完成设备信息修改、设备数据恢复。
403 | ```
404 |
405 | 定制ROM改机运⾏流程如下图所示:
406 |
407 | 
408 |
409 | 实现批量化引流
410 |
411 | #### (3)定制ROM改机的检测
412 |
413 | 需要深入结合改机工具的实际运行原理和运行过程,找到相应的攻击面,这样才能实现对改机工具的反制
414 |
415 | ### 6.黑产攻击流程自动化体系
416 |
417 | 从攻击⾏为来看,批量注册,批量薅⽺⽑,刷量,刷单,引流等,往往需要操控⼤量的账 号,因此对自动化攻击的依赖性更强:
418 |
419 | 
420 |
421 | #### (1)黑产资源高度集成自动化攻击流程
422 |
423 | **API接口**
424 |
425 | ⿊产资源平台为了⽅便,最典型的⽅式的是提供API接⼝,这样便可以在自动化脚本或程序 中直接调用。以接码平台为例,提供的API接⼝主要有两个,取⼿机号和取验证码。
426 |
427 | ```
428 | http://api. xxxxxx .com/api/do.php ? action=getPhone
429 | ```
430 |
431 | 由于各个接码平台API接⼝除了域名外,参数格式都⼤同小异,所以可以通过定义⼀些正则表达式,从流量中(比如我们的蜜罐流量)捕获接码平台的API接⼝访问流量,从⽽可以⼤致掌握全⽹的接码平台数量和规模
432 |
433 | 还有一些过码平台提供API接口
434 |
435 | **功能模块**
436 |
437 | 很多黑产工具使用易语言编写模块,十分的简洁,而且可以进行模块化集成
438 |
439 | **提供环境**
440 |
441 | 秒拨相比于代理IP,除了价格更低,还可以结合自动化攻击
442 |
443 | ```
444 | 1)启动秒拨的客户端程序,开启自动拨号,然后执⾏自动化攻击:
445 | 2)将自动化攻击的脚本或程序运⾏在秒拨VPS中,秒拨VPS提供自动拨号的功能:
446 | ```
447 |
448 | **集成系统**
449 |
450 | 集成的黑产工具系统,例如某款箱式群控:
451 |
452 | ```
453 | 1)VPN拨号功能,可以⽅便的切换IP;
454 | 2)虚拟定位功能,可以⽅便的修改定位,从⽽实现虚假出⾏订单或站街招嫖;
455 | 3)改机功能,可以⽅便的修改IMEI,IMSI等硬件参数,从⽽伪造更多设备;
456 | 4)主流的移动端App自动化操控脚本,比如微信自动加好友,自动加群,自动发朋友圈, 抖音自动关注,自动点赞,自动发表评论等;
457 | 5)云端备份功能,可以将整套攻击环境连同环境上登录的账号⼀并上传备份,通过还原快 照的⽅式切换环境,从⽽进⾏⼤量攻击。
458 | ```
459 |
460 | #### (2)自动化攻击的技术手段和攻防对抗
461 |
462 | ⿊产实现自动化攻击,主要通过2种技术⼿段:协议破解/伪造,以及模拟点击/操控。
463 |
464 | **协议破解/伪造**
465 |
466 | 协议破解/伪造指的是通过抓包+逆向分析等⽅式,获取到客户端跟服务端通信的请求接⼝以及参数,直接伪造接⼝协议和参数来完成自动化操作
467 |
468 | 破解了协议后,可以写自动发帖机,一些参数进行随机值的校验
469 |
470 | 由于协议破解/伪造脱离了环境和设备的限制,⿊灰产可以用很低的成本完 成批量化规模化作案,因此危害也更加严重。
471 |
472 | **模拟点击/操控**
473 |
474 | <1>按键精灵
475 |
476 | 按键精灵是⼀款⼤家非常熟悉的老牌自动化脚本⼯具,也是目前⿊产使用最为普遍的通过模 拟点击实现自动化攻击的⼯具。
477 |
478 | <2>Auto.js
479 |
480 | 优势:
481 |
482 | ```
483 | 1)设备⽆需Root,使用成本更低,⽽且可以躲避基于Root的风险设备环境检测; 2)按键精灵基于识别图片、颜⾊、坐标等实现模拟操作,存在分辨率的兼容问题,⽽
484 | Auto.js可以直接操作控件,自动适配各种安卓机型,稳定性更⾼;
485 | 3)使用Auto.js开发打包⽣成的apk⽂件体积更小。
486 | ```
487 |
488 | Auto.js脚本开发者可以使用Visual Studio Code + Auto.js插件开发脚本,电脑连接⼿机终端,可直接控制装有Auto.js客户端的⼿机执⾏脚本,也可将脚本保存⾄⼿机终端,编译为APK, 运⾏APK执⾏操作\
489 |
490 | 移动端的模拟点击/操控类攻击,需要在设备上运⾏被攻击的移动端应用
491 |
492 | 批量化攻击的对抗:
493 |
494 | ```
495 | 如果要实现批量化规模化攻击,需要有⼤量的设备资源(群控、云控、箱控,或者通过 模拟器/改机⼯具伪造设备资源),因此对于厂商来说,可以从设备环境层面进⾏风险检 测。⽆论是使用按键精灵、Auto.js、改机⼯具、GPS伪造等⼯具,还是模拟器、群控等设备环境,可从设备指纹数据中找到蛛丝马迹,设备指纹除了用作唯⼀性标识之外,还应该对基本的应用多开、改机环境/环境伪造、Hook⾏为、Root/越狱、代理/VPN等风险场景有识别能⼒。如果具备较强的情报能⼒,可以尽可能多的收集自动化攻击脚本程序,并在应用启动的时候检测安装列表(Applist)中是否存在这类程序。
496 | ```
497 |
498 | 模拟点击的对抗:
499 |
500 | 模拟点击/操控类攻击虽然会模仿正常用户的操作⾏为,但与用户实际的⾏为特征还是会存在差异,可以从 ⾏为层面做检测
501 |
502 | 比如针对某电商平台刷店铺访问量的⼯具,每⼀次刷量⾏为⼀定会包含“打开首页”、“搜索目标店铺的商品关键词”、“先进⼊两家同类商品的店铺浏览商品”(模仿正常用户货比三家 的习惯)、“在进⼊目标店铺浏览商品完成刷量”,并且在每个页面的停留时间也在固定的。
503 |
504 | 从业务数据中提取用户关键⾏为做特征进⾏聚类分析,可以有效识别程序化的模拟操作
505 |
506 | #### (3)攻防的建议
507 |
508 | 设备的风险检测:
509 |
510 | ```
511 | 1) 对业务运⾏的设备环境进⾏检测。⿊灰产⽆论是在设备信息欺骗上,运⾏自动化脚本⼯ 具,都需要使用⼀些特殊的运⾏环境。这些环境通过分析⼀般都能找到⼀些通用的检测点。 比如改机⼯具,可以对Hook框架进⾏检测,模拟点击可以检测系统参数。这些都可以作为 可疑设备特征进⾏加权打分。
512 | 2) 对业务上的用户⾏为识别。⿊产自动化通常会用到的协议模拟技术和模拟按键技术,这都跟自然⼈的操作路径会有巨⼤的差距。比如当用户登录时,账号密码的输⼊不会是瞬间完成的,又或者每次按钮的点击,也不会在相同位置。这些都可以作为检测特征,当我们对用 户操作⾏为进⾏识别,这⼤⼤增加了⿊灰产的对抗成本。
513 | ```
514 |
515 | ## 四、黑产工具情报分析
516 |
517 | ### 1.⼯具样本的快速分析和有效性验证
518 |
519 | 不容易⼿动执⾏并复现功能的原因主要有以下⼀些:
520 |
521 | ```
522 | 1) 缺少⼯具运⾏的环境,比如.net 编写的⼯具需要.net的运⾏时环境,XPosed 程序需要 XPosed 框架等;
523 | 2)缺少⼯具运⾏所依赖的⼀些组件,主要出现在部分 PC 端⼯具样本,在运⾏时需要⼀些其 他的动态库(DLL)支持;
524 | 3)⼯具运⾏时会检测虚拟机环境,导致在虚拟机中运⾏不起来,主要出现在 部分 PC 端⼯具样本
525 | 4)⼯具需要激活或注册才能够使用,对于这种情况,可以尝试联系作者进⾏购买,或者通过 破解等⼿段绕过激活或注册,直接进⼊⼯具主界面;
526 | 5)⼯具执⾏相应功能时,缺少需要的资源⽂件,比如部分⼯具在执⾏批量回复、点赞、关注等操作时,需要读取本地的账号资源⽂件;
527 | 6)⼯具执⾏相应⼯功能时,需要购买⿊产平台的资源,比如注册机类⼯具,往往需要先在接码平台注册账号并充值,然后在⼯具运⾏时填⼊接码平台的账号密 码;
528 | 7)⼯具执⾏的流量比较复杂,有的需要按照⼀定的步骤⼀步步执⾏,有的需要先执⾏⼀些前置操作。对于这类⼯具往往得先找到教程并按照教程来执⾏等。
529 | ```
530 |
531 | **移动端工具的分析**
532 |
533 | <1>⼯具的包名
534 |
535 | 通过工具的包名进行过滤
536 |
537 | <2> ⼯具的源代码
538 |
539 | ⼤多数移动端⼯具都可以在情报平台上下载通过⼀定技术⼿段还原出来的源代码。直接阅读源代码可以清晰的了解⼯具的运⾏原理,依赖的资源,执⾏的步骤等。
540 |
541 | ## 五、总结
542 |
543 | 本文参考于《永安在线-2021年黑灰产行业研究及趋势洞察报告》,微信公众号回复:永安黑灰产报告,自取。简易的思维导图上传至知识星球:安全后厨。
544 |
545 |
--------------------------------------------------------------------------------