blog1
汇编语言
余枫洁
字长
8Bit=1Byte 2Byte=1Word 2Word=1Dword 2Dword=1Qward
1.寄存器
32位寄存器有16个,分别是:
4个数据寄存器(EAX、EBX、ECX、EDX)。
2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。
6个段寄存器(ES、CS、SS、DS、FS、GS)。
1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。
4个数据寄存器为通用寄存器,有特殊用途但用处不大。ESI、EDI、SI和DI称为变址寄存器,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器。EBP、ESP、BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器。指令指针EIP、IP是存放下次将要执行的指令在代码段的偏移地址,标志寄存器目前只需了解ZF零标志位。
寻址方式
立即数寻址:MOV EAX,123H
寄存器寻址:MOV EAX,EBX
直接寻址:MOV EAX, [12345678H]
寄存器间接寻址:MOV EAX, [EBX]
乱七八糟寻址:MOV EAX,123[BX][SI]
汇编语言基本指令(需要熟练掌握的)
cmp a,b 比较a与b;
mov a,b 把b的值送给a;ret 返回主程序
nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面
(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop);
call 调用子程序;
je 或jz 若相等则跳(机器码74 或0F84);
jne或jnz 若不相等则跳(机器码75或0F85);
jmp 无条件跳(机器码EB);
jb 若小于则跳;
ja 若大于则跳;
jg 若大于则跳;
jge 若大于等于则跳;
jl 若小于则跳;
jle 若小于等于则跳;
pop 出栈;
push 压栈。
剩下的查询此链接
【CSDN博客】(https://blog.csdn.net/wangbaochu/article/details/41850779){:target="_blank"}
在ollydbg上的两个练习
(1)
先找到Hellow Word.exe文件的主函数,用F7、F8或字符串检索法寻找。
找到Hellow word复制其地址004092A0
在地址右键点击转到/表达式,确定就可以找到Hellow word的HEX数据进行修改来改变程序输出结果。
第二个任务直接右键点击汇编在图一选中项上,输入jmp与retn的地址,这样程序执行时就不会有弹窗。
(2)
修改fact.exe的错误,同样先找出主函数。
程序功能是数学阶乘运算,输入5发现输出为24,说明可能少乘一个5,分析可知图中这串代码是指大于等于输入值就弹出,所以讲jge(大于等于)改为ja(大于)。