逆向手机内核,添加调试支持和反调试

0x00前言
  一个安卓应用可以被调试的条件是应用AndroidManifest.xml显示指定android:debuggable="true",如果没有设置android:debuggable的值,则默认android:debuggable="false",所以发布的应用大部分都是不可调试的,如果要调试,则需要解包,改属性然后重打包,这样非常麻烦,而且效率低。第二个条件是内核配置文件default.prop的属性ro.debuggable=1,这样就不用管应用里面设置的属性了,看来是一个比较好的解决方案,我们只要修改一次内核就可以一劳永逸了。
  安卓应用程序常用的一种反调试手段是查看/proc/[pid]/status下的信息,如果处于调试状态,那么TracerPid的值就是调试进程的Pid,那么程序就会做出相应的行为来反调试。

0x01提取内核

查看boot所在的分区

ls -l /dev/block/platform/msm_sdcc.1/by-name

提取内核

dd if= /dev/block/mmcblk0p17 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img

解包内核

bootimg.exe --unpack-bootimg

解包之后的文件结构

0x02修改ro.debuggable

修改initrd/default.prop文件中的ro.debuggable=1

0x03修改kernel文件

复制一份kernel为zImage.gz方便后面的修改

用010editor打开zImage.gz查找十六进制1F 8B 08 00,删除前面的所有数据,使文件变成一个标准的gzip压缩文件,这样就可以使用gunzip解包了。

gunzip zImage.gz

解包生成的zImage就是内核二进制文件了。

用IDA打开文件,设置处理器类型为ARM Little-endian

设置ROM start address和Loading address为0xc0008000

在安卓root终端关闭符号屏蔽

echo 0 > /proc/sys/kernel/kptr_restrict

查看proc_pid_status和__task_pid_nr_ns函数地址

cat /proc/kallsyms | grep proc_pid_status

cat /proc/kallsyms | grep __task_pid_nr_ns

为什么要查找这两个函数呢,我们根据源码/kernel/msm/fs/proc/array.c来看一下

函数proc_pid_status内联了task_state函数,在task_state内联函数里面通过函数__task_pid_nr_ns 获取到tracerpid并且打印出来。

在IDA中按快捷键g跳转到函数c0187f88(__task_pid_nr_ns)函数处,按x出来引用搜索框,在其中找到函数c02764b8(proc_pid_status)

查看局部的调用为

可以看到调用的结果会存储在R11中,所以修改命令MOV R11, R0为MOV R11, #0,机器码为00 B0 A0 E3,文件的偏移为(0xC02765F8-0xC0008000= 26E5F8)

重新压缩zImage

gzip -n -f -9 zImage

用010editor添加原kernel的首部和尾部二进制数据到文件zImage.gz(新的zImage.gz文件必须比原zImage.gz文件小,并且回写回去时不能改变原kernel文件的大小及修改原kernel文件后面的内容,否则会很麻烦),这时得到了kernel文件。

添加首部3DEB长的数据

先占位,然后复制首部的数据到头部

添加尾部数据

替换原先的kernel文件,重新生成新的boot.img

bootimg.exe --repack-bootimg

0x04刷入新的内核

手机重启到bootloader模式

adb reboot bootloader

刷入新的boot

fastboot flash boot boot-new.img

重启

fastboot reboot

如果手机开不了机,那么重新刷回老的内核

fastboot flash boot boot-old.img

0x05SELinux导致IDA无法调试

在安卓端以root权限启动andorid_server之后,并在本机做端口转发,IDA可以正常列出可调试的应用列表,但是当选择某个程序的时候就会出现如下错误

The debugger could not attach to the selected process.

This can perhaps indicate the process was just terminated, or that you dot‘t have the necessary privileges.

关闭SELinux,之后就正常了,不知道是不是MIUI独家的问题。

检测SELinux是否打开

getenforce

返回值:Enforcing:强制模式  Permissive:宽容模式  Disabled:关闭

临时关闭SELinux

setenforce 0

0为关闭,1为打开,执行后立即生效,无需重启

0x06小结

  工欲善其事,必先利其器,有一个基本的调试环境对逆向学习是非常有帮助的。因为很多的手机产商没有将手机系统源代码放出,所以只能采取逆向内核的方式进行修改,如果手机厂商有把系统的源代码放出,那么从源码编译将会更具有修改性,可以定制更多的内核特性。如果手机有开源的安卓系统支持,比如lineage os或者CM的支持,也可以选择这些优秀的开源代码来编译。

参考:

逆向修改手机内核,绕过反调试

Android逆向之旅—应用的”反调试”方案解析(附加修改IDA调试端口和修改内核信息)

[原创]支持windows下打包boot/recovery.img的bootimg.exe,且支持自动解包/打包dt.img,加入MTK机型支持

Android反调试笔记

记录下android SELinux造成ida无法调试

时间: 2024-10-05 16:36:03

逆向手机内核,添加调试支持和反调试的相关文章

反调试-去除各种反调试

前不久破解一个软件的时候遇到了各种反调试,折腾的自己各种难受,最终爆破了之后感觉心情大快就顺手写下了这篇文章 使用工具 十六进制分析工具:winhex 查壳工具:PEID 脱壳工具:ollydump插件或者LordPE 脱壳修复工具:ImportREC 逆向工具:OllyDbg 分析过程 PE修复 打开源程序所在文件夹,发现有一个crackme,双机运行程序发现有这个提示: 应该是文件的PE结构被修改了,winhex载入分析发现: 果然是PE结构的问题,在DOS头后面的PE头的16进制应该为50

s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持

三.内核的移植 说明:针对的是百问网的jz2440 gcc:4.9.1 1.移植内核 首先,下载源码包:https://www.kernel.org/ 现在时间为2014年12月20日其主界面截图为: 在此,就在下较新的稳定的版本作为尝试.在这里有个命名问题需要说明一下,最前面的2.6或者3.18是主版本号码,后面的次版本号是比如2.6.32.65中的32,再后面的比如2.6.32.65中的65是升级版本号,主版本号为奇数的是开发本比如3.17,主版本号为偶数的为稳定版比如3.18,一般情况下名

fiddler手机抓包,支持前端代码调试

手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddler默认只抓取http格式的) 打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS, 勾选CaptureHTTPS CONNECTs,点击Actions, 勾选Decrypt HTTPS traffic和Ignore servercertificate

修改Android手机内核,绕过反调试

0x1.手机设备环境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 0x2.Android内核提取 查找Android设备的boot分区文件.高通芯片的设备可以通过下面的命令进行查找. cd /home/androidcode/AndroidDevlop/modifyNexus5Boot adb shell ls -al /dev/block/platform/msm_s

过反调试

重所周知,有破解就必有防破解,二者本为一体 破解技术就不要我多介绍了,下面我来介绍反调试技术 也就是所谓的防破解技术 反调试技术可以简单通俗的理解为:防止OD分析软件的技术,也就是反调试技术 那么反调试技术又有几种呢? 下面我介绍几种常用反调试技术 首先声明,下面有一部分内容来源百度,若有喷子觉得恶心,请自觉删除 1.       最常用的便是调用windows API 那么 windows API又如何检测OD呢?每一个API的作用是什么呢 2.       小编在百度上搜寻了一些文章来引用

[转载]Android应用方法隐藏及反调试技术浅析

本文转载自: http://drops.wooyun.org/tips/9471 0x00 前言 Android应用的加固和对抗不断升级,单纯的静态加固效果已无法满足需求,所以出现了隐藏方法加固,运行时动态恢复和反调试等方法来对抗,本文通过实例来分析有哪些对抗和反调试手段. 0x01 对抗反编译 首先使用apktool进行反编译,发现该应用使用的加固方式会让apktool卡死,通过调试apktool源码(如何调试apktool可参见前文<Android应用资源文件格式解析与保护对抗研究>),发

Xcode8支持ios7设备调试的方法

1.首先我们如果使用Xcode8新建的工程,默认支持的最低版本是iOS8,如果想支持iOS7 我们可以手动改动版本到7.0(自己在) Target添加 不支持真机调试 是因为 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 里面有类似这样的一些文件夹,如果这些文件夹中没有包含我们真机的系统,则不能进行真机测试.但是我们可以通过将相应的配置包添加入这个文件夹来解决问题: 下面给

android反调试之父子调试

普通进程反调试进程源码: #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/prctl.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ptrace.h> #define eprintf(...) fpr

Android逆向之旅---应用的&quot;反调试&quot;方案解析(附加修改IDA调试端口和修改内核信息)

一.前言 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了.但是有时候必须要借助动态调试方可破解,就需要进行操作了.现阶段反调试策略主要包括以下几种方式: 第一.自己附加进程,先占坑,ptrace(PTRACE_TRACEME, 0, 0, 0)!第二.签名校验不可或缺的一个选择,本地校验和服务端校验双管齐下!第三.借助系统api判断应用调试状态和调试属