本文是滴水8年前的课程学习笔记,由于感觉比较老了,因此也参考了很多别的大佬比较新的文章
逆向不同于web,技术更新没那么快,请各位不用太担心本文跟不上时代
视频地址:https://www.bilibili.com/video/BV1w54y1y7Di
个人总结,众口难调,不喜勿喷
前言
进制比较简单,也是大学必修的一课,简单回顾一下,后面涉及寄存器与汇编,刚接触觉得很难,不过熟悉就好了。
什么是进制
进制是一种计算机中常用的数制,用于表示数据的方式。它由一组特定的符号组成,符号的数量即为该进制的基数。例如,二进制是由0和1两个符号组成的,逢二进一;八进制是由0-7八个符号组成的,逢八进一。
进制可以用于计算机内部的数据表示和计算,因为它能够将数据以一种固定的方式进行编码,从而方便计算机进行计算和存储。二进制的广泛应用是因为它的精度高、易于实现,因此在计算机科学中得到了广泛应用。进制的核心是数的表示方法,即使用特定的符号来表示一组数字。例如,在二进制中,每个数都是由0和1的组合表示的;在八进制中,每个数都是由0-7的数字表示的。这种表示方法使得计算机可以快速、准确地处理数据。
二进制和十六进制之间的对应关系
逆向工作时,我们接触到的进制都是16进制,但二进制作为底层的运算进制,也很重要,因此二进制和十六进制之间的对应关系需要我们熟练掌握
任何一个16进制的符号都可以理解成对应着四位的二进制数,而16进制数恰好是由16个符号组成,分别是0123456789abcdef。其中,二进制中的0000对应十六进制中的0,二进制中的0001对应十六进制中的1,以此类推,直到二进制中的1111对应十六进制中的f。
进制数转换为一个十六进制数。下面是一些步骤:
-
将二进制数按照从右到左的顺序每四位为一组进行分组。如果最后不足四位,则在左侧添加零,直到长度为四位。
-
每组四位二进制数可以转换为一位十六进制数。具体转换规则如下:0000 - 0 0001 - 1 0010 - 2 0011 - 3 0100 - 4 0101 - 5 0110 - 6 0111 - 7 1000 - 8 1001 - 9 1010 - A 1011 - B 1100 - C 1101 - D 1110 - E 1111 - F (记下)
-
将所有转换后的十六进制数连接起来,即可得到最终的十六进制数。例如,将二进制数 1101001 转换为十六进制数:分组:1 101 001 转换:116^2 + 516^1 + 9*16^0 = 6B所以,二进制数 1101001 转换为十六进制数为 6B
如果各位对进制有任何疑惑,建议看看:https://baike.baidu.com/item/%E8%BF%9B%E5%88%B6/317457
数据宽度的概念
在计算机科学中,数据宽度主要指的是在计算机内部进行运算或存储数据时使用的二进制位数。例如,一个4位的二进制数可以表示0到15的数。数据宽度是计算机存储和处理数据的基础,它决定了计算机的性能和速度
无论是媒体文件还是执行文件,在计算机眼里都是0,1
下面我们理解一下四位二进制
你可以有两种看法
有符号与无符号,有符号即取出一位作为正负号,范围:-23~24
无符号,即从零开始表示数字,范围:0~2**4
当F+1,那么就可以理解为最后一位+1=0,因为其只能存四位数
以此类推:
8位
16位
32位
数据宽度单位
位(Bit)、字节(Byte)、字(Word)、双字(Doubleword)等,它们的二进制位数分别为1、8、16、32。这些数据单位的具体换算可以参考对应二进制的位数。
逻辑运算
or ( | )
and (&)
xor ( ^ )
2+3运算过程:
-
把2和3转换为二进制,然后进行"异或"运算,得到0001。2. 把2和3进行"与"运算,得到0010。把0010左移一位得到0100。3. 判断左移一位后得到的结果是否为0。如果为0,则前一步异或所得的结果就是最终结果,如果不为0,则把前一步异或得到的结果和后一步与运算并左移一位的结果再次进行"异或"操作。4. 把0001和0100进行"异或"得到结果0101。5. 把0001和0100进行一次"与"运算,得到结果为0000。把0000左移一位后得到的结果为0,所以2+3所得最终结果为0101,转换为十进制为5。
(了解即可)
寄存器
介绍
https://baike.baidu.com/item/%E5%AF%84%E5%AD%98%E5%99%A8/187682?fr=ge_ala
32位通用寄存器:
从上到下挨着顺序记,编号也记住后面硬编码要用,用途先不管
还有就是要知道AX是什么,AH,AL是什么
下面图可以方便大家理解一下
OD的使用
OD是一个动态的反汇编调试工具 它可以将可执行文件的二进制代码转换成汇编指令
下载地址:https://www.52pojie.cn/thread-350397-1-1.html
这里内容比较多,我找了
可以看看:
https://blog.csdn.net/m0_59673895/article/details/127902568
https://blog.csdn.net/whl0071/article/details/123034792
一定要自己实践!!!!
汇编指令
1 . mov
格式:mov eax,0xAAAAAAAA
指令中mov叫操作码,eax叫目标操作数,0xAAAAAAAA叫源操作数。
作用:mov指令就是将源操作数复制一份放到目标操作数
官方语法:
r 通用寄存器;m 代表内存;imm 代表立即数;r8 代表8位通用寄存器;m8 代表8位内存;imm8 代表8位立即数
MOV r8/m8,r8 #可以将8位通用寄存器中的值存入8位通用寄存器或者8位内存中
MOV r16/m16,r16
MOV r32/m32,r32
MOV r8,r8/m8 #可以将8位通用寄存器或者8位内存中的值存入8位寄存器中
MOV r16,r16/m16
MOV r32,r32/m32
MOV r8,imm8 #将一个8位的立即数存入8位通用寄存器中
MOV r16,imm16
MOV r32,imm32
2.add
格式:与mov类似,有操作码,目标操作数和源操作数构成
作用:将目标操作数与源操作数相加,将结果存入到目标操作数
ADD r8/m8,imm8
ADD r16/m16,imm16
ADD r32/m32,imm32
ADD r16/m16,imm8 #源操作数与目标操作数可以不一致!!
ADD r32/m32,imm8
ADD r8/m8,r8
ADD r16/m16,r16
ADD r32/m32,r32
ADD r8,r8/m8
ADD r16,r16/m16
ADD r32,r32/m32
3.sub
格式:操作码 目标操作数,源操作数
作用:将目标操作数减源操作数的结果存入目标操作数
SUB r8/m8,imm8 #8,16,32位都可以
SUB r8/m32,imm32 #源操作数与目标操作数宽度可以不一致
SUB r32/m32,r32
SUB r32,r32/m32
4.and(&)
格式:操作码 目标操作数,源操作数
作用:目标操作数与源操作数做与逻辑运算,将结果存入目标操作数
AND r8/m8, imm8
AND r16/m16,imm16
AND r32/m32,imm32
AND r16/m16, imm8
AND r32/m32, imm8
AND r8/m8, r8
AND r16/m16, r16
AND r32/m32, r32
AND r8, r8/m8
AND r16, r16/m16
AND r32, r32/m32
5.or ( | )
作用:目标操作数与源操作数做或逻辑运算,将结果存入目标操作数
OR r8/m8, imm8
OR r16/m16,imm16
OR r32/m32,imm32
OR r16/m16, imm8
OR r32/m32, imm8
OR r8/m8, r8
OR r16/m16, r16
OR r32/m32, r32
OR r8, r8/m8
OR r16, r16/m16
OR r32, r32/m32
6.xor
作用:目标操作数与源操作数做亦或逻辑运算,将结果存入目标操作数(后面加密解密时经常使用)
XOR r8/m8, imm8
XOR r16/m16,imm16
XOR r32/m32,imm32
XOR r16/m16, imm8
XOR r32/m32, imm8
XOR r8/m8, r8
XOR r16/m16, r16
XOR r32/m32, r32
XOR r8, r8/m8
XOR r16, r16/m16
XOR r32, r32/m32
7.not
单目运算
作用:操作数做非逻辑运算,将结果存入操作数中
NOT r8/m8
NOT r16/m16
NOT r32/m32
原文始发于微信公众号(Zacarx随笔):逆向基础(1):进制,数据与运算
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论