我正在尝试使用ptrace
函数(不在shell中使用ptrace,我的意思是在代码中使用ptrace
)在ARM(Android armeabi-v7a)中跟踪系统调用。下面是我写的代码。
int trace(int pid)
{
struct pt_regs regs;
ptrace(PTRACE_SYSCALL, pid, 0, 0);
while(1)
{
// wait debugee process to stop
waitpid(pid, &status, 0);
ptrace(PTRACE_GETREGS, pid, 0, ®s);
// debugee process has stopped
if(WSTOPSIG(status) == SIGTRAP)
{
// check all register
fprintf(stderr, "ORIG_R0(%11ld), R0(%11ld), R1(%11ld), R2(%11ld), R3(%11ld), R4(%11ld), R5(%11ld), R6(%11ld), R7(%11ld), R8(%11ld), R9(%11ld), R10(%11ld), SP(%11ld), FP(%11ld), IP(%11ld), LR(%11ld), PC(%11ld), CPSR(%11ld)\n", regs.ARM_ORIG_r0, regs.ARM_r0, regs.ARM_r1, regs.ARM_r2, regs.ARM_r3, regs.ARM_r4, regs.ARM_r5, regs.ARM_r6, regs.ARM_r7, regs.ARM_r8, regs.ARM_r9, regs.ARM_r10, regs.ARM_sp, regs.ARM_fp, regs.ARM_ip, regs.ARM_lr, regs.ARM_pc, regs.ARM_cpsr);
}
// continue debugee process
ptrace(PTRACE_SYSCALL, pid, 0, 0);
}
}
下面是执行的结果。
ORIG_R0( 6), R0( 6), R1( -286709396), R2( 1), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 0), R8( 64), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4773736), CPSR( 0)
ORIG_R0( 6), R0( 1), R1( -286709396), R2( 1), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 1), R8( 64), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4773736), CPSR( 0)
ORIG_R0( 1), R0( 1), R1( -286709396), R2( 1), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 0), R8( 139), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4784360), CPSR( 0)
ORIG_R0( 1), R0( 0), R1( 1), R2( 17), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 1), R8( 209), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4773760), CPSR( 0)
ORIG_R0( -286704576), R0( -286704576), R1( 1), R2( -286704704), R3( 0), R4( 0), R5( 128), R6( 2), R7( 0), R8( 73), R9( 2), R10( 0), SP( 5353472), FP( 0), IP( 12), LR( 5390336), PC( 4774312), CPSR( 0)
ORIG_R0( -286704576), R0( 1), R1( 1), R2( -286704704), R3( 0), R4( 0), R5( 128), R6( 2), R7( 1), R8( 73), R9( 2), R10( 0), SP( 5353472), FP( 0), IP( 12), LR( 5390336), PC( 4774312), CPSR( 0)
ORIG_R0( 8), R0( 8), R1( -286704344), R2( 128), R3( 64), R4( 0), R5( 0), R6( 2), R7( 0), R8( 207), R9( 2), R10( 0), SP( 5353472), FP( 0), IP( 12), LR( 5390336), PC( 4774504), CPSR( 536870912)
ORIG_R0( 8), R0( 128), R1( -286704344), R2( 128), R3( 64), R4( 0), R5( 0), R6( 2), R7( 1), R8( 207), R9( 2), R10( 0), SP( 5353472), FP( 0), IP( 12), LR( 5390336), PC( 4774504), CPSR( 536870912)
ORIG_R0( 8), R0( 8), R1( 1), R2( 31), R3( 2036548096), R4( -286704692), R5( 64), R6( 63), R7( 0), R8( 209), R9( 4), R10( 2), SP( 1), FP( 1), IP( 2036351360), LR( 2036351360), PC( 4773760), CPSR( 1073741824)
ORIG_R0( 8), R0( 0), R1( 1), R2( 31), R3( 2036548096), R4( -286704692), R5( 64), R6( 63), R7( 1), R8( 209), R9( 4), R10( 2), SP( 1), FP( 1), IP( 2036351360), LR( 2036351360), PC( 4773760), CPSR( 1073741824)
ORIG_R0( -100), R0( -100), R1( 2035645536), R2( 0), R3( 0), R4( 2036362616), R5( 1348301426), R6( 75039744), R7( 0), R8( 56), R9( 246), R10( 2037383168), SP( 75690976), FP( 5353472), IP( 5396536), LR( 75039616), PC( 4775008), CPSR( 1610612736)
ORIG_R0( -100), R0( 14), R1( 2035645536), R2( 0), R3( 0), R4( 2036362616), R5( 1348301426), R6( 75039744), R7( 1), R8( 56), R9( 246), R10( 2037383168), SP( 75690976), FP( 5353472), IP( 5396536), LR( 75039616), PC( 4775008), CPSR( 1610612736)
ORIG_R0( 14), R0( 14), R1( 2036469760), R2( 4095), R3( 4), R4( 0), R5( 64), R6( 63), R7( 0), R8( 63), R9( 4), R10( 5390336), SP( 14839), FP( 0), IP( 14838), LR( 5390336), PC( 4774360), CPSR( 1073741824)
ORIG_R0( 14), R0( 12), R1( 2036469760), R2( 4095), R3( 4), R4( 0), R5( 64), R6( 63), R7( 1), R8( 63), R9( 4), R10( 5390336), SP( 14839), FP( 0), IP( 14838), LR( 5390336), PC( 4774360), CPSR( 1073741824)
ORIG_R0( 14), R0( 14), R1( 2037383168), R2( 5353472), R3( 20), R4( 0), R5( 0), R6( 2036380216), R7( 0), R8( 57), R9( 251), R10( 93), SP( 5396544), FP( 2036335336), IP( 5353472), LR( 32768), PC( 4774672), CPSR(-2147483648)
ORIG_R0( 14), R0( 0), R1( 2037383168), R2( 5353472), R3( 20), R4( 0), R5( 0), R6( 2036380216), R7( 1), R8( 57), R9( 251), R10( 93), SP( 5396544), FP( 2036335336), IP( 5353472), LR( 32768), PC( 4774672), CPSR(-2147483648)
ORIG_R0( -286706232), R0( -286706232), R1( 1), R2( -286706320), R3( 0), R4( 0), R5( 0), R6( 0), R7( 0), R8( 73), R9( 0), R10( 0), SP( 5), FP( 0), IP( 0), LR( 2036351040), PC( 4774312), CPSR( 1610612736)
ORIG_R0( -286706232), R0( 0), R1( 1), R2( -286706320), R3( 0), R4( 0), R5( 0), R6( 0), R7( 1), R8( 73), R9( 0), R10( 0), SP( 5), FP( 0), IP( 0), LR( 2036351040), PC( 4774312), CPSR( 1610612736)
ORIG_R0( 2039265648), R0( 2039265648), R1( 1), R2( 2147483647), R3( 0), R4( 117440573), R5( 62), R6( 62), R7( 0), R8( 98), R9( 2139062143), R10( 2139062143), SP( -1), FP( 16843009), IP( 32), LR( 0), PC( 4712472), CPSR(-2147483648)
ORIG_R0( 2039265648), R0( 0), R1( 1), R2( 2147483647), R3( 0), R4( 117440573), R5( 62), R6( 62), R7( 1), R8( 98), R9( 2139062143), R10( 2139062143), SP( -1), FP( 16843009), IP( 32), LR( 0), PC( 4712472), CPSR(-2147483648)
ORIG_R0( 2039209988), R0( 2039209988), R1( 1), R2( 2147483647), R3( 0), R4( 62), R5( 62), R6( 62), R7( 0), R8( 98), R9( 14802), R10( 2139062143), SP( -1), FP( 16843009), IP( 32), LR( 0), PC( 4712472), CPSR( 0)
ORIG_R0( 2039209988), R0( 0), R1( 1), R2( 2147483647), R3( 0), R4( 62), R5( 62), R6( 62), R7( 1), R8( 98), R9( 14802), R10( 2139062143), SP( -1), FP( 16843009), IP( 32), LR( 0), PC( 4712472), CPSR( 0)
ORIG_R0( 8), R0( 8), R1( 4957456), R2( 9), R3( 186), R4(-1187365760), R5( 0), R6( 84543233), R7( 0), R8( 57), R9( 2139062143), R10( 2139062143), SP( 0), FP( 16843009), IP( 7), LR( -256), PC( 4774672), CPSR( 1610612736)
ORIG_R0( 8), R0( 0), R1( 4957456), R2( 9), R3( 186), R4(-1187365760), R5( 0), R6( 84543233), R7( 1), R8( 57), R9( 2139062143), R10( 2139062143), SP( 0), FP( 16843009), IP( 7), LR( -256), PC( 4774672), CPSR( 1610612736)
ORIG_R0( -286704080), R0( -286704080), R1( 2), R2( 0), R3( 0), R4( 0), R5( -1), R6( 1348301426), R7( 0), R8( 73), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4774312), CPSR( 1610612736)
ORIG_R0( -286704080), R0( 2), R1( 2), R2( 0), R3( 0), R4( 0), R5( -1), R6( 1348301426), R7( 1), R8( 73), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4774312), CPSR( 1610612736)
ORIG_R0( 5), R0( 5), R1( -286704456), R2( -286704592), R3( 0), R4( 5357568), R5( 4774880), R6( 1348301426), R7( 0), R8( 242), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4774888), CPSR( 1610612736)
ORIG_R0( 5), R0( 8), R1( -286704456), R2( -286704592), R3( 0), R4( 5357568), R5( 4774880), R6( 1348301426), R7( 1), R8( 242), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4774888), CPSR( 1610612736)
ORIG_R0( 8), R0( 8), R1( 1), R2( 17), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 0), R8( 209), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4773760), CPSR( 0)
ORIG_R0( 8), R0( 0), R1( 1), R2( 17), R3( -286704568), R4( -286704588), R5( 4774880), R6( 1348301426), R7( 1), R8( 209), R9( 1348301426), R10( -48), SP( 5353472), FP( -128), IP( 12), LR( 5390336), PC( 4773760), CPSR( 0)
我了解到,ARM EABI将寄存器R0
设置为R6
(自变量)和R7
(系统调用号)以执行系统调用。但是,以上代码的结果略有不同。寄存器R0
至R6
具有系统调用参数是正确的,但是寄存器R7
仅重复具有0和1。问题是我不知道哪个寄存器具有系统调用号。从上面的代码执行结果可以看出,没有寄存器具有看起来像系统调用号的值。甚至寄存器SP
的值根本看起来都不像堆栈指针。
(大概,寄存器R7
的值似乎意味着系统调用进入和退出)
你能解释我在做什么错吗?