为什么我们需要了解x86机器码

先来一句灵魂拷问:现在的编程语言都做得像吃饭睡觉一样简单了,为什么我们还要花功夫了解底层的x86机器代码?先别着急,我们先看看今天的内容。

下一次你可能会发现自己在调试汇编代码(对于我们中的某些人来说,可能唯一可用的调试方式就是汇编代码了),下面我列举了一些常见的机器代码以及它们”狡猾”的地方,供大家参考。

90

这是一个单字节的无操作(NOP)操作码。如果你希望给现有的代码打一些补丁,则可以无脑地使用这个操作码来替换现有代码。当然了,如果需要还原之前的版本,则你必须将旧版本的指令码替换回去。

CC

这是一个单字节的INT 3 操作码,它用来触发中断到调试器。

74/75

它们是JZ和JNZ的操作码。如果你希望反转一段代码流程,可以使用它们来进行互相替换。其他类似的组合有:72/73(JB/JNB),76/77(JBE/JA),7C/7D(JL/JGE)和7E/7F(JLE/JG)。你并不需要记住这些值,只需要明白,将这些位反转就会导致代码执行流的反转,如果需要撤销反转,则只需要还原这个位反转就可以了。

EB

这个是一个非条件性的短地址跳转(Unconditional Short Jump)指令。如果你希望将一个条件性跳转转换为一个非条件性跳转,则可以将74(假设)修改为EB。如果需要撤销,则你必须得记得之前的操作码字节。

00

换句话说,如果你想将一个条件性短地址跳转转换为一个直接跳转(Never-taken Jump),则你可以将指令的第二个字节修改为0。举个例子,”74 1C”就修改为”74 00″。这个跳转依然有效,只不过它仅仅是跳转到下一条指令,因此它没有任何有实际意义的效果。如果想撤销它,则需要记得修改之前的跳转偏移值。

B8/E8

这些操作码主要用于”MOV EAX, immed32″和”CALL”指令。我经常用它们来去除函数调用指令。如果你想跳过一些函数跳转,除了使用上面所说的将它们替换为90之外,还可以将E8修改为B8。如果想撤销它,则可以将B8修改为E8。

特别需要指出的是,这个方法值对于不包含有栈参数的函数,否则,如果你这样做的话,函数的栈就会遭到破坏。更一般地,你可以使用 83 C4 XX 90 90 (ADD ESP, XX; NOP; NOP) 其中 XX 是你需要弹出(pop)的字节数。 就我个人而言,我不记得这些指令的机器代码,所以我倾向于重写 CALL 指令,以便它在函数末尾调用”RETD”。

我更喜欢这些单字节补丁,而不是用90进行批量擦除,因为将代码恢复到之前的版本更加简单。

总结

了解事物的本质,有助于我们做出更加符合远期目标的决定。
当你的程序出现了预想不到的行为,别害怕,慢慢来:通过研究代码(底层汇编,甚至机器码),最终一定可以找出那只捣乱的老鼠。
在拓扑梅尔智慧办公平台(Topomel Box)的开发过程中,我也碰到过无数的Bug,首选方式,还是通过断点来一行一行的调试代码来定位问题。因为我对汇编语言了解不多,汇编这块应用就比较少,但也有一些涉猎,例如程序的反调试这块。

我相信,一切事物都有原因。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Advantages of knowing your x86 machine code》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ASM指令机器码对照表是一种将汇编语言指令与对应的机器码进行一一对照的表格,用于指导程序员将高级语言编写的指令转化为计算机可以执行的二进制代码。每条汇编指令都有其对应的机器码,在计算机中被理解为一系列的0和1。 ASM指令机器码对照表的编制根据不同的体系结构和指令集架构而有所差异。例如,对于x86架构的计算机,汇编语言指令与机器码的对照表由处理器制造商提供,并根据不同的处理器型号和指令集进行分类。 在ASM指令机器码对照表中,通常会列出每条汇编指令的助记符(mnemonic)、操作码(opcode)以及操作数(operand)等信息。助记符用来表示一条汇编指令的操作类型,操作码表示该指令在机器码中所对应的二进制数值,而操作数则表示指令要操作的寄存器、内存地址或立即数等。 通过查表,程序员可以将汇编指令翻译为对应的机器码,从而编写出可执行的机器指令代码。在编写汇编语言程序时,程序员需要参考ASM指令机器码对照表,将高级语言指令翻译为对应的机器码,以便计算机能够准确地执行程序。 总之,ASM指令机器码对照表是程序员编写汇编语言程序的重要参考工具,它能够帮助程序员将高级语言指令转化为计算机可以识别和执行的机器码,从而实现程序的功能。了解和掌握ASM指令机器码对照表的使用方法对于汇编语言程序员而言至关重要。 ### 回答2: ASM指令机器码对照表是一种将汇编语言指令与相应机器码进行映射的参考表格。在计算机系统中,计算机只能理解和执行机器码,而汇编语言是与机器码直接对应的低级语言。汇编语言指令是用简单易懂的助记符表示的,但是计算机需要将这些指令转换为二进制的机器码才能执行。 ASM指令机器码对照表的目的是提供一种快速查询的工具,以便程序员在编写汇编代码时能够轻松地确定每个指令的对应机器码。该表通常以表格形式列出汇编指令和对应的机器码。 例如,对于一条MOV指令(将数据从一个位置复制到另一个位置),在ASM指令机器码对照表中,我们可以找到对应的机器码,如MOV R1, R2的机器码可能是1010 0000 0001 0010,具体受到计算机体系结构和编译器的影响。 在编写汇编程序时,程序员可以通过查阅ASM指令机器码对照表,将汇编指令转换为机器码,进而编写出正确的机器码指令。这对于编写底层程序或进行调试十分重要。 总之,ASM指令机器码对照表是一种帮助程序员将汇编指令转化为机器码的参考工具,使得编写汇编语言程序更加高效、准确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拓扑梅尔-漫漫开发路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值