随笔分类 - android逆向
摘要:## 函数虚拟化 函数虚拟化保护和函数混淆保护整体思路差不多,将函数划分为若干个基本块。之前每一个基本块的代码是替换为等效花指令混淆,虚拟化的话就是将原有指令进行翻译,用自定义虚拟机去解释执行。 每次进入虚拟机执行前先保存寄存器环境  so文件被加固后`pro
阅读全文
摘要:UnCrackable-Level1 第一题是一个纯java层逆向,首先程序会进行root和debug检测。 root检测就是通过检测su等文件和Build.TAGS是否包含test-keys。因为我的机子是自己编译的userdebug版本,所以会被检测到root,frida直接hook检测函数并返
阅读全文
摘要:此app为猿人学2020年的赛题,需要得到0-99所有id值对应的返回结果之和。抓包查看到接口为/api/match/11/query,参数是id值以及sing值,返回数据就是id值对应的data值。 反编译apk得到发起请求的函数为query,其调用getSign1以id值为参数生成sign值,o
阅读全文
摘要:去混淆思路 先找到函数中所有的基本块 确定状态变量是保存在宿主寄存器中还是栈中(局部变量) 观察判断控制块的特点,将所有控制块剔除。剔除之后基本块中还包含真实块(如果不存在虚假控制流) 确定各个真实块的执行路径,即一个真实块能跳转到哪几个块(1/2个块),通常通过unicorn模拟执行或者angr符
阅读全文
摘要:对于自定义linker加固so而言,为了防止整体dump并对修复重定位表的脱壳方式(upx的脱壳),可以将一些重要的结构信息在内存中进行抹去和移动。 抹去 ELF文件头在so文件加载后就不需要使用了,所以可以在加载完so文件后直接将其抹去。 .rel.plt/.rela.plt和.rel.dyn/.
阅读全文
摘要:其实自实现linker加固so与之前研究windows平台的PE文件的加密壳原理很相似。主要就是自定义文件格式加密so,然后壳代码实现将加密的so文件加载,链接重定位并修正soinfo(三部曲)。 自定义文件格式 格式可以自己定义,只要在壳代码加载so时能够知道正确的格式就可以,下面是对标准的ELF
阅读全文
摘要:自定义linker加固so是主流的加壳方式,通过实现linker程序来加载,链接加固后的so文件。最后为了让加固后的so中的代码能与其他模块交互,需要修正壳(自定义linker)的soinfo为加固so。我在编写自定义linker代码时,在将加固的后的so加载,链接和修复soinfo后尝试通过dlo
阅读全文
摘要:# ELF可执行文件脱壳 使用upx对ELF文件进行加壳,加壳后的文件不包含动态链接信息,也就是说加壳后的可执行文件是一个纯静态链接文件。对于纯静态链接的可执行文件而言,linux内核在将此elf文件加载到内存后会直接修改应用层入口为此elf文件的入口函数,不再需要动态链接器的参与。 并提供了和xposed一样的接口API进行兼容,同时lsposed本身是一个基于magisk的riru/zygisk
阅读全文
摘要:修改rom 通过修改android源码自定义脱壳机,选择合适的时机通过主动调用加载apk中的类,然后再挑选合适的时机对dex文件进行dump。 主动调用 当一个app启动的时候会调用handleBindApplication函数,此函数会调用Application的attachBaseContext
阅读全文
摘要:dalvik JIT(Just-In-Time) JIT即时编译,即在代码运行时进行编译。对于dalvik虚拟机而言其检测到执行频率较高的函数时就会进行jit编译将其编译为本地机器码,这样下次此函数执行的时候就会直接执行编译后的机器码,编译后的机器码只存在于内存中并不会以文件的形式保存,app重启后
阅读全文
摘要:dex文件的热修复方法有很多,例如通过类加载器或者偏底层的实现通过修改ArtMethod。这里只分析基于类加载器的dex热修复原理,实际dex插件化的原理和热修复的原理也有类似之处。 dex热修复原理 android虚拟机中每一个classloader类加载器都有一个对应的DexPathList类,
阅读全文
摘要:还是以通过dlopen获取libart.so句柄为出发点,由于android 7.0之后的链接器命名空间限制包括libart.so的一些私有库被限制访问。(源码分析基于android 10.0.0_r7) 应用进程类加载器的命名空间初始化 在应用程序对应的可执行文件app_process根据/sys
阅读全文
摘要:二代壳加壳apk在实现函数抽取的时候需要选择合适的时机进行抽取代码的回填,一般选择在LoadMethod函数中即函数被加载前。所以需要通过inline hook libart.so的LoadMethod函数,前提是需要得到libart.so的模块基地址并得到LoadMethod函数的地址。如果直接在
阅读全文
摘要:android 7.0加入了对私有系统so库API调用的限制(因为私有系统库会在任意时刻更新,使用这些系统库的应用有可能会在更新后崩溃),android 8.0引入了project Treble实现框架与供应商解耦合(解决系统碎片化,升级慢),这都需要依赖链接器命名空间机制。这里主要关注的重点是链接
阅读全文
摘要:# xposed原理 * zygote进程是android系统第一个java进程,其他所有的apk进程都是通过zygote进程fork的。xposed是一个hook框架,其通过修改zygote进程的native层代码和java层代码在zygote进程启动时将xposed框架使用的jar包(Xpose
阅读全文
摘要:因为xposed已经停止更新,高版本的android可以使用他的改良版lsposed,开发环境和xposed一致, 首先需要安装magisk + zygisk + lsposed. xposed开发环境 导入xposed模块开发使用的jar包 通过设置jcenter (未成功) 设置app的buil
阅读全文