Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 566|回复: 0

浅谈android反调试之轮询TracePid(解决方案是特色)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-9 16:25:36 | 显示全部楼层 |阅读模式
    参考文章:
    1.   http://bbs.pediy.com/thread-207538.htm


    需求:

    常见的Android 反调试方案其实并不多, 就那么几种, 其中一种方案通过轮训TracePid,  具体实现如下:
     
    对于这种非反调试,我们通常的做法是这个找到这个轮训线程,通过修改代码,不让这个运行,或者还有其他做法。 但是这些做法都需要我们去分析代码, 修改代码。 时间是宝贵的, 如何节省这些时间,让我们把更多的经历投放到程序的逻辑分析。 
    试想一下,加入我们手机本身具有对这个反调试的抗体的话,我们就可以节省时间啦。

    反反调试原理&&实现

    如何让我们的手机具备这样反调试的抗体呢,试想一下tracepid 调试的状态下,tracePid 仍然为0, 不就OK了!!!
    我们需要修改手机内核内部的逻辑, 如果自己拥有内核源码,就可以自己编译生成zImage去替换内核就能正常运行了,但可惜的是,很多手机的内核都不开源,只有Google手机的内核,为此只能自己去逆向修改。
    难点: 
    1. 如何从手机中提取内核代码
    2.找到关于tracePid的逻辑
    3.修改后,把修改的内核置换到手机


    提取内核代码

      1. 首先你得有一部root过的Android手机,   笔者用的公司里的测试机Lenvorn KT-30  先去找到系统boot的文件位置,这个路径一定要和具体设备相关。 boot的文件位置 /dev/block/platform/[每个设备目录不一样]/by-name ;其中platform目录中的子目录因为每个设备都不一样,所以需要注意,查看自己设备目录名称,
     2. 然后进入到by-name之后,使用  ls -l  命令查看详情,找到一项BOOT,记住link的路径地址,这里是/dev/block/mmcblk0p22 这里可能有人会遇到一个问题就是,看到多个BOOT,比如BOOT1,BOOT2,这里可以选择BOOT即可,也有的人会发现没这个选项,那么只能在刷个其他系统进行操作了
     3. 然后使用命令 将boot文件导出为boot.img

    修改TracePid设置逻辑的代码

      1. 我们已经从root过的手机提取出手机内核, 我们不能直接对boot.img 文件进行逆向分析, 因为这个文件是一个img文件,文件结构如下:

     2.我们使用bootimag工具解压boot.img文件。 其实这些工具原理很简单,就是解析boot.img文件格式罢了,因为boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分):
     解压文件结果如下:
    解压之后有一个kernel文件,这个就是内核文件,而ramdisk.gz就是释放到设备目录内容,也就是initrd目录,进入查看内容:

    看到了吧,这就是最终设备的目录结构,可以看到这里有init.rc启动文件,default.prop配置文件等
     
    3. 接下来我们就要对kernel内核文件进行特别处理了:将kernel文件复制为文件名为zImage.gz的文件,并使用010Editor工具,Ctrl+F快捷键查找十六进制内容1F 8B 08 00,找到后把前面的数据全删掉,使zImage.gz文件变成标准的gzip压缩文件,这样子就可以使用gunzip解压了。命令:gunzip zImage.gz;这时候获取到了解压之后的zImage才是我们要处理的最终文件。


    4. IDA打开zImage内核文件进行修改, 有了上面一步得到的内核文件zImage,直接使用IDA打开,但是打开的时候需要注意设置选项:

    然后设置开始地址为0xC0008000:这里为什么要设置成这个起始地址,因为Linux启动内核的地址为0xC0008000

    5. 打开之后,我们可以直接shift+F12,查看字符串内容,因为我们想改TracerPid值,所以直接搜字符串”TracerPid”值 双击进入,这时候我们可以记下这个地址,然后减去刚刚我们那个偏移地址0xC0008000:

    查看字符串引用代码,
     找到这个参数的指令: mov R7, R0 :   经本人分析得到的修改方法是把MOV R7, R0替换为MOV R7, #0,机器码为00 A0 A0 E3,指令的文件偏移为(C022EBE8 - C0008000)
    至少,内核文件修改成功
       
     

    刷回手机

    刷回前需要先打包boot.img文件
    1.使用命令压缩成z.gz:gzip -n -f -9 zImage
    2.使用010editor将z.gz的二进制数据覆盖到原zImage文件的1F 8B 08 00处的位置(新的z.gz文件必须比原z.gz文件小,并且回写回去时不能改变原zImage文件的大小及修改原zImage文件后面的内容,否则会很麻烦),这时得到了zImage文件。

    3.刷机boot.img文件.这里有一个坑,在刷机的时候用到的是fastboot命令,但是遇到最多的问题就是这个错误:

    这个是因为设备还没有启动fastboot,关于每个设备启动fastboot不一样操作,比如小米是电源键+音量减,三星是音量减+HOME键+电源键;具体设备可以自行网上搜索即可。到了fastboot界面再次运行fastboot就可以了: fastboot flash boot boot-new.img

    然后在运行fastboot reboot重启设备即可。有的同学在操作的时候,始终进入fastboot失败,导致fastboot命令运行错误,这个真解决不了那就换个手机试一下吧。这时候我们启动设备,然后调试一个app,发现他的TracerPid值永远都是0了,因为我之前将TracerPid改成’00’字符串了,也是可以的:

    因为感觉不正规,所以就有重新改成了’0\t’值了。都是可以的。

    注意:一定要保存原始提取的内核文件boot.img,当你把设备弄成砖头启动失败的时候,可以在把这个原始的boot.img刷回去就可!









     




    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-11 21:03 , Processed in 0.061889 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表