学习
实践
活动
工具
TVP
写文章

分析下BL(B)LDR指令

BL LDR指令简介   LDRBL启动程序,都是可以负责pc跳转的指令。   BL是地址无关指令,即当前的运行地址无关。 因此,当编译地址(加载地址)运行地址相同时,绝对跳转相对跳转都可以正确执行。比如,程序NORFLASH存储。   但是,当编译地址(加载地址)运行地址不相同时,相对跳转就会出现问题。 比如,代码存储NANDFLASH,由于NANDFLASH并不能运行代码,所以需要重定位代码到内部的SRAM。 3. BL(B)LDR跳转范围是如何规定的   下图为B(BL)指令的格式 ? 总结   这样,绝对跳转的固定地址就很好理解了,要跳转地址的值链接就已经确定了,存在了一块内存。 相对跳转,反汇编bl 33f00110的33f00110是根据pc计算出来的,当pc改变,结果也会改变。所以,称为相对跳转,与当前位置无关。

67221

《深入理解计算机系统》(CSAPP)读书笔记 —— 第三章 程序的机器级表示

跳转指令的编码   通过看跳转指令的编码格式理解下程序计数器PC是如何实现跳转的。    不过,观察指令的宇节编码,会看到第一条跳转指令的目标编码第二个字节)为0x03.把它加上0×5,也就是下一条指令的地址,就得到跳转目标地址0x8,也就是第4行指令的地址。    C汇编代码,程序都是将 index6做比较,如果大于6就跳转到默认的代码处。 ?   执行 switch语句的关键步骤是通过跳转表来访问代码位置。 (.rodata段的详细解释我总结的嵌入式软件开发笔试面试知识点中有详细介绍) 已知switch汇编代码,如何利用汇编语言和跳转表的结构推断出switch的C语言结构?    同样,汇编浮点数也是其他类型的数据有所差别的,我们需要考虑以下几个方面:1.如何存储访问浮点数值。

51130
  • 广告
    关闭

    年末·限时回馈

    热卖云产品年终特惠,2核2G轻量应用服务器6.58元/月起,更多上云必备产品助力您轻松上云

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    对不起,学会这些知识后我飘了

    程序的开始过程和顺序流程是一样的,CPU 从0100处开始执行命令,01000101都是顺序执行,PC 的值顺序+1,执行到0102地址的指令,判断0106寄存器的数值大于0,跳转(jump)到0104 标志寄存器 条件循环分支会使用到 jump(跳转指令),会根据当前的指令来判断是否跳转,上面我们提到了标志寄存器,无论当前累加寄存器的运算结果是正数、负数还是零,标志寄存器都会将其保存 CPU 进行运算 二进制数中表示负数值,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。 符号位是 0 表示正数,是 1 表示 负数。那么 -1 用二进制数该如何表示呢? 汇编语言中比较指令的结果,会存储 CPU 的标志寄存器。不过,标志寄存器的值,程序是无法直接参考的。那如何判断比较结果呢? 汇编语言中有多个跳转指令,这些跳转指令会根据标志寄存器的值来判断是否进行跳转操作,例如最后一行的 jl,它会根据 cmp ebx,10 指令所存储标志寄存器的值来判断是否跳转,jl 这条指令表示的就是

    32310

    安卓逆向:重温Thumb汇编指令的细节

    BX来实现的 汇编格式:BX{} Rm 功能:BX 指令跳转到指令中所指定的目标地址,并实现状态的切换。 当Rm 的最低位Rm[0] 为 1 ,强制程序从ARM 指令状态跳到Thumb 指令状态;当 Rm 的最低位Rm[0]为0 ,强制程序从Thumb 指令状态跳到ARM 指令状态。 BX 指令示例 CODE32 ;ARM 程序段,32 位编码 arm1 ADR R0,thumb1+1 ;把thumb1 所在地址赋给R0 ,末位R0[0] 置1 ,要跳转THUMB LR,PC 语句将返回地址保存到了LR 寄存器。 5.Thumb指令一些应用情况 •ida识别Thumb指令ARM指令的方法 •CODE32表示的采用ARM汇编指令,CODE16表示采用的是THUMB汇编指令。 ?

    91374

    IDA反汇编EXE添加一个启动的消息框

    IDA反汇编EXE添加一个启动的消息框 上一篇文章介绍了用OD反汇编EXE添加一个启动的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转到弹框区域再跳转回来去执行原来的代码 描述 首先准备好要用到的软件也就是IDA扫雷这个软件,特别建议使用IDA Pro 7.5版本,细节方面尤其是返回前进也就是Ctrl + ZCtrl + Y用起来很舒服,当然其他版本主要功能都是有的 在这里我们输入刚才转换的HEX编码,注意MessageBoxW是使用两个字节的UTF-8编码的,不能直接使用一个字节的ASCII编码值,所以刚才我们编写的54 69 74 6C 65要写成54 00 69 我们再空出来几行,01004A80这边再写一个,我们转换Hello World到HEX编码48 65 6c 6c 6f 20 57 6f 72 6c 64。 ? 我们按Ctrl + E跳转到入口点,我们选中01003E23这一行,我们修改这个汇编代码为jmp message_box。 ? ?

    44420

    深入理解计算机系统(3.6)------汇编的流程控制

    机器代码,提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。   那么本篇博客我们就来详细介绍汇编语言中的流程控制。 汇编代码,这些跳转的目的地通常用一个标号(label)指明。 产生目标代码文件汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码跳转指令的一部分。    如下图所示,jump 指令有三种跳转方式:   ①直接跳转跳转目标是作为指令的一部分编码的,比如上面的直接给一个标号作为跳转目标   ②间接跳转跳转目标是从寄存器或者存储器位置读出的,比如 jmp 5、循环    C 语言提供了多种循环结构,比如 do-while、whilefor。汇编没有相应的指令存在,我们可以用条件测试跳转指令组合起来实现循环的效果。

    46370

    深入理解计算机系统,汇编的流程控制

    机器代码,提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。  那么本篇文章我们就来详细介绍汇编语言中的流程控制。 汇编代码,这些跳转的目的地通常用一个标号(label)指明。 产生目标代码文件汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码跳转指令的一部分。   如下图所示,jump 指令有三种跳转方式:  ①直接跳转跳转目标是作为指令的一部分编码的,比如上面的直接给一个标号作为跳转目标  ②间接跳转跳转目标是从寄存器或者存储器位置读出的,比如 jmp * 汇编没有相应的指令存在,我们可以用条件测试跳转指令组合起来实现循环的效果。

    8350

    汇编算法介绍应用——递归下降算法分析

    回顾《反汇编算法介绍应用——线性扫描算法分析》,我们知道线性扫描一个很大的缺点是:因为其不知道程序执行流而导致将数据识别为代码。我们可能会骂这个算法不智能,那么如何才能智能起来呢? 那我们就将AB分支的地址的某一个优先分析,另一个延后分析。可是手心手背都是肉,我们如何取舍?这个时候,我们就要学习国羽国乒的做法——不惜“让球”,也要选择出最有利于目前流程顺利进行的方法。 如果我们jmp eax了而不知eax是啥,或者call、ret不知跳转地址,本次递归下降都会结束,并在延时反汇编列表寻找新的起始反汇编地址。         貌似我们的递归反汇编思路都讲完了。 还记得我《反汇编算法介绍应用——线性扫描算法分析》所说的递归下降算法缺陷么?它可能无法覆盖全部代码。 那么或许之后得靠跳转分支的分析结果再来纠正,这样还不如优先反汇编跳转分支。         说了这么多,再说说上面所说的如何利用call指令分析的缺陷。

    99510

    逆向工程——汇编基础

    什么是汇编 汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全机器语言一一对应。 汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。 接受汇编语言与高级语言的差异,而不是去指责它如何的不好读。 4。经验。要求你拥有任意其他编程语言的一点点编程经验。 5。头脑。脑子是个好东西。 这个寄存器也可以被装入任意数值,可通过入栈出站操作来赋值。 注意,一定不要在初学汇编阶段把这些寄存器弄混。段寄存器或选择器,没有指定的情况下都是使用默认的那个。 且Intel 80386的分段机制一直存在,无法屏蔽或避免。 REP(重复)、REPE(相等重复)、REPNE(不相等重复)、REPZ(为零重复)及 REPNZ(不为零重复)助记符都是可以添加到一些字符串指令的前缀。

    66410

    X86汇编语言的分支控制跳转指令

    使用高级语言例如java,C++,python来编写代码,我们使用最多的莫过于分支跳转控制语句,例如if..else, switch..case, for()等,本节我们看看这些分支跳转语句如何在X86 控制跳转指令,最常用的就是jmp指令,它让控制流直接跳转到具体设定的位置去执行那里的代码。这种跳转由于无需判断先决条件,因此也叫无条件跳转。 问题在于程序逻辑设计上通常需要满足固定条件的跳转,例如提到的if..else就属于这种类型。汇编语言层面就需要使用标志位来进行跳转前的条件判断。汇编语言层面可以实现多达三十多种的条件跳转方式。 这些指令执行时会改变寄存器ESIEDI的值,ESI指向数据的源地址,EDI指向数据的目的地址,同时寄存器ECX用于计数。 这几节介绍的汇编语言仅仅是一点点皮毛,剩下的还需要渴望掌握黑客技术或是希望掌握底层原理的同学自己去学习把握。

    81220

    二进制如何变成汇编语言

    —",都是"你好"的意思,只是编码方式不同。英语摩尔斯码的复杂度也不同,英文有 26 个字母以及各种发音,摩尔斯码只有"点""线",但它们可以传达相同的信息,计算机语言也类似。 纸上写好后,用"操作码表"把伪代码转成二进制机器码,翻译完成后,程序可以喂入计算机并运行。 所以汇编器不用固定跳转地址,而是让你插入可跳转的标签。当程序被传入汇编器,汇编器会自己搞定跳转地址,程序员可以专心编程,不用管底层细节,隐藏不必要细节来做更复杂的工作,我们又提升了一层抽象。 然而,即使汇编器有这些厉害功能,比如自动跳转汇编只是修饰了一下机器码。一般来说,一条汇编指令对应一条机器指令,所以汇编码底层硬件的连接很紧密。 汇编器仍然强迫程序员思考 用什么寄存器内存地址,如果你突然要一个额外的数,可能要改很多代码让我们想一想。

    1.7K30

    汇编算法介绍应用——线性扫描算法分析

    A、E这两个过程,我们需要提前确定代码开始处结束处。 既然知道了缺陷,那么充满极客的安全领域,自然有人会去研究利用。我们可以利用这个缺陷,让Windbg这类使用线性反汇编算法的工具分析出错误的结果。          那如何利用呢?         a 一条可以改变执行流的有效指令后插入无效信息         这儿所说的指令包括jmp,ja等跳转,以及ret等改变EIP的指令。          IDA(此处IDA有点智能,它判断了下ret之后的EIP是否为一个固定地址)         b 正常的流程识别错误         编译器将处理我们代码是有策略的,比如当我们switchcase 比较多的时候(我我的环境测试发现好像要超过2个case),switch case逻辑会使用跳转表来表达。

    72250

    小小的 likely 背后却大有玄机!

    今天我就来大家聊聊 likely、unlikely 是如何帮助性能提升的。 1. likely unlikely 咱们先来挖挖这对儿函数的底层实现。 if 中使用了 likely,也就是假设这个条件为真的概率更大。那么我们来看看它编译后的汇编码来看看。 图中上面红框内是对 if 的汇编结果,可见它使用的是 jne 指令。 注意,编译需要加 -O2 选项,使用 objdump -S 来查看汇编指令。为了方便大家使用,我把它写到 makefile 里了,测试代码一起放到了咱们的 Github 上了。 那大概率该位置处的指令还没有被加载到缓存(实践中一个分支下可能会包含很多代码,而不是像我这个例子简单的两三行),就避免不了从 L2 L3 甚至是速度更慢的 L3 去读取指令。 还拿上面编译出来的汇编码来举例,程序 cmp、jne、mov 几个指令是挨着的,那么 CPU 执行的时候实际是大概这样的。

    12810

    Operating System 14 - 分支预测分析

    分支预测分析 背景 业务高频调用代码段会出现条件判断语句, 因此联想cpu架构的分支预测功能, 进行简要分析. 分支预测 流水线能够同一个时钟周期处理多个步骤的充分条件是: 每个步骤相互独立, 不存在依赖关系. 指令流水, 处理器遇到分支指令, 不能在开始阶段就判断出分支结果, 即控制冒险(分支冒险). 避免控制冒险的方法: 1. 分支指令后插入流水线冒泡, 直到分支指令的流水执行完毕. ? 2. 使用分支预测(分支指令执行结束之前猜测哪一路分支将会被运行), 然后投机执行. Strategy 4: 维护没有分支跳转的表, 如果当前分支, 预测不跳转, 反之预测跳转. 使用-O3编译优化等级或开启-ftree-vectorize编译优化选项, 生成条件移动汇编指令. 逻辑代码模拟CMOV, 避免显式分支逻辑语句出现. 引用 [1] Filsinger, M.

    29230

    浅谈hook攻防

    当一个事件发生,如果您安装的是一个线程钩子,您进程的钩子函数将被调用。 这样,当指定的进程调用CreateFile()函数,就会首先跳转到我们的函数当中去执行流程,这样就完成了我们的HOOK了。 &threadId); return 0; } 这里首先启动程序 可以看到有两个线程 然后通过远程线程注入dll,这里显示dll已经注入成功,但是程序会退出,证明反调试成功 破 我们知道汇编里面进行跳转一般有两个硬编码 ,分别为E8E9,E8即为call,E9即为jmp 短跳转:机器码为2个字节E8 XX,E8是call的硬编码,XX是跳转范围-128~127 长跳转:机器码为5个字节E9 XX XX XX XX,E9 里面将钩子摘除,避免进入下一个循环的时候被检测到 void ExitProcessProc() { // 卸载瞬时 HOOK 避免被检测到 OutputDebugString("ExitProcess

    15710

    x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

    如下常见的 指令 OpCode 说明 ret 0xC3 返回 short jump 0xEB 短跳转 8位 far jump 0xEA 长跳转,可以4GB空间任意跳转 32位 je/jz 0x74 判断是否相等 只有Opcode必须的.前边的可以没有 2.1 instruction 说明 instruction prefixes 指令前缀. Reg/opcode 表示寄存器或者OpCode的编码 R/M 表示汇编第一个寄存器的编码. 可以是1个字节,可以是2个字节,或者4个字节. 2.6 immediate 立即数 immediate 是立即数 如: mov eax,1 32位占 1 2 4个字节. 32位指令最长可以支持17个字节. 二丶X64 汇编指令格式详解 x86图表 ? x64的图表 ?

    1.1K50

    详解汇编语言BLDR指令与相对跳转绝对跳转的关系

    为什么要有相对跳转绝对跳转? 2. 程序只有相对跳转/绝对跳转是否可以? 3. B(BL)执行过程分析 4. LDR指令执行过程分析 4. B(BL)LDR跳转范围是如何规定的? 1. 比如,主函数调用其他函数就是典型的跳转执行。其中跳转又分为绝对跳转相对跳转。 绝对跳转:直接跳转到一个固定的,实实在在的地址。 这样,绝对跳转的固定地址就很好理解了,要跳转地址的值链接就已经确定了,存在了一块内存。 而相对跳转,反汇编bl 33f00110的33f00110是根据pc计算出来的,当pc改变,结果也会改变。所以,称为相对跳转,与当前位置无关。 4. B(BL)LDR跳转范围是如何规定的?

    10630

    程序员需要了解的硬核知识之汇编语言(全)

    对栈进行数值的输入输出,数值的单位是4字节。因此,通过负责栈地址管理的 esp 寄存器中加上4的2倍8,就可以达到运行两次 pop 命令同样的效果。 与此相对的汇编代码就是通过比较指令(cmp) 跳转指令(jl)来实现的。 汇编语言中比较指令的结果,会存储 CPU 的标志寄存器。不过,标志寄存器的值,程序是无法直接参考的。那如何判断比较结果呢? 汇编语言中有多个跳转指令,这些跳转指令会根据标志寄存器的值来判断是否进行跳转操作,例如最后一行的 jl,它会根据 cmp ebx,10 指令所存储标志寄存器的值来判断是否跳转,jl 这条指令表示的就是 为了避免该bug,我们可以采用以函数或 C 语言代码的行为单位来禁止线程切换的锁定方法,或者使用某种线程安全的方式来避免该问题的出现。

    42420

    ring0下的Inline hook

    ring3的Inline hook之前已经实现过了,再看看ring0的Inline hook该如何实现。 ,所以这里我们找5个硬编码进行填入我们代码的操作,这里注意不能够找全局变量重定位的地址,否则在进行还原的过程可能地址已经发生改变导致程序不能够正常运行 mov ebp,esp xor eax,eax PServiceDescriptorTableEntry_t; __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; 这里我们再利用汇编来执行我们的汇编代码之后再 Old_code这个数组,这里我们编写UnHookNtOpenFile利用RtlCopyMemory写会到原内存即可 void UnHookNtOpenFile() { ULONG ChangeAddr ,加载驱动调用HookNtOpenFile,卸载驱动调用UnHookNtOpenFile即可 //卸载驱动 void DriverUnload(DRIVER_OBJECT* obj) {

    10610

    #x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

    如下常见的 指令 OpCode 说明 ret 0xC3 返回 short jump 0xEB 短跳转 8位 far jump 0xEA 长跳转,可以4GB空间任意跳转 32位 je/jz 0x74 判断是否相等 只有Opcode必须的.前边的可以没有 2.1 instruction 说明 instruction prefixes 指令前缀. Reg/opcode 表示寄存器或者OpCode的编码 R/M 表示汇编第一个寄存器的编码. 可以是1个字节,可以是2个字节,或者4个字节. 2.6 immediate 立即数 immediate 是立即数 如: mov eax,1 32位占 1 2 4个字节. 32位指令最长可以支持17个字节. 二丶X64 汇编指令格式详解 x86图表 ? x64的图表 ?

    64630

    扫码关注腾讯云开发者

    领取腾讯云代金券