有时候虽然有一部分代码,但比如这代码里用到了某一个宏,而这个宏定义的头文件你没有。 这种情况下如何判断宏的值呢? 可以通过对对应的二进制文件反汇编来处理。 比如下面一
有时候虽然有一部分代码,但比如这代码里用到了某一个宏,而这个宏定义的头文件你没有。
这种情况下如何判断宏的值呢?
可以通过对对应的二进制文件反汇编来处理。
比如下面一段代码 test.c:
#include "foo.h"
int foo(int i)
{
return 0;
}
int test(void)
{
foo(FOO);
return 0;
}
对应的foo.h定义了一个宏:
#define FOO 0xdeafdeaf
使用下面命令编译test.c:
$ arm-none-linux-gnueabi-gcc -o libtest.so test.c -shared
好,这时候假如不知道FOO的值。使用如下的命令:
$ arm-none-linux-gnueabi-objdump -D libtest.so
我们看test函数的反汇编结果:
00000684 <test>:
684: e92d4800 push {fp, lr}
688: e28db004 add fp, sp, #4
68c: e59f000c ldr r0, [pc, #12] ; 6a0 <test+0x1c>
690: ebffff8e bl 4d0 <_init+0x38>
694: e3a03000 mov r3, #0
698: e1a00003 mov r0, r3
69c: e8bd8800 pop {fp, pc}
6a0: deafdeaf cdple 14, 10, cr13, cr15, cr15, {5}
bl这个是跳转指令,在之前的r0是传给函数的参数。通过ldr获取,获取的值在6a0处,为deafdeaf。
这样我们就能知道FOO的值为0xdeafdeaf