aosp12内核编译开启硬件断点和kprobes记录
参考链接eBPF on Android之打补丁和编译内核
修改Linux Kernel defconfig的标准方法
需求最近打算重新做一版以前的工具,升级一下系统版本,在编译内核的时候碰到了一些问题,顺手记录一下。目标是编译aosp12的内核,修改配置开启硬件断点,开启kprobe。为后续学习bpf准备测试环境。
编译内核首先找到对应我当前aosp12版本对应的内核,我们官网提供的描述可以找到。由于我使用的手机是pixel3,所以对应的版本是android-msm-crosshatch-4.9-android12
123// 拉取内核代码repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-crosshatch-4.9-android12repo sync -j8
成功拉取代码后,可以先直接编译./build/build.sh跑通编译,如果在编译过程中出现错误,有可能是缺少了一些环境,以下是我编译过程安装的缺少依赖
12sudo apt install bcsudo apt inst ...
linux内核书籍阅读笔记1
简要说明一个linux内核小白的学习路,看书的过程有很多暂时无法理解的我就直接略过或者简单笔记一下。由于我主要的目的是学习android内核,所以我主要参考代码是安卓内核的源码。有些我看书理解的如果有错误,还请多多指点。
参考书籍:Linux内核深度解析《余华兵》内核引导和初始化当CPU通电后,首先是执行引导程序,引导程序存放在一个只读的存储器中,物理地址0开始的一段地址空间分配给了这个存储器,引导程序把内核加载到内存中,然后执行内核,内核初始化完成后,启动用户空间第一个进程。
根据书中提示引导程序的入口是arch/arm/cpu/armv8/start.S
而我参考的是android内核,翻来翻去都没找到,所以我跳过了uboot引导程序加载的部分。
直接快进到arch/arm64/kernel/head.S,这里对比发现和android内核的差不多了。
首先看开始的相关代码
12345678910#ifdef CONFIG_EFIefi_head: /* * This add instruction has no meaningful effect excep ...
逆向工程权威指南的看书笔记
书籍:逆向工程权威指南上(看书笔记)这本书有各种架构的相关说明,省略掉非arm64架构的相关记录1、CPUcpu:执行程序机器码的硬件单元。
指令码:cpu处理的底层命令。
机器码:给cpu执行的程序代码。
汇编语言:为了便于编写而创造出来的,最接近机器码的语言。
指令集架构:不同架构的cpu处理的指令集都不一样,arm指令集最早先都被封装在4个字节里,后来由于发现4个字节很少用满,就推出了封装在2个字节的Thumb指令集及架构,但是不能封装所有的arm指令。就推出了2个字节封装不下的指令就由4字节封装的Thumb-2。最后arm64指令集又回到了固定使用4字节的指令集。
2、简单函数12345678int f(){ return 123;}--------汇编代码--------f: mov r0,#0x7b ; bx lr endp
这里可以看到arm程序使用r0寄存器存放返回值,使用lr存放函数结束后返回的地址。
3、arm64的hello world例子首先写个例子
12345#include <stdio.h>int ...
FartExt超进化之奇奇怪怪的新ROM工具MikRom
前言 一眨眼就到春节了,好久没有写文章了,趁着新年空闲,赶紧把自己折腾了一段时间的东西整理了一下。在折腾的过程中,碰到了不少问题,感谢大佬们的帮助。目前这个工具不算是怎么完善吧,但是感觉能凑合使用了,剩下的部分在使用中再慢慢完善吧,其中部分代码我会开源,其实感觉实现的核心并不怎么复杂。算是一个萌新学习定制ROM过程的一个作品把。而且还有个调试超级慢的BUG,如果有大佬知道是啥原因,还请指导一下。万分感谢。
感谢
看雪高研班课程
FART脱壳王课程
珍惜的android进阶课程
FartExt 详细的介绍请看:FartExt之优化更深主动调用的FART10
FartExt是我之前学习脱壳实践时做的一个自动脱壳机,是基于FART的主动调用思想实现对特定的抽取壳进行优化处理的工具。由于原本的FART没有配置相关的,所以我增加了配置对指定app脱壳。大致就是对FART的简单优化。由于感觉当时做的功能并不怎么完善,所以只是短暂的放了下载地址,就删掉了。不知道有没有人实际使用。使用的效果到底咋样。现在放出开源代码。
github:FartEx ...
FartExt之优化更深主动调用的FART10
参考
将FART和Youpk结合来做一次针对函数抽取壳的全面提升
看雪高研班课程
寒冰大佬的FART带动了不少新的主动调用思想的抽取壳方案。看了上面这篇文章,感觉意犹未尽,当然是要动手实践一翻来优化一波。于是我重新翻阅FART和Youpk的源码,我准备和那位大佬一样,参考Youpk在FART的基础上进行升级改造。开工前先明确出我的需求。
需求
对指定进程脱壳,非目标进程不要执行脱壳线程。
对指定类列表进行脱壳
将FART升级到aosp10实现。
去FART指纹
FART保存出的函数修复合并为dex。
实现FART更深的主动调用
更快的主动调用(暂未优化)
一、什么是FART还未了解过的请看原作者对于fart的介绍
FART:ART环境下基于主动调用的自动化脱壳方案
FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法
拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点
关于fart源码的调用流程可以看看我以前整理的一篇文章
fart的理解和分析过程
简单总结:
这是一个基于主动调用来脱抽取壳的方案。
简述实现原理:
在进程启动的时候通过 ...
类加载器
双亲委派
就是加载类的时候,先交给自己的父类来加载,然后父类看自己是否也有父类,有的话,也转交给父类,一直到最顶端的类,如果最顶端的类加载失败,再一层层的由子类来加载,直到加载成功。
classloader的继承关系
InMemoryDexClassLoader:从内存中加载dex。android7.0以后才有的
PathClassLoader:一般没加壳的app会用这个来加载类
DexClassLoader:一般加壳保护的app会用这个或者自定义ClassLoader来加载类
BaseDexClassLoader可以获取所有DexFile,详细获取途径:DexPathList pathList -> Element[] dexElements -> DexFile dexFile;
DexFile可以通过getClassNameList获取到所有的类名。
使用这个方式遍历出来的所有类名比frida的遍历类名的结果更加完整。因为frida是遍历出加载了的数据。这里把没有加载的dexfile的所有类名也都打印了。
但是这里只是获取BaseDexClassLoader的所 ...
dex起步探索
部分内容摘自:android软件安全权威指南:丰生强
从根源上搞懂基础的原理是很有必要的,这样有助于我们更方便的利用它的特性,达到我们的目的。
我把内容主要分为二个部分。原理探索、案例分析
原理探索dex文件我们在正向开发app编译时,编写的java代码,会编译成java字节码保存在.class后缀的文件中。然后再用dx工具将java字节码转换成dex文件(Dalvik字节码)。在转换的过程中,会将所有java字节码中的所有冗余信息组成一个常量池。例如多个class文件中都存在的字符串”hello world”。转换后将单独存放在一个地方,并且所有类共享。包括方法的签名也会组成常量池。我们将编译好的apk文件解压后就能拿到classes.dex文件。
dex文件格式1、DexFile结构上面拿到的classes.dex文件包含了apk的可执行代码。Dalvik虚拟机会解析加载文件并执行代码。只要我们了解这个文件格式的组成,那么就可以自己解析这个文件获取到想要的数据。
首先是安卓源码中的dalvik/libdex/DexFile.h这里可以找到dex文件的数据结构。下面贴上源码部 ...
android基础篇三(笔记)
这里主要是看书的笔记。从基础开始。不断记录。直到啃完这本书(android软件安全权威指南:丰生强)
常见的android文件格式(2)AndroidManifest.xml存放了apk的大量配置信息,包括软件名称、图标、主题、包名、组件配置。
所有配置都属于manifest标签,与程序配置相关的属于android标签。
android:allowBackup=true允许系统在进行备份操作时,备份程序的应用数据,比如在终端执行adb backup命令。对安全敏感的情况要设置为false
android:supportsRtl=true让apk支持rtl(right-to-left)视图。targetSdkVersion必须在17及以上。
AXML文件格式AndroidManifest.xml在编译成apk前是明文的。编译成apk的时候,会把这个文件编译成二进制格式的文件。解压了再打开这个文件,就是乱码的。这个文件就是AXML格式。
AXML文件修改有些加固厂商利用android系统解析AXML的漏洞,在编译APK时构造畸形的AXML。导致apktool之类的工具不能正常工作,就需 ...
android基础篇二(笔记)
这里主要是看书的笔记。从基础开始。不断记录。直到啃完这本书(android软件安全权威指南:丰生强)
常见的android文件格式1、jar包就是一个zip格式的压缩包,里面是编译后的java字节码class文件集合。所以jar文件常叫作jar包。有些安全较高的jar包会对包含的class文件进行签名。并且把签名信息保存在META-INF目录。静态分析可以使用jd-gui。动态分析可以使用AspectJ。
2、aar包aar是android studio的全新的库文件格式,除了可以包含代码,还可以包含任何开发中使用的资源数据。实际上也是一个zip包格式。目录结构和apk文件类似。
3、apk文件结构AndroidManifest.xml:编译好的AXML二进制格式文件。
META-INF:apk的签名信息
classes.dex:程序的可执行代码。开区MutiDex会有多个dex
res:程序中使用的资源文件
resources.arsc:编译好的二进制格式的资源信息
assets:如果使用asset系统来存放raw资源。所有资源都将保存在这里
3.1、apk文件的生成流程adt时 ...
菜鸟学飞之frida整合怪
入行两年了,从刚开始的丝毫不懂。到现在的蹒跚学步,可谓是一步一个脚印走过来的。当然现在依然还是菜鸟一只。但是比起两年前茫然不知学习方向来说,现在有了明确前进的目标,只要不停下脚本,终有一天能飞上枝头成为合格的老鸟。下面整理了一些我的学习方式。希望能够帮到和曾经的我一样茫然的萌新。
1、阅读书籍最核心的基础大多是在书中有详细的介绍。看书一般不是只读一遍。我个人的方式是先大致的过一遍,每页都粗略的翻一遍,过完一遍就能大概知道哪些内容以自己目前的知识量,很难看明白,哪些是自己熟悉但是却理解不深的。然后第二遍才开始细翻,暂时跳过很难读懂的,先做个标记,以后知识面广了。再回过头来看。简单推荐几本《android软件安全权威指南》、《android应用安全防护和逆向分析》、《深入理解android java虚拟机ART》、《深入理解计算机系统》
2、论坛很多大佬都会发些实战的帖子。还有一些工具的使用。还有各种经验之谈。看书相当于是闭门造车,单靠自己的摸索的路是非常艰难的。站在巨人的肩膀上才能前进的更快。我最早先啥也不懂。就是看着大佬们的帖子渐渐入门。然后慢慢的才能看的懂书籍。
3、培训我经历过 ...
android基础篇一(笔记)
这里主要是看书的笔记。从基础开始。不断记录。直到啃完这本书(android软件安全权威指南:丰生强)
反编译和回编android最常用的反编译工具apktool。可以跨平台win、linux、maos。用来反编译apk文件,反汇编成smali代码。然后可以修改smali代码后。再用apktool重新编译回apk,再签名。就可以直接安装了。贴上github地址:https://github.com/iBotPeaches/Apktool
mac可以直接brew install apktool安装
反编译命令:apktool d ./app-debug.apk -o outdir
反编译后,得到若干文件。res下面是资源文件,smali下面是代码。字符串资源一般在res\values\strings.xml,也有可能硬编码进源码。在apk中。这个字符串资源被加密存储为resources.arsc存放。反编译才解密出来成strings.xml的。
在正向android开发的时候。字符串资源都在gen/R.java中,而且每个字符串都有个对应的索引。反编译后,这个对应的索引放在publi ...
使用unidbg还原标准ollvm的fla控制流程平坦化
最近网上查了查还原平坦化相关的资料。看了无名侠大佬的文章。由于本人太菜了。好多地方看的有点懵懵懂懂的。最终还是自己摸索着尝试还原平坦化。写的哪里不对。还请大佬指正。
先贴上几位大佬的文章
[ARM64 OLLVM反混淆][https://bbs.pediy.com/thread-252321.htm]
[利用符号执行去除控制流平坦化][https://security.tencent.com/index.php/blog/msg/112]
翻阅过大佬的文章后。本菜菜得到两个简单的结论。
一、fla主要功能是将if else这类的逻辑给转换成while+switch组合来处理。达到将简单的逻辑给复杂化,增加静态分析难度的目的。
二、模拟执行找出真实块之间的关联,patch修改相应的代码。直接将真实块关联起来,从而实现反混淆
接下来。我将采用先射箭后画靶的方式。来逐步的还原一个标准的ollvm fla的案例。
首先是准备我们的案例,如下是未混淆前的源码
1234567891011121314151617181920std::string calcKey(std::string data ...