隐藏exit,ptrace etc.

C示例

#include <sys/ptrace.h>
#include <stdio.h> int main()
{
int r;
asm volatile (
"mov r0, #0\n\t" /* PTRACE_TRACEME */
"mov r1, #0\n\t"
"mov r2, #0\n\t"
"mov r3, #0\n\t"
"mov r7, #26\n\t"
"svc #0x00000000\n\t"
"mov %[result], r0"
: [result] "=r" (r)
:
:
);
printf ("Ptrace result : %d\n", r);
test(); while (1);
return 0;
} void test()
{
int r = ptrace (PTRACE_TRACEME, 0, 0, 0);
printf ("ptrace ret : %d\n", r);
}

运行结果

root@hammerhead:/data/local/tmp # ./a.out
Ptrace result : 0 #asm执行成功
ptrace ret : -1 #ptrace失败,因为已经被attach
root@hammerhead:/ # ps |grep a.out
ps |grep a.out
groot 17282 17273 732 72 00000000 000083cc R ./a.out root@hammerhead:/ # cat /proc/17282/status
cat /proc/17282/status
Name: a.out
State: R (running)
Tgid: 17282
Pid: 17282
PPid: 17273
TracerPid: 17273 # PTRACE_TRACEME,被父进程跟踪,17282 <- 17273
Uid: 0 0 0 0
Gid: 0 0 0 0

汇编代码比对

.text:0000838C        EXPORT test
.text:0000838C test
.text:0000838C
.text:0000838C var_8 = -8
.text:0000838C
.text:0000838C STMFD SP!, {R11,LR}
.text:00008390 ADD R11, SP, #4
.text:00008394 SUB SP, SP, #8
.text:00008398 MOV R0, #0 ; request
.text:0000839C MOV R1, #0
.text:000083A0 MOV R2, #0
.text:000083A4 MOV R3, #0
.text:000083A8 BL ptrace @ 可进行elf GOT Hook
.text:000083AC STR R0, [R11,#var_8]
.text:000083B0 LDR R3, =(aPtraceRetD - 0x83BC)
.text:000083B4 ADD R3, PC, R3 ; "ptrace ret : %d\n"
.text:000083B8 MOV R0, R3 ; format
.text:000083BC LDR R1, [R11,#var_8]
.text:000083C0 BL printf
.text:000083C4 SUB SP, R11, #4
.text:000083C8 LDMFD SP!, {R11,PC}
.text:000083C8 ; End of function test

没有ptrace调用, anti - GOT hook

.text:00008344 main         ; DATA XREF: _start+50
.text:00008344 ; .got:main_ptr
.text:00008344
.text:00008344 var_8 = -8
.text:00008344
.text:00008344 STMFD SP!, {R11,LR}
.text:00008348 ADD R11, SP, #4
.text:0000834C SUB SP, SP, #8
.text:00008350 MOV R0, #0
.text:00008354 MOV R1, #0
.text:00008358 MOV R2, #0
.text:0000835C MOV R3, #0
.text:00008360 MOV R7, #0x1A
.text:00008364 SVC 0 @ 通过svc中断调用,无法Hook
.text:00008368 MOV R3, R0
.text:0000836C STR R3, [R11,#var_8]
.text:00008370 LDR R3, =(aPtraceResultD - 0x837C)
.text:00008374 ADD R3, PC, R3 ; "Ptrace result : %d\n"
.text:00008378 MOV R0, R3 ; format
.text:0000837C LDR R1, [R11,#var_8]
.text:00008380 BL printf
.text:00008384
.text:00008384 loc_8384 ; CODE XREF: main:loc_8384
.text:00008384 B loc_8384
.text:00008384 ; End of function main

arm svc的更多相关文章

  1. Linux Kernel中断子系统来龙去脉浅析【转】

    转自:http://blog.csdn.net/u011461299/article/details/9772215 版权声明:本文为博主原创文章,未经博主允许不得转载. 一般来说,在一个device ...

  2. Linux最小系统移植之早期打印CONFIG_DEBUG_LL

    一.几个关键宏定义 CONFIG_DEBUG_LL. CONFIG_DEBUG_LL_INCLUDE 容我慢慢道来, 首先要使能早期打印, menuconfig必须选中CONFIG_DEBUG_LL, ...

  3. ARM 中断状态和SVC状态的堆栈切换 (异常)【转】

    转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SV ...

  4. ARM CPU的SVC模式

    关于ARM CPU模式中的SVC Arm中CPU的模式 [第一方面] 系统sys模式 VS 管理svc模式 首先,sys模式和usr模式相比,所用的寄存器组,都是一样的,但是增加了一些访问一些在usr ...

  5. ARM概论(Advanced RISC Machines)

    简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...

  6. arm工作模式笔记

    linux用户态程序即应用程序,在user模式 linux内核运行在svc模式 arm七个模式: usr用户模式 fiq快速中断模式 irq普通中断模式 supervior   svc模式 abort ...

  7. ARM处理器解析

    按图分析: ARM处理器有七种工作模式,为的是形成不同的使用级别,以防造成对系统的破坏.不同模式可以访问的寄存器不同,可以运行的指令不同. (1)user(10000):普通应用程序运行的模式(应用程 ...

  8. 2.2 ARM处理器工作模式

    ARM Architecture Reference Manual Arm 指令框架手册 种工作模式 Processor mode Mode number Description User usr 0 ...

  9. ARM体系结构

    工作模式_ufisaus USR(User) :正常程序的执行状态 FIQ(Fast interrupt) :用于高速数据传输和通道处理 IRQ(Interrupt) :通常的中断处理 SVC(Sup ...

随机推荐

  1. python模块安装注意事项

    在安装python的第三方模块时,需要注意路径问题. 1.如果python是按默认位置安装的,则可以直接在命令提示符中进行安装,即pip install module_name. 2.如果python ...

  2. ReactiveCocoa入门教程--第二部分

    翻译自:http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使 ...

  3. servlet/和/*匹配的区别

    两者真正的区别是,两者的长度不同,根据最长路径匹配的优先级,/*比/更容易被选中,而/的真正含义是,缺省匹配.既所有的URL都无法被选中的时候,就一定会选中/,可见它的优先级是最低的,这就两者的区别.

  4. php composer 使用 以及 psr0和psr4的真正区别

    composer 使用 项目和库之间唯一的区别是,你的项目是一个没有名字的包 包名不区分大小写,但惯例是使用小写字母,并用连字符作为单词的分隔 入门比较好资源: 官网适合读一遍  https://do ...

  5. Mysql 用户ip访问根据省份查询

    表名:shop_interview_customer 表结构:customerId空为游客模式 interviedId customerId interviewIP iPdetail 1 1001 1 ...

  6. 服务消费和负载(Feign)

    Spring Cloud Feign Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口 ...

  7. Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)

    本篇项目地址,名字是AudioRecord录音(能暂停,将pch转换为wav),求starhttps://github.com/979451341/Audio-and-video-learning-m ...

  8. jsp自定义标签开发

    参考:http://blog.csdn.net/lw001x/article/details/7589302

  9. Oracle 11gR2 Database UNDO表空间使用率居高不下处理

    一.UNDO表空间监控图 Prometheus监控的到UNDO表空间使用率超过90%(90%为所有表空间告警阈值).从图中可以看到,多次增加UNDO表空间的DATAFILE,UNDO表空间达到40GB ...

  10. 深入理解java虚拟机---对象的创建过程(八)

    1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下 ...