.bin文件的反汇编记录 您所在的位置:网站首页 bin文件安装游戏 .bin文件的反汇编记录

.bin文件的反汇编记录

2023-08-12 14:53| 来源: 网络整理| 查看: 265

前言

原本打算把IDA的使用与技巧写完,发现其实网上也有很多,这就以后再议吧(主要还是懒+拖延症吧…) 工作需要接触的逆向,从开始到现在做的一直是elf格式文件,也不需要脱壳,感觉也比较简单。 工作常见 前两天朋友托帮忙看一个.bin,发现自己现在掌握的其实仅仅冰山一角。将此次工作记录,便于日后学习查阅。

一、 一些相关知识点 asm、bin、hex、elf文件

asm是汇编语言源程序的扩展名,.asm文件是以asm作为扩展名的文件,是汇编语言的源程序文件。汇编语言(Assembly Language)是面向机器的程序设计语言,是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。

bin文件是二进制文件,是文件格式binary的缩写,后缀名为".bin"的文件,表式它是binary格式。通常来说,它的内容是机器代码,汇编语言编译后的结果。

hex全称baiIntel HEX,是可以烧写到单片机中,被单片机执行的一种文件格式。通常用于传输将被存于ROM或者EPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。大多数EPROM编程器或模拟器使用Intel HEX文件,其记录由对应机器语言码和/或常量数据的十六进制编码数字组成。

elf是Linux的主要可执行文件格式。 elf文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。

有段时间研究了一下elf文件格式,做了很多笔记,有时间再更新上来。

#bin、elf的一些要点:

1.执行raw bin只需要将程序加载到其起始地址,即可执行; 执行elf程序则需要一个ELF Loader。uboot和Linux kernel启动时没有ELF Loader,所以烧在flash上的文件只能是raw bin,即镜像文件image。

2.gcc编译出来的是elf文件,objcpy将elf文件转换为bin文件。

我用了两种方法反汇编.bin文件。

a)bin文件转换为hex文件,IDA打开hex文件 b)使用交叉编译工具链进行bin的反汇编 arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm 二、两种实现方法 方法一

首先利用bin转hex工具,将bin文件转换成hex文件,类似的工具网上能找到,百度一下。 转换完毕,使用IDA打开hex文件,这里我用的是IDA Pro7.2 下面是IDA的步骤: IDA打开hex文件进入如下界面 在这里插入图片描述 Processor type 选择 ARM Little-endian,而后 在这里插入图片描述 点开Processor options,再点开Edit ARM architecture options,选择ARMv7-M,然后一路ok。 此时出现的是数据表现型式 在这里插入图片描述 用快捷键c可转成汇编代码,在地址等地方(画红线处)键c即可 在这里插入图片描述 汇编代码 在这里插入图片描述

方法二

利用交叉编译工具链arm-linux 的arm-linux-objdump进行反汇编。

objdump是Linux下的反汇编目标文件或者可执行文件的命令,arm-linux-objdump与之参数相同。 常见用法: 1.-b 文件格式 指定目标码格式 2.-d 反编译可执行段 3.-D 反编译所有段 4.-EB,-EL指定字节序 5.-f 显示文件的整体头部摘要信息 6.-h 显示目标文件中各个段的头部摘要信息 7.-I 显示支持的目标文件格式和CPU架构 8.-j name显示指定section 的信息 9.-m 主机类型 指定反汇编目标文件时使用的架构

将elf或bin文件反编译到xx文件:

arm-linux-objdump –D elf_file > dis_file arm-linux-objdump –D –b binary –m arm bin_file > dis_file 参数: -D 反编译所有代码 -m 主机类型, arm -b 文件格式, binary 如: arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm 把xxx.bin反汇编到xxx.asm文件

下载安装arm-linux-gcc

我的是arm-linux-gcc-4.6.4-x86_64.tar.bz2。 arm-linux-gcc安装包

说一下安装。 cp arm-linux-gcc-4.6.4-x86_64.tar.bz2 到 /usr/local 解压 tar -jxvf arm-linux-gcc-4.6.4-x86_64.tar.bz2

解压完后可以看到 /usr/local 下有个 opt 文件夹 在 opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin 下可以看到交叉编译器的工具。

neko@neko:/usr/local$ ls arm-linux-gcc-4.6.4-x86_64.tar.bz2 bin etc games include lib man opt sbin share src neko@neko:/usr/local$ ls opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/ arm-arm1176jzfssf-linux-gnueabi-addr2line arm-linux-addr2line arm-none-linux-gnueabi-addr2line arm-arm1176jzfssf-linux-gnueabi-ar arm-linux-ar arm-none-linux-gnueabi-ar arm-arm1176jzfssf-linux-gnueabi-as arm-linux-as arm-none-linux-gnueabi-as arm-arm1176jzfssf-linux-gnueabi-c++ arm-linux-c++ arm-none-linux-gnueabi-c++ arm-arm1176jzfssf-linux-gnueabi-cc arm-linux-cc arm-none-linux-gnueabi-cc arm-arm1176jzfssf-linux-gnueabi-c++filt arm-linux-c++filt arm-none-linux-gnueabi-c++filt arm-arm1176jzfssf-linux-gnueabi-cpp arm-linux-cpp arm-none-linux-gnueabi-cpp arm-arm1176jzfssf-linux-gnueabi-ct-ng.config arm-linux-ct-ng.config arm-none-linux-gnueabi-ct-ng.config arm-arm1176jzfssf-linux-gnueabi-elfedit arm-linux-elfedit arm-none-linux-gnueabi-elfedit arm-arm1176jzfssf-linux-gnueabi-g++ arm-linux-g++ arm-none-linux-gnueabi-g++ arm-arm1176jzfssf-linux-gnueabi-gcc arm-linux-gcc arm-none-linux-gnueabi-gcc arm-arm1176jzfssf-linux-gnueabi-gcc-4.6.4 arm-linux-gcc-4.6.4 arm-none-linux-gnueabi-gcc-4.6.4 arm-arm1176jzfssf-linux-gnueabi-gcov arm-linux-gcov arm-none-linux-gnueabi-gcov arm-arm1176jzfssf-linux-gnueabi-gprof arm-linux-gprof arm-none-linux-gnueabi-gprof arm-arm1176jzfssf-linux-gnueabi-ld arm-linux-ld arm-none-linux-gnueabi-ld arm-arm1176jzfssf-linux-gnueabi-ld.bfd arm-linux-ld.bfd arm-none-linux-gnueabi-ld.bfd arm-arm1176jzfssf-linux-gnueabi-ldd arm-linux-ldd arm-none-linux-gnueabi-ldd arm-arm1176jzfssf-linux-gnueabi-nm arm-linux-nm arm-none-linux-gnueabi-nm arm-arm1176jzfssf-linux-gnueabi-objcopy arm-linux-objcopy arm-none-linux-gnueabi-objcopy arm-arm1176jzfssf-linux-gnueabi-objdump arm-linux-objdump arm-none-linux-gnueabi-objdump arm-arm1176jzfssf-linux-gnueabi-populate arm-linux-populate arm-none-linux-gnueabi-populate arm-arm1176jzfssf-linux-gnueabi-ranlib arm-linux-ranlib arm-none-linux-gnueabi-ranlib arm-arm1176jzfssf-linux-gnueabi-readelf arm-linux-readelf arm-none-linux-gnueabi-readelf arm-arm1176jzfssf-linux-gnueabi-size arm-linux-size arm-none-linux-gnueabi-size arm-arm1176jzfssf-linux-gnueabi-strings arm-linux-strings arm-none-linux-gnueabi-strings arm-arm1176jzfssf-linux-gnueabi-strip arm-linux-strip arm-none-linux-gnueabi-strip neko@neko:/usr/local$

接下来就是添加环境变量了

vi etc/profile

打开profile文件,在最底下添加工具链的bin路径

export PATH=$PATH:/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin

在这里插入图片描述 保存退出后 source /etc/profile 使之生效。 除了/etc/profile,我在 ~/.bashrc 的最后一行也加上了

export PATH=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin:${PATH}

保存退出后依旧 source ~/.bashrc 配置好环境变量后,arm-linux-gcc -v 查看

neko@neko:/usr/local$ arm-linux-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gcc COLLECT_LTO_WRAPPER=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper Target: arm-arm1176jzfssf-linux-gnueabi Configured with: /work/builddir/src/gcc-4.6.4/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-arm1176jzfssf-linux-gnueabi --prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4 --with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion='crosstool-NG hg+unknown-20130521.154019 - tc0002' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --without-long-double-128 --disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-c99 --enable-long-long Thread model: posix gcc version 4.6.4 (crosstool-NG hg+unknown-20130521.154019 - tc0002)

安装完成。

使用arm-linux-objdump进行反汇编

neko@neko:~/test$ arm-linux-objdump -D -b binary -m arm test.BIN > test.asm neko@neko:~/test$ ls test.asm test.BIN neko@neko:~/test$ vi test.asm

在这里插入图片描述 这也是我第一次反汇编.bin文件,对比一下IDA与objdump,觉得IDA做elf格式的文件优势明显,二进制文件用objdump看感觉更舒服一点(仅个人看法)。可能也是朋友给的这个文件不全,所以IDA出来也不连贯吧。。。

汇编分析就不写了,我比较啰嗦,写个小东西都能写出来长篇大论。以后有时间总结好了再记录吧。 汇编指令太多,附一个arm指令集中文手册chm版,方便查阅。 arm指令集中文手册chm版

人非圣贤,我仍菜鸡,有错误的地方还望各位大佬们指出,多多指教。 共勉~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有