参考文章:

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刷回去就可!







 

浅谈android反调试之轮询TracePid(解决方案是特色)的更多相关文章

  1. 浅谈android反调试之 API判断

    反调试:利用Java层API来判断Android程序是否是处于被调试下. 1.直接调用系统的android.os.Debug.isDebuggerConnected()方法 我们进行动态调试的时候,其 ...

  2. 浅谈android反调试之 转发端口

    反调试方案: 我们最通常使用的动态工具是IDA, IDA的动态调试端口默认为23946,我们可以通过/pro/net/tcp 查看android 系统所有TCP Socket 启动android_se ...

  3. 浅谈Android反调试 之 PTRACE_TRACEME

    反调试原理: 关于Ptrace:  http://www.cnblogs.com/tangr206/articles/3094358.html ptrace函数 原型为:     #include & ...

  4. 浅谈android反调试之 签名校验

    反调试原理 很多时候,我们都需要进行修改修改应用程序的指令,然后重打包运行,重新打包就需要充签名. 利用签名的变化我们用于反调试.反调试实现代码如下: 为了更加隐藏,比较函数可能在SO层进行实现,如下 ...

  5. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  6. 浅谈android代码保护技术_ 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

  7. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆   代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...

  8. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  9. 浅谈Android应用性能之内存

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...

随机推荐

  1. cv2.solvepnp 相机的位姿估计

    预备知识   图像坐标系:   理想的图像坐标系原点O1和真实的O0有一定的偏差,由此我们建立了等式(1)和(2),可以用矩阵形式(3)表示. 相机坐标系(C)和世界坐标系(W): 通过相机与图像的投 ...

  2. springboot 内置tomcat maxPostSizs 无法设置

    ++++++++++++++++++ RT +++++++++++++++++ 如下代码方可解决: /** * tomcat配置类 * 解决post数据体大于2048kb无法接收问题 * 解决tomc ...

  3. 直接用bcdedit创建bootmgr数据库和修复启动菜单

    直接用bcdedit创建bootmgr数据库和修复启动菜单 使用下面方法之前需要bcdedit和bootsect两条命令,这两条命令可以到vista或者windows 7安装光盘上获得.bootsec ...

  4. Oracle 数据库常用SQL语句(2)查询语句

    一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...

  5. nodejs开发过程中遇到的一些插件记录

    1.chalk Github:https://github.com/chalk/chalk   终端样式定制插件,可自定义输出日志的样式. 1.semver   管网:https://semver.o ...

  6. python中字典的‘增、删、改、查’

    python 字典的'增.删.改.查' 用 ipython 运行情况如下: #新建字典 In [1]: infos = {'name':'dongge','age':18} In [2]: infos ...

  7. Applied Nonparametric Statistics-lec3

    Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/4 使用非参数方法的优势: 1. 对总体分布做的假设 ...

  8. CodeForces - 899E Segments Removal (优先队列 + 链表)

    给定一个序列,每次从序列中找一个长度最大的元素相同的片段,删除它. 如果长度相同,删除最靠左边的那个片段. 问,需要删几次. 用链表处理删除片段.对于删除之后两边又能连成一个片段的那种情况,用set记 ...

  9. Java技术——Java反射机制分析

    )生成动态代理. 2. Java反射API 反射API用来生成在当前Java虚拟机中的类.接口或者对象的信息. Class类:反射的核心类,可以获取类的属性,方法等内容信息. Field类:Java. ...

  10. No identifier specified for entity: XXXX 错误

    在运行项目的时候报了下面的错误: by: org.hibernate.AnnotationException: No identifier specified for entity: com.exam ...