反编译学习

 最近开始学习基于arm反编译,而至于学习反汇编的原因,或许是头脑发热所做的决定吧……

由于不同平台上的编译环境有较大的不同,因而生成的中间文件以及可执行程序的文件格式都有所不同,如同一机器上,linux系统gcc编译器生成的中间文件为.o文件,而window系统vc工具提供的编译工具cl.exe编译生成的中间文件则是.obj;当然.exe与.elf也是不同的文件类型。

为了方便实例的编译和反编译结果的验证,后续的实例基于如下工具:windows+ADS1.2+IDA5.5,当然,如果你有一个简单的嵌入式硬件平台是最好了。

在描述反编译过程之前,我再简单的赘述一下C语言的一点基本的知识,C程序代码到可执行程序的流程主要分为如下几个步骤:
1、预处理(.c),不过由于预处理只进行了一些替换等工作,我们后续不做分析,仅从汇编开始;
2、编译,优化程序(.s,.asm);
3、汇编(.o,.a,.ko);
4、链接(.elf,.axf);

嵌入式环境中,常见的文件类型主要是.o,.a,或者是.elf和.axf文件,这些程序的实现我们是不可见的,因此需要把他们还原为可读的C程序代码,了解到上述的编译过程,我们基本上既可以大致明白反编译的基本过程了。反编译的基本过程如下:
1、*old.o-->*old.asm:拿到.o文件使用IDA反汇编工具可以查看汇编代码,如果你拿到的是.a文件,该文件则是通过工具把几个.o文件链接到一起的,我们也可以使用类似的步骤把.a文件分离成一个个.o文件,进而再一个个分析;当然,你可以直接使用IDA工具打开.a文件,再选择具体分析哪一个.o文件;
2、*old.asm-->*new.c:分析.map中汇编的实现,通过汇编指令的分析得出相应的C源代码;
3、*new.c-->*new.asm:把反编译生成的new*.asm与*old.asm通过beyond compare进行比较,分析差异,知道确定差异问题在语义上基本没有问题;
4、*new.c-->*new.axf:生成可执行程序对比可执行程序的执行结果是否有差异,没有差异基本证明反编译结果的正确性,当然如果最初拿到的是*old.o文件,那我们就需要生成对应的*new.o文件,并使之替换原始的*old.o文件,然后添加到工程中,再进一步验证其正确性。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页