汇编笔记【滴水逆向】

第一课(课程概要)

1.高级语言—(高级语言编译器)—>汇编语言—(汇编语言编译器)—>机器语言

2.不是语言变得强大了,而是编译器变得强大了

3.c和c++的关系:对于c++来讲,编译器替我们做的事情更多了;学习C语言是学好c++的基础

4.程序员的鄙视链

5.学习汇编可以了解程序的本质,而不是用汇编去编程

第二课(进制的概念)

1.为什么要学习进制:计算机只认识二进制,也就是0和1,为了更好地学习计算机,我们首先要深入理解什么是进制

2.学习进制的障碍:总是以十进制为依托去考虑其他进制,需要运算时也总是先转换成十进制(仅仅是因为我们对十进制熟悉,所以才转换);每一种进制都是完美的,想学好进制首先要忘掉十进制

3.N进制的定义:由N个符号组成(通常是[0,N-1]),逢N进1

4.进制的书写方法:“查数” 

5.进制的本质(可以用于加密)

0

第三课(进制运算)

1.八进制运算:

2+3=5         

2*3=6         

4+5=11        

4*5=24         

277+333=632         

276*54=20250

八进制加法表:

0

八进制乘法表:

0

第四课(二进制简写形式)

1.进制总结:每种进制都是完美的,它自身就是一个完整的体系,可以直接做运算

2.计算机为什么使用二进制:计算机时需要电的,电路只有两种状态:1真(通电) 0假(未通电)

3.计算机中存储的任何文件、接收的指令都是由0和1组成的,例如我们可以查看一个【*.exe应用程序】:

0

4.16进制是二进制的简写形式:

0

第五课(数据宽度)

1. 1双字(DoubleWord)=2字(Word)=4字节(Byte)=32位(bit)

0

2.存储范围:   

字节:0--0xFF    

字:0--0xFFFF

双字:0--0xFFFFFFFF

如果要存储的数据超过最大宽度,那么多余的数据将被丢弃(高位丢弃)

第六课(无符号数和有符号数)

1.无符号数:不存在负数,直接二进制转十进制

2.有符号数:正数和无符号数编码规则一样,负数以补码的形式在计算机中存储

3.编码规则:不同的文件有不同的编码规则:例如给你一串二进制数,你首先要问这一串二进制数存储的是什么(数字、文本、图像、音频、视频、还是应用程序?),如果是数字,再问是有符号还是无符号

第七课(原码反码和补码)

1.原码:最高位为符号位,其余各位为其数值本身的绝对值

2.反码:正数:反码与原码相同;负数:符号位为1,其余位对原码取反

3.补码:正数:反码与原码相同;负数:符号位为1,其余位对原码取反加1

4.“以什么方式去显示”

#include<stdio.h>

int main()
{
    unsigned char x = 0x9A;
    char y = 0x9A;    //%u的输出格式是unsigned int,所以9A会扩展成FFFFFF9A
    unsigned int z = 0xFFFFFF9A;
    printf("%u\n%u\n%u\n", x, y, z);
    return 0;
}

D:\software\DESKTOP\TEST\cmake-build-debug\test.exe
154
4294967194
4294967194

Process finished with exit code 0

5.编码规则

0

6.“砍一半”

0

第八课(位运算)

0

1.逻辑运算:

【与(and)】{1+1=1}

【或(or)】{1+0=1}

【非(not)】{~1=0}

【异或(xor)】{“两数不相同时”为1,“相同时”为0}

2.左移运算[shl]

3.右移[A:shr(>>)或B:sar(>>)]:各二进制位全部右移若干位,低位丢弃,高位A:(补零【逻辑右移】)或B:(补符号位【算术右移】)

第九课(计算机如何做运算)

1.计算机如何做加法:位运算(异或+与)

2.计算机如何做减法:减数以补码方式参与运算,变为加法

3.计算机如何做乘法:乘法的本质是加法

4.计算机如何做除法:除法的本质是减法

第十课(汇编环境搭建)

1.学汇编不是为了写代码,而是为了理解程序的本质

2.利用工具:OllyDbg或x64dbg

第十一、二课(通用寄存器)

1.存读数据速度:CPU>内存>硬盘

2.32位通用寄存器:EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI

0

3. ESP、EBP、EDI、ESI没有8位的

第十三、四课(内存)

0

1.内存地址:内存太大没法起名字,所以只能用编号,这个编号又称为内存地址,每一个编号对应一个字节的空间大小

2.内存地址的5种形式

PTR DS:[立即数]

PTR DS:[reg]

PTR DS:[立即数+reg]

PTR DS:[reg+reg*{1,2,4,8}]

PTR DS:[reg+reg*{1,2,4,8}+立即数]

第十五课(数据的存储模式)

0

0

第十六课(常用汇编指令)

0

0

0

0

0

0

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

0

0

第十七课(堆栈相关汇编指令)

1.什么是堆栈:就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用;和数据结构中的堆栈无关 

2.堆栈使用时先从大地址开始用,当使用完,如果再继续使用时,会发生堆栈溢出

3.ESP:栈顶指针寄存器

0

0

第十八课(修改EIP)

1.修改EIP的值:JMP,CALL;CALL与JMP区别:call在修改EIP值的同时,还把CALL指令的下一行地址PUSH到堆栈中

2.RET指令:栈顶指针加4,把原来栈顶指针中的值取出来放到EIP中

第十九课(拓展篇:反调试之Fake8)

1.单步步入(F7)和单步步过(F8)

2.本质:修改ESP的值

0

第二十、二十一课(汇编中的函数)

1.函数就是一系列指令的集合,为了完成某个会重复使用的特定功能

2.如何执行一个函数:JMP 或 CALL

3.一般来讲,返回值存到EAX中

第二十二课(堆栈平衡)

1.如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址

2.如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数变化导致的堆栈变化

3.内平栈(RETN XXX)和外平栈(add esp,XXX)

第二十三课(外挂的本质)

#include<stdio.h>
#include<windows.h>

void attack()
{
    printf("attack\n");
}

int main()
{
    getchar();
    while (1)
    {
       attack();
       Sleep(1000);
    }
    return 0;
}
//所谓外挂:修改Sleep()函数中的数值

第二十四课(ESP寻址)

1.使用寄存器传递参数

2.使用堆栈来传递参数

3.ESP寻址的缺点:程序执行过程中有通用寄存器或中间数据需要被压入栈中,ESP总是在变化

0

第二十五课(EBP寻址)

0

0

第二十六课(JCC指令

标志寄存器:CF(无符号数是否溢出或借位)、PF(最低有效字节包含1的个数是偶数还是奇数)、ZF(运算结果是否为0)、SF(运算结果是正还是负)、OF(有符号数是否溢出或借位)、DF(方向)

0

0

0

0

0

0

0

0

0

1.LAHF(Load AH with flags)指令:LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。

2.SAHF(store AH into flags)指令:用于将 AH 寄存器中的值存储回标志寄存器中。这允许程序在 AH 寄存器中设置标志位的值,然后使用 SAHF 指令将这些值还原到标志寄存器,从而影响后续的条件分支和控制流操作。

3.PUSHF(push the flags)指令:PUSHF 指令用于将标志寄存器的值压入堆栈中。

4.POPF(pop the flags)指令:POPF 指令用于从堆栈中弹出标志寄存器的值,并将这些值加载到标志寄存器中。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
嗨!对于逆向学习汇编语言的学习笔记,我可以给你一些基本的指导。首先,汇编语言是一种低级语言,它与计算机的底层硬件密切相关。逆向工程则是通过分析和理解已编译的程序来获取程序的内部信息。 以下是一些学习汇编语言逆向工程的建议: 1. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言逆向工程的过程中取得好成果!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NovFif

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

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

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

打赏作者

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

抵扣说明:

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

余额充值