当前位置 : 主页 > 编程语言 > c语言 >

在没有源码的情况下判断宏的具体值

来源:互联网 收集:自由互联 发布时间:2023-09-06
有时候虽然有一部分代码,但比如这代码里用到了某一个宏,而这个宏定义的头文件你没有。 这种情况下如何判断宏的值呢? 可以通过对对应的二进制文件反汇编来处理。 比如下面一


有时候虽然有一部分代码,但比如这代码里用到了某一个宏,而这个宏定义的头文件你没有。

这种情况下如何判断宏的值呢?

可以通过对对应的二进制文件反汇编来处理。

比如下面一段代码 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


上一篇:用 ComPDFKit 将 PDF 转换为 CSV
下一篇:没有了
网友评论