android 修改 dpi_逆向修改手机内核支持调试、过反调试

9f98d5ef49d08d22a7c82647f61e8a47.png

逆向修改手机内核支持调试、过反调试

前言

b7b5a89f63b8a16d55e48f8f230aa229.png

当下,移动互联发展尤为迅速,还记得几年前大家还用着翻盖、滑盖、按键手机,如今按键越来越少,屏幕越来越大,功能越来越多,现在你可以没有电脑,但是你一定不会没有手机,移动安全暗地里发展的更为迅猛,没有人可以停滞不前……

1、Android下常见反调试

0x1Java层反调试

0x2self-debugging反调试

0x3轮训检测反调试

轮训检测反调试原理

读取进程的/proc/[pid]/status文件内的TracerPid字段的值判断当前进程或线程是否正在被调试

status文件信息字段:

(1)Name:进程名

(2)State:表示进程状态

(3)Tgid:线程组ID,一般指进程名

(4)Pid:线程ID,它的值和gettid函数的返回值相等

(5)PPid:父进程的进程ID

(6)TracerPid:实现调试功能的进程ID,值为0 表示当前进程未被调试

我们以调试模式启动一个应用看下

5c77ddda6cad728c678a5789b513232c.png

我们用IDA附加后再看,TracerPid的值就是调试的进程PID

3bbc3316ae0e904a09d37282d428ab35.png

0x4反 反调试思路

0x01动态调试时修改TracerPid字段值为0

0x02修改内核,让TracerPid字段值永远为0

为了一劳永逸,本文将探讨修改内核的过反调试方法

0x5而修改内核分为两种:

0x01下载Android源码自己修改后编译

0x02逆向Android内核修改刷机

自己修改Android源码编译请参考https://bbs.pediy.com/thread-213481.htm

因为现在一般手机都是厂商定制的系统,所以本文将探讨逆向修改手机内核来达到过反调试的目的

2、下载android4.4.4源码分析

0x1下载

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git

28d1401b5dd5754458bc0f11f06578c1.png

git branch -a

272898c76254ea8bbcca3bc1149034d9.png

git checkout remotes/origin/android-4.4

890f230ef95ff2978c0dae0d1631fc16.png

大致目录如下

39139e7a846df215f6b5d87b8bc17ad8.png

0x2分析

f7de2833a54534e4391b13eb27eab535.png

发现TracerPid的值来自于tpid

Tpid来自于task_pid_nr_ns

4109d2f398bebc581b26776c0047bc3d.png

发现是proc_pid_status调用了task_state,还记得我们是怎么读取进程的吗

Cat /proc/[pid]/status

所以函数proc_pid_status调用了task_state函数,在task_state内联函数里面通过函数task_pid_nr_ns 获取到TracerPid并且打印出来

3、提取内核

0x1确定位置

Cd /dev/block/platform/

Cd /dev/block/platform/7824900.sdhci/

Cd /dev/block/platform/7824900.sdhci/by-name

Ls

ls -l /dev/block/platform/7824900.sdhci/by-name

1b439457d5e5a015deb88474c3e66c9a.png

lrwxrwxrwx root root 1973-05-20 16:10 boot -> /dev/block/mmcblk

0p25

0x2提取内核

dd if=/dev/block/mmcblk0p25 of=/data/local/tmp/boot.img

fa7a9ded930ae89975c50b0de5eeda13.png

root@gucci:/data/local/tmp # chmod 777 boot.img

adb pull /data/local/tmp/boot.img E:boot.img

0x3解包内核

使用bootimg解包boot.img

7537cdbd3f9432ee57a94339412805ad.png

查看解压出来的文件

b9588748308772ec28cd66e63ec161cd.png

4、修改内核支持调试 ro.debuggable

initrd/default.prop文件

c8102787994cb87ecd6a973384f31139.png

ro.debuggable=0改为ro.debuggable=1

5、修改kernel文件

0x1定位函数修改指令法

复制一份kernel为zImage.gz

e65bd256a0aec62c167086f200a401f3.png

查找十六进制1F 8B 08 00,删除前面的所有数据,使文件变成一个标准的gzip压缩文件

4bf3ca6edbcc973409d838c8382d92ca.png

解包的zImage就是内核二进制文件

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

7f5b04300c7af9e2206b7d8bacaf0ce1.png

设置ROM 起始地址和加载地址填0xc0008000

e22cdf58dc32189870cfbd6adb3a95fb.png

在安卓root权限前提下,关闭符号屏蔽

echo 0 > /proc/sys/kernel/kptr_restrict

1956b6f5992dad6d0ef4b590f18df370.png

查看proc_pid_status函数地址

cat /proc/kallsyms | grep proc_pid_status

c0235ef8 T proc_pid_status

ff45cd88cc07ee4458c1ae5e81f27fde.png

查看__task_pid_nr_ns函数地址

cat /proc/kallsyms | grep __task_pid_nr_ns

c0135d98 T __task_pid_nr_ns

d48c1af273b7722a2736f726245ef9f7.png

复制函数地址,在IDA中按G跳转

如果出现这样的情况,可以右键,转换为C代码

a4e38b6ce56f6cfdd410a25aa8d30a4d.png

按G去c0235ef8,没有解析函数名,可按下P键强制解析函数 sub_C0235EF8 (proc_pid_status)

a09988b43d0676186eb16d1346d5229d.png

按G去c0135d98(task_pid_nr_ns),右键,交叉引用列表 搜索 sub_C0235EF8

bd69ea5c2423a8d570336828f4392097.png

204490d303d9b803e0936eb83566bad7.png

然后修改指令让TracerPid字段值为0

不过不推荐这种方法,一个是对新手有难度,一个是哪怕同厂商的手机硬件和系统都有差别,不是很通用

0x2修改输出字符法

shift+f12,搜索TracerPid

8270971f432763471b6c854b3d75ff76.png

双击进去

f0e0ca1f1f8b4862302169b33f3ee996.png

ROM:C0B57A23 DCB "TracerPid:",9,"%d",0xA

我们可以把TracerPid那一项的占位符%d,改成'0'

因为'%d'是两个字符,所以我们可以改成'00',或者'0t'

0x C0B57A23 - 0xC0008000 = 0xB4FA23

010Editor打开zImage文件,Ctrl+G跳转到0xB4FA23处

f5fdf478db7497c95c2b9741bd6e6c4a.png

'0t'对应的十六进制就是:30 09,修改25 64为30 09

e0b0f26a52bce8e3064fa9d3a3ed62c9.png

重新打包成boot.img文件

将修改后的zImage在Linux下用gzip压缩一下

d11c63f9c206fa25a0b8e34144395b75.png

gzip -n -f -9 zImage

891c0ce3d46482575460fb6ed27b5660.png

同时打开原kernel文件和压缩好的zImage.gz,在zImage.gz中搜索1F 8B 08 00

29427f92098bc27b5fa9d665f737e8ff.png

0x40EB

0906c5334b5175db40e087c11f29dc3f.png

0x6043F6

zImage.gz结束位置 + kernel中的1F8B0800位置 = 结束位置

0x6043F7 + 0x40EB = 0x6084E2

全选zImage.gz,从kernel中的1F8B0800位置替换到0x6084E2位置

6d9eca6e2ea76558829533a488e145c7.png

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

Bootimg --repack-bootimg

3b2bba7155b59956ec924ef4655a4115.png

6、刷入新的内核

0x1手机重启到bootloader模式

adb reboot bootloader

bf86456cdc9139732204360573b71f17.png

0x2刷入新的boot

fastboot flash boot boot-new.img

5a6c106a6228b7538ecec47c8a5e118d.png

0x3重启

fastboot reboot

8142ad1d63ea24ddef0243f7faa0c9fa.png

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

fastboot flash boot boot-old.img

7、验证是否成功

0x1是否不显示包名

fdd47061b03fab6f8bd223e12d512b19.png

0x2是否调试时不为0

66999d89d2e11ead9986d2d7756f97f7.png

本文写自戊戌狗年,本文只在Sec圈子和本专栏投稿。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值