二进制研究猿 发表于 2022-3-6 12:31

汇编笔记【滴水逆向】

               【滴水逆向】汇编笔记


第一课(课程概要):
1. 高级语言—(编译器)—>汇编语言—(编译器)—>机器语言
2. 不是语言变得强大了,而是编译器变得强大了
3. c和c++的关系:相比C语言,对于c++来讲,编译器替我们做的事情更多了;C语言是学好c++的基础
4. 程序员的“Chain of contempt”(无恶意,仅供一乐)
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


5.学习汇编可以了解程序的本质


第二课(进制):
为什么要学习进制:计算机只认识二进制,也就是0和1,为了更好地学习计算机,我们首先要深入理解什么是进制
学习进制的障碍:总是以十进制为依托去考虑其他进制,需要运算时也总是先转换成十进制(仅仅是因为我们对十进熟悉,所以才转换);每一种进制都是完美的,想学好进制首先要忘掉十进制,也要忘掉进制之间的转换
进制的定义:N进制的定义:由N个符号组成,逢N进1;例如
?
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

第三课(进制运算):
八进制运算:
2+3=5         2*3=6         4+5=11         4*5=24         277+333=632         276*54=20250

八进制加法表:
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

八进制乘法表:
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

进制总结:每种进制都是完美的,它自身就是一个完整的体系,可以直接做运算
计算机为什么使用二进制:计算机时需要电的,电路只有两种状态:1真(通电) 0假(未通电)
计算机中存储的任何文件、接收的指令都是由0和1组成的,例如我们可以查看一个【*.exe应用程序】:
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

16进制是二进制的简写形式:
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?


第四课(数据宽度):
1双字(DoubleWord)=2字(Word)=4字节(Byte)=32位(bit)
存储范围:   字节:0--0xFF    字:0--0xFFFF 双字:0--0xFFFFFFFF
如果要存储的数据超过最大宽度,那么多余的数据将被丢弃


第五、六课(无符号数和有符号数&&原码反码和补码):无符号数:不存在负数,直接2进制转十进制
有符号数:正数和无符号数编码规则一样,负数以补码的形式在计算机中存储
编码规则:不同的文件有不同的编码规则:例如给你一串二进制数:你首先要问这一串二进制数存储的是什么(数值、文本、图像、音频、视频、还是应用程序?),如果是数字,再问是有符号还是无符号
原码:最高位为符号位,其余各位为其数值本身的绝对值
反码:正数:反码与原码相同;负数:符号位为1,其余位对原码取反
补码:正数:反码与原码相同;负数:符号位为1,其余位对原码取反加1

第七课(计算机不会做加法):
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?


逻辑运算:【与(and)】{1+1=1}、【或(or)】{1+0=1}、【非(not)】{~1=0}、【异或(xor)】{两数不同时为1,同时为0}
左移运算:各二进制位全部左移若干位,高位丢弃,低位补零
右移:各二进制位全部由移若干位,低位丢弃,高位A:(补零)或B:(补符号位)

第八课(通用寄存器):
计算机如何做加法:
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


第九课(汇编环境搭建):
学汇编不是为了写代码,而是为了理解程序的本质
利用工具:Olldbg或x64dbg

第十课(通用寄存器):
存读数据速度:CPU>内存>硬盘
32位通用寄存器:EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI
MOV指令:mov 立即数,寄存器   或      mov 寄存器,立即数

?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


第十一课(内存):
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


内存地址:内存太大没法起名字,所以只能用编号,这个编号又称为内存地址
内存地址的5种形式
PTR DS:[立即数]

PTR DS:

PTR DS:[立即数+reg]

PTR DS:

PTR DS:

第十二课(数据的存储模式):
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
第十三课(常用汇编指令):
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==???
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?? ?
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==???data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
?
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==???data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


EFL:标志寄存器:其中第十位(DF)为0时,ESI和EDI运算完成后加1/2/4;第十位(DF)为1时,ESI和EDI运算完成后减1/2/4;
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

?
data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==???data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??




第十四课(堆栈):
什么是堆栈:就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用;和数据结构中的堆栈无关
堆栈使用时先从大地址开始用,当使用完,如果再继续使用时,会发生堆栈溢出
结合ollydbg查看堆栈
ESP:栈指针寄存器
修改EIP的值:JMP,CALL;CALL与JNP区别:call在修改EIP值的同时,还把CALL指令下一行的地址存到堆栈中
RET指令:栈顶指针加4,把原来栈顶指针中的值取出来放到EIP中
第十五课(拓展篇:反调试之Fake8):

单步步入(F7)和单步步过(F8)
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

第十六课(汇编中的函数):

函数就是一系列指令的集合,为了完成某个会重复使用的特定功能
如何执行一个函数:JMP或CALL
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
一般来讲,返回值存到EAX中

第十七课(堆栈平衡):

如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址
如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数变化导致的堆栈变化
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??

第十八课(ESP寻址):

1.使用寄存器传递参数

2.使用堆栈来传递参数
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


第十九课(EBP寻址、JCC指令):

1.
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??


2.
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??
?data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==??



dUMBfkIv 发表于 2022-3-6 14:53

看着很不错,回复一个看看

DzOqvIoNAW 发表于 2022-3-6 12:31

谢谢分享

YKkUuXp10 发表于 2022-3-6 16:03

谢谢分享

lckgqYZoNb 发表于 2022-3-6 16:06

谢谢分享

fyh505099 发表于 2022-3-6 16:09

感谢分享 跟着学习一下

JAtx 发表于 2022-3-6 16:09

每天都能学到新知识,赞!

cmxub 发表于 2022-3-6 16:11

感谢楼主的热心分享

uYE05 发表于 2022-3-6 16:28

感谢楼主

PbE35648 发表于 2022-3-6 16:28

谢谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 汇编笔记【滴水逆向】