如何看懂汇编语言

如何看懂汇编语言

前言

汇编语言,如狼似虎,底层语言,低级语言,很多人一看到汇编就头皮发麻,但是仔细推敲,另有一番风景。这里介绍一下看汇编语言的思路。

信息收集

工欲善其事必先利其器,在实际分析汇编代码的时候,要先弄清楚自己看的汇编语言是哪个种类。汇编语言有两种主要风格,不同的风格看的顺序也不同。就像都是汉语,东北话和粤语就是不同。

在格式上,汇编语言主要分为Inter格式和AT&T格式。两者的主要区别可以从寄存器的名字上看出。AT&T相较于Inter格式更加复杂,就像PHP有很多$符号一样,不能给人一种简洁的感觉。
下面是部分对比 , 详情请看这里

Intel 格式AT&T 格式
push 1pushl %eax
add eax, 1addl $1, %eax
mov eax, [ebp - 4]movl -4(%ebp), %eax

两者在看的时候mov的顺序不同,比如Inter格式是[eax]=[ebp - 4],返回值返回到指令mov后的第一个值,而AT&T却是返回到后面这个值,这是需要注意的。

好的指令参考

找一本好的指令参考,不需要全面,根据二八原则,涵盖20%主要指令即可。

尝试翻译

尝试把汇编语言翻译成C语言格式,比如如下汇编

00401006	push	offset String2	;	"2012"
0040100B	push	eax
0040100C	call	ds:__imp__lstrcmpW@8  ;  lstrcmpW(x, x)

改写成C语言

eax = lstrcmpW(eax, "2012");

这样就更容易理解了。

注释

在翻译过程中,还要不断根据自己的理解进行注释。

FAQ

  1. 汇编指令dword ptr ds:和dword ptr ss:的区别是什么?
    DS(Data Segment):数据段寄存器
    SS(Stack Segment):堆栈段寄存器
    ss是栈的段寄存器,指示了栈的地址,ds表示数据的段寄存器,指示了数据区的地址。

使用工具

静态分析IDA

IDA会将代码分区,以可视化的形式在界面上方展示,不同代码区块由不同颜色。

动态调试OllyDbg

使用思路
1、先找到程序入口点,对于32位程序,程序入口点一般在00401000的位置,这里显示的是汇编指令。
2、运行,单步调试。注意观察每一步的时候寄存器窗口值的变化,以及栈的变化(在这里可以很好地建立对栈的直观理解)
3、运行到有输出的地方或者有出错的地方的时候可以获得反馈。

后记

思路中最重要的是翻译思路,翻译成相近的C语言,好处多多。虽然要有些C语言的基础。如果不是汇编开发,可以多多先用写简单C语言,然后在linux下编译成汇编语言的形式,去查看理解。有通过C语言的逻辑去理解编译出来的汇编代码的逻辑。还有就是尝试实际写简单的汇编代码,这里建议结合硬件,嵌入式去学,这样比纯软件的汇编更有意思。

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值