幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

反编译入门

  我们在写单片机裸机程序时,在主函数之前,会有一段启动代码,而启动代码是用汇编写的,有些朋友可能看到汇编头都大了,当时要想深入研究底层架构,这快硬骨头就必须去啃。
  汇编:汇编文件转换为目标文件(里面是机器码)。
  反汇编:可执行文件(目标文件,里面是机器码),转换为汇编文件。
  关于汇编的基础知识,请看笔者以前的文章。
  今天笔者以STM32F1的点灯程序为例,带领大家进行反汇编,并阅读反汇编后的代码。1新建LED裸机程序
  关于STM32裸机程序的创建,请看笔者博文:
  https:bruceou。blog。csdn。netarticledetails78244735
  但是今天这个程序非常简单,不应那么复杂。
  1。新建文件夹
  新建文件夹STM32F1,当然名字也可以另取,在STM32F1文件夹下,我们新建五个文件夹,分别为CMSIS、Listing、Output、Project、User。
  其中CMSIS文件夹放启动文件:
  笔者的开发板芯片是STM32F103ZE,这个文件是根据STM32的固件库startupstm32f10xmd。s文件修改而来。
  2。新建工程
  打开Keil,在工具栏ProjectNewVisionProject新建我们的工程文件。
  输入工程名,保存即可。
  窗口是让我们选择公司跟芯片的型号,我们用的芯片是ST公司的STM32F103ZE,有64KSRAM,512KFlash,属于高集成度的芯片。按如下选择即可。
  然后点击项目管理。
  最后修改后的内容如下:
  并添加相应的文件。
  其中main。c的内容如下所示:brief延时函数paramdretvalNonevoiddelay(intd){while(d);}briefmainparamNoneretvalintintmain(void){unsignedintpR使能GPIOBpReg(unsignedint)(0x400210000x18);pReg(13);设置GPIOB0为输出引脚pReg(unsignedint)(0x40010C000x00);pReg(10);pReg(unsignedint)(0x40010C000x0C);while(1){设置GPIOB0输出1pReg(10);delay(1000000);设置GPIOB0输出0pReg(10);delay(1000000);}}
  startup。s文件的内容如下:;STM32F1;FileName:startup。s;Author:BruceOu;Version:V1。0;Date:20210627;Description:STM32F10xMediumDensityDevicesvectortableforMDKARM;toolchain。;Thismoduleperforms:;SettheinitialSP;SettheinitialPCResetHSetthevectortableentrieswiththeexceptionsISRCBranchestomainintheClibrary(callsmain())。;AfterResettheCortexM3processorisinThreadmode,;priorityisPrivileged,andtheStackissettoMain。;PRESERVE8THUMB;VectorTableMappedtoAddress0atResetAREARESET,DATA,READONLYEXPORTVectorsVectorsDCD0DCDResetHResetHandlerAREA。text,CODE,READONLY;ResethandlerResetHandlerPROCEXPORTResetHandler〔WEAK〕IMPORTmainLDRSP,(0x200000000x10000)BLmainENDPEND
  接下来还有配置工程。
  选择Output文件夹。
  选择Listing文件夹。
  基本配置就这些,接下来编译工程。
  只要没有错误就可以了,最后就是下载程序,笔者使用的是JLink,最后的现象如下:
  LED会不停闪烁。2Keil反汇编
  接下来才是今天正题,反汇编。
  在KEIL的User选项中,如下图添加这两项:fromelfbinoutputSTM32F1。bin。。OutputSTM32F1。axffromelftextacoutputSTM32F1。dis。。OutputSTM32F1。axf
  然后重新编译,即可得到二进制文件STM32F1。bin(以后会分析)、反汇编文件STM32F1。dis。
  如下图所示:
  正常编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
  但是反编译是讲为二进制文件反编译成汇编文件,因此反汇编的流程如下:
  3反汇编代码解析
  接下来就是查看反编译代码,打开反编译文件ProjectSTM32F1。dis。这里只截取一段查看,因为格式都是一样的,知识每条内容不同罢了。
  第一列是链接地址,第二列是机器码,第三列是汇编指令。
  根本汇编指令,我们找到ARMv7MArchitectureReferenceManualDDI0403E。d(ID070218)中的LDR指令。
  我们将F8DFD004变成二进制。
  这个使用的32位的Thumb2指令集。
  其中b0b11是立即数,这里是4,对应的汇编代码的也是4,这里要注意的是,ARM指令采用流水线机制,当前执行地址A的指令,同时已经在对下一条指令进行译码同时已经在读取下下一条指令:PCA4(ThumbThumb2指令集)。
  B12b15是寄存器,这段大小是0XC,对应的寄存器就是
  后面16bit除了23位意外,全是固定的,其中‘U’表示无条件执行,这里置为1。
  其他的汇编指令对应的机器码也是类似的,值得注意的是,不同的架构对应的机器码也是不同的,这也就回答了为了不同的处理器架构会对应不同的指令集。
  有兴趣的可以对比CortexM系列和CortexA系列的的指令集。请参考以下手册:
  ARMArchitectureReferenceManualARMv7AandARMv7Redition。pdf
  ARMv7MArchitectureReferenceManual。pdf4反汇编代码全解析
  进入debug模式,在View下选择disassemblywindow。
  这样就可将机器码和对应的代码对应起来。当程序运行起来了,也就从异常向量表中跳转到ResetHandler中,然后跳转到main函数中,而main函数是在栈中,因此需要设置占空间的起始位置。根据STM32的参考手册,SRAM的其起始地址和大小如下:
  因此栈顶为起始位置加上栈的大小即可,只要不超过SRAM即可。
  值得注意的是,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是在通过LDR设置,因此需要根据应用需求合理分配栈空间。
  接下来往下走,如果在汇编中不打断点,会默认进入main函数的一条指令,就从这里分析。为了分析方便,这里还有使用上一节方便出来的文件。
  【C代码33行】
  从内存地址0x0800017c拷贝数据0x40021018到r3中,也就是r30x0800017c
  也就是将pReg指针保存到r3中。
  【C代码34行】
  这里对应3条指令
  首先将r3拷贝到r0中,然后将r0或上1左移3位,也就是ORRr0,r0,8
  最后将r0的值写入r3所指地址中。
  【C代码37行】
  同33行,从内存地址0x08000180拷贝数据40010c00到r3中
  【C代码38行】
  同34行,这里也对应3条指令:
  【C代码40行】
  和33行不同的是,这里分了两条指令:
  笔者认为前面是编译器优化了。根据ARM指令采用流水线机制,当前执行地址A的指令,同时已经在对下一条指令进行译码同时已经在读取下下一条指令:PCA4(ThumbThumb2指令集)。因此前面类似的代码被优化了。
  接下来就进入循环中。
  后面就移植在死循环中,不断操作GPIO的亮灭。
  【C代码45行】
  这里是将B0设置为1,和34行类似。
  【C代码47行】
  这里将进入延时函数。
  进入延时函数:
  NOP是字节对齐,减少指令的内存访问次数。首先将变量d保存到r0,然后将r0赋给r1,接着是r0自减1,紧接着是r1与0比较,如果r1等于0,则会返回,否则,又从头开始,值得注意的是,这里先比较,然后r0才自减的。
  为了进一步说明,可以看d的汇编代码。
  这里就是相当于r1先减1,然后再比较的。
  【C代码50行】
  这行代码对应一下指令,很简单。
  5总结
  在前面使用Keil进行了反汇编,也对相应的C代码进行了分析。我们看到的反汇编代码如下:
  根据反汇编的代码,可将其对应到Flash,在Flash上的内容如下表所示:
  地址
  Flash内容
  0x08000000
  00000000hr0x08000004
  08000009hr0x08000008
  f8dfd004
  0x0800000c
  f000f80c
  最后总结下点灯的流程:
  第一步:设置栈:CPU会从0x08000000读取值,用来设置SP。
  第二步:跳转:CPU从0x08000004得到地址值,根据它的BIT0切换为ARM状态或Thumb状态,然后跳转。
  第三步:对于cortexM3M4,它只支持Thumb状态,所以0x08000004上的值bit0必定是1,0x08000004上的值ResetHandler1。从ResetHandler继续执行。
  第四步:然后进入到主函数中执行相应C代码

420北京时间6月24日凌晨,2022年国际乒联WTT支线赛奥托塞克站继续进行。男子单打正赛第一轮,中国17岁小将林诗栋,以41战胜比利时选手阿德里恩拉森弗斯取得了开门红。另外两场比……贝斯特数字化亮相嘉兴市产业数字化峰会获优秀服务商称号2023年4月14日,嘉兴市产业数字化峰会在嘉兴市中国商飞客户服务训练基地召开。峰会上,来自全国各地的数字化企业与专家学者围绕数字蓄能持续创新主题,积极探讨企业数字化转型道路上……耶鲁大学最新研究成果我们离头发克隆又近了一步耶鲁新闻发布了一条振奋人心的消息。在一项新的研究中,耶鲁大学的研究人员发现了一种独特的方法来鉴定诱导毛囊形成和捕捉再生触发因素的分子信号。这些发现至关重要,这为人类创造新毛囊铺……iPhone15ProMax预计售价2万元,铁打的工资,流水大家对于iPhone15ProMax预计售价2w怎么看?对于我一个手机用了四年的来说,这手机怕不是金子做的吧,不然价格一年比一年高。我只能说离谱到极致,这物价疯狂涨啊,我……你的陪伴用不用心孩子其实都知道1hr陪伴的前提:不要总想着改变孩子有位妈妈抱怨读初中的儿子和丈夫之间火药味特别浓,父子俩几句话不对付就会吵起来。丈夫平时工作忙,和孩子相处时间比较少,唯有周……蕾哈娜挺二胎大肚压轴奥斯卡!穿透视装臀部还镂空,身材太辣妈了这次的奥斯卡开幕式红毯真的是太有看点了,尤其是蕾哈娜的压轴出场,虽然她的孕肚已经很大了,但是蕾哈娜依旧很大胆的选择了一身透视装的礼服造型,搭配被外媒戏称的菠萝头,蕾哈娜挺大肚走……光学镊子是如何抓住分子的尾巴?最初,开普勒在他的著作中描述了光可以施加机械压力的事实。通过观察彗星彗尾行为的细节,他得出结论,光必须以某种方式在机械层面上与周围的物质相互作用。分类科学主题光学镊……撤城再撤城,兴盛优选被逼回原点经历2021年7月最后一笔融资后,兴盛优选在资本上便没有了声响。记者丨何倩乔心怡编辑丨杨博4月12日北京商报记者从兴盛优选获得确认,平台已于近日关停福建市场业……新乡冠军赛4强出炉!国乒两位奥运冠军出局,大头惨败,诗栋遗憾目前WTT乒乓球新乡冠军赛已经结束了5个比赛日的争夺,男、女单4强正式出炉,国乒女队成功包揽4强,女单半决赛迎两场内战;国乒男队则有两人晋级4强,男单半决赛将迎两场外战,下面带……老年人的健康饮食之道全国斜杠老年大赛随着社会的发展和人口老龄化的加剧,老年人健康问题越来越引起人们的关注。饮食作为老年人保持健康的重要因素,也越来越受到重视。老年人的饮食应该如何搭配,才能保……泰山队真把韦世豪当成宝了!为引进他甘愿砸重金,让球迷意外日前,根据山东媒体报道泰山队已经出手搞定韦世豪加盟。泰山队为了能让韦世豪顺利加盟球队,也是打破了之前只考虑自由身本土球员的常规。郝伟接手泰山队之后,在为球队本土引援时,就倾向于……直击白酒圆桌会中酒协宋书玉行业尚存在产量与销量等矛盾当下是贵州白酒发展的一个重要历史节点,在经历了高速增长阶段之后,积累的矛盾需要释放,在此形势下,必须理性分析产业发展形势,准确研判产业发展。在4月3日举行的贵州白酒企业发展圆桌……
CBA中职篮许钟豪被浙江广厦开除的谣言不攻自破首先感谢题图的这位老大,把我的文章一字不差的搞到网易去了,但我很高兴,绝不举报,抄袭是家常便饭,自己不抄就行了。不过记住下次把我头像去了,这个太明显了,我这带口罩的型象在……伊莉雅这么可爱的娃,是如何培养出来的?大家好,我是魔术师杀手,昨天带着自家的娃娃散步,引来诸多羡慕的目光,看着她桃金色的秀发,洋娃娃一般可爱的脸蛋,娇小而带来幸福感的平坦曲线,伊莉雅为什么会这么可爱!这么可爱的娃娃……为退役铺路!老詹新公司开张,篮网对欧文做了预案?北京时间6月22日,NBA正式进入休赛期,距离2022年选秀大会还有不到两天的时间。根据报道,洛杉矶湖人当家球星勒布朗詹姆斯旗下的娱乐公司SpringHill近日与日本网……2022中国城市排名上海第一,广州第七,天津成都没进前十我国上海交通大学和搜狐城市联合发布了《中国大城强城指数报告2022》,这份榜单当中,GDP超过5000亿的54座城市都进入了大城排行榜,而从劳动生产率,土地生产率以及资本生产率……三星手机重回中国,人民网道出复苏关键,应学习小米11售后自从三星遭遇了Note7的爆炸门事件之后,在国内市场的份额就开始一蹶不振。但是三星对于重新夺回国内市场份额的决心一直都没有动摇。这几年推出的产品虽然整体不错,但是国内消费者并不……江西灵山全民健身卡4月17日正式发售为了让更多市民游灵山方便实惠,本网获悉,江西省灵山景区于4月17日正式发售全民健身卡,该卡不仅实现了年卡多元化,并在老版年卡基础上进行了升级,节假日不限入园,365天全年可用。……甘肃金塔消费旺起来经济火起来央广网张掖3月16日消息(记者李红军通讯员卢玉)各大商圈人潮涌动,商贸企业销量增长,旅游景区人头攒动2023年,甘肃省金塔县消费市场呈现出烟火气热腾腾、生活味暖融融的景象。……KDE发布Plasma5。27。3桌面环境维护更新IT之家3月15日消息,KDE团队于今天发布了DEPlasma5。27。3桌面环境维护更新,距离上个更新相隔2周时间。本次更新主要在不支持GammaLUT,但支持颜色变换矩阵的……人间四月,让心中美好从此刻出发作者:子墨四月,诗意的季节,总是藏着关于美好的故事,春风过处,一片片花开如潮水涌动,在旧墙上的花影描摹出画意,让我们凝视着,有了无限的遐想。春风十里,花儿一丛丛一簇……赔钱赚吆喝?还是割韭菜?31万起的纯电SUV智己LS7,真会作为上汽集团重注的新能源品牌智己汽车,在首款车型L7交付不太理想的情况下,本月初终于推出了第二款车,也是它的首款SUV车型LS7,这次造型看着可是相当的哇塞!车身长宽高分……联合国教科文组织第一期甘肃对话市长论坛发言选登联合国教科文组织第一期甘肃对话市长论坛发言选登首届城市、文化、创造力甘肃对话市长论坛现场。3月12日至15日,联合国教科文组织在兰州举办了城市、文化和创造力框架能力……碰瓷多家央企!被股东集体打假的国恒基业是什么来头?图片来源中房报图库彭红侠梁学城中房报记者刘亚北京报道近期,多家国企央企陆续遭遇碰瓷。4月9日,国家电力投资集团有限公司及中国国有企业结构调整基金先后发布严正声明,直……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网