前言

原本打算把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版

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

.bin文件的反汇编记录相关推荐

  1. stm32逆向与安全科普,bin文件逆向反汇编

    来源:阿莫论坛,作者:ilovepp 微信公众号:芯片之家(ID:chiphome-dy) 首先你要有一个bin文件(bin文件的获取方法不在此展开介绍,今后有机会可以专门开一个贴聊一聊).本次实验用 ...

  2. HEX文件和BIN文件转换

    IAP升级: 利用hex文件对单片机进行升级,首先需要将hex文件转化成bin文件,本文记录如何将hex文件转化为bin文件(自用,读者若有需要自行查阅) 问题描述 hex文件的组成: 如图hex的第 ...

  3. 【嵌入式】关于IAP+Xmodem从外部接收bin文件对芯片进行升级学习记录

    本文基于GD32F303CGT6芯片 使用软件: KEIL5 Tera Term 什么是IAP 对于芯片的程序烧录,一共三种方式: ICP ISP IAP ICP(in-circuit-program ...

  4. H3C U200M 防火墙 bin文件丢失上传方法记录。

    使用串口上传,在bootware界面下选择串口,并将波特率改为115200.因为如果用9600bps上传的话,将会更慢,一个29M的main.bin文件上传时间足足用了2个多小时. 无奈在设置ftp方 ...

  5. bin文件和hex文件互转

    对于嵌入式而言,hex文件可能大家再熟悉不过了,对,我们大学时学习的51单片机编写的代码在keil上编译后就生成了hex文件.那bin文件又是什么意思呢,它又和hex文件的区别在哪?这也不是本文的重点 ...

  6. hex文件和bin文件区别

    HEX文件和BIN文件是我们经常碰到的2种文件格式.因为自己也是新手,所以一直对这两个文件懵懵懂懂,不甚了解,最近在做STM32单片机的IAP更新,其中要考虑HEX文件和BIN文件,所以需要学习下这两 ...

  7. ELF文件和BIN文件

    文件的内容: 1. BIN文件是 raw binary 文件,这种文件只包含机器码. 2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等. 所以ELF文件 ...

  8. 深入理解.bin文件和.nb0文件的结构

    .bin文件是一个描述性质的映像文件,它由文件头(head).镜像数据目的起始地址(ImageStart).镜像数据长度(ImageLength)和多条相对独立的记录(record)构成. 文件头(h ...

  9. linux误删 bin目录,记linux下rm误删bin文件的解决方式

    平常有个坏习惯,删文件为了快点,喜欢用rm xx*,删除一些关键词文件.今天为了删/bin下几个含有mix关键词的文件,使用命令rm mix*.手贱,mix和*之间多了个空格...灾难发生了!bin下 ...

  10. Keil5-MDK 使用编译步骤及异常与修改(生成axf文件和bin文件)

    其实我是比较触头硬件编程这个事情的,因为我没学汇编计组还挂了,重修也没学明白,因为课时间重了办的免听,最后还是靠我的学弟们,贡献了他们老师给画的重点.结果毕业后找工作,就c++熟一些,急乎乎的找了c+ ...

最新文章

  1. 零基础java培训如何规划学习路线
  2. 38页PPT深度解析:半导体设备产业链全景图
  3. MYSQL数值运算符和函数用法
  4. python的编程模式-使用简单工厂模式来进行Python的设计模式编程
  5. 随时牵手,不要随意分手
  6. linux 中断程序设计,Linux中断编程
  7. c语言贪心算法背包问题_GGTalk 中的算法知识 01背包问题
  8. html5如何划分区域,10.4 51单片机 RAM 区域的划分
  9. mysql循环查到没数据库_【mysql】在for循环里使用多线程查询数据库
  10. git菜单形式的_Idea:Git的常用菜单操作和常用命令
  11. 谷歌跨界医学新动作:基因突变定位模型又更!新!了!
  12. Oracle根底数据标准存储名目浅析(三)——日期标准(三)
  13. JDK1.8下载 jdk1.8-64下载 国内源
  14. Cousera-AndrewNg(吴恩达)机器学习笔记--第二周编程作业(线性回归)
  15. 网易微专业Android实战教程
  16. matlab求球的体积,【matlab计算不规则物体体积资讯】matlab计算不规则物体体积足球知识与常识 - 足球百科 - 599比分...
  17. 不用win10的人,在用win7-usb-creator时出现的一个无提示现像.
  18. 【Delphi学习】Form的borderstyle属性
  19. 宏基d260linux系统,宏碁最新推出的Aspire C系列一体机提供Linux FreeDOS操作系统
  20. 您还没有登录或登录已超时,请重新登录

热门文章

  1. TikTok和抖音差别大吗?
  2. 【C语言】三子棋游戏详解
  3. 数理经济模型(1)---蒙特卡洛仿真Monte Carlo Simulation
  4. 杨丫头,送你只大喵~!!
  5. ppt计算机实验报告册,PPT实验报告册
  6. 鸿基酒店应收应付报表生成系统
  7. PHP+MySQL民宿酒店管理系统源码 财务管理 设备管理 报表中心等
  8. Proteus8.12无法仿真STC15系列单片机解决办法
  9. Qt输出PDF排版的技巧
  10. 无法打开包括文件的解决办法