如何看懂汇编语言
前言
汇编语言,如狼似虎,底层语言,低级语言,很多人一看到汇编就头皮发麻,但是仔细推敲,另有一番风景。这里介绍一下看汇编语言的思路。
信息收集
工欲善其事必先利其器,在实际分析汇编代码的时候,要先弄清楚自己看的汇编语言是哪个种类。汇编语言有两种主要风格,不同的风格看的顺序也不同。就像都是汉语,东北话和粤语就是不同。
在格式上,汇编语言主要分为Inter格式和AT&T格式。两者的主要区别可以从寄存器的名字上看出。AT&T相较于Inter格式更加复杂,就像PHP有很多$符号一样,不能给人一种简洁的感觉。
下面是部分对比 , 详情请看这里。
Intel 格式 | AT&T 格式 |
---|---|
push 1 | pushl %eax |
add eax, 1 | addl $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
- 汇编指令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语言的逻辑去理解编译出来的汇编代码的逻辑。还有就是尝试实际写简单的汇编代码,这里建议结合硬件,嵌入式去学,这样比纯软件的汇编更有意思。
更多推荐
如何看懂汇编语言
发布评论