反汇编

IDA Pro Avanced

是一个极好的反汇编工具

IDA:

一个高效的反汇编工具

反汇编(Disassembly):把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。
简单的说
就是通过读取并翻译一个可执行文件的二进制码
将这个可执行文件还原成汇编语言代码

可执行文件从源代码编译过来,已经面目全非了
在没有源代码的情况下想调试一个程序或者探究程序中的一些东西
就需要反汇编
由于可执行程序的内容是供CPU执行的二进制代码
而汇编语言又是和机器码一一对应的(“机器码是用二进制代码编成的,但二进制代码不一定就是机器码.”)
所以直接把可执行程序反编译成汇编代码是很有效的一种调试和分析方法
“反汇编通俗讲就是把已编译的可执行文件通过处理还原为汇编代码,对于CPU来说,所有可执行文件的最终形式就是这一条条的汇编指令.”

个人理解:

反汇编通俗讲就是把已编译的可执行文件通过处理还原为汇编代码,对于CPU来说,所有可执行文件的最终形式就是这一条条的汇编指令.

其实CPU执行的二进制代码(还是机器码)
只不过汇编语言又是和机器码一一对应
所可以说成是CPU 执行一条条的汇编指令!

汇编学习

进程和线程的区别(超详细)

进程和线程的区别(超详细)

进程与线程的区别总结
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

总结:

总结:
就是进程就是平常的.exe!
再一个进程里可以有多个线程!

多线程:在同一个进程中同时运行的多个任务
多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。

多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程

就是多线程其实!就是多个线程同时抢夺CPU资源!
同一时刻CPU只能处理一个线程!
因为线程与CPU切换太快!就可以认为是多个线程同时运行的!!!

在这里插入图片描述

多线程

机器码是什么

机器码指的是,将硬件序列号经过一系列加密、散列之后形成的一串序列号。一般情况下硬盘和CPU都有一个无法修改的识别码,这是为了防止盗版。
https://www.yebaike.com/16/202006/177245.html

https://blog.csdn.net/lenhan12345/article/details/1493129

https://blog.csdn.net/weixin_30808575/article/details/99396937?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=%E6%B1%87%E7%BC%96%E8%8F%9C%E9%B8%9F

https://ctf-wiki.org/pwn/linux/stackoverflow/stack-intro/

bit、byte、位、字节、汉字的关系

字节(Byte):通常将可表示常用英文字符8位二进制称为一字节。

一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.
符号:英文标点2占一个字节,中文标点占两个字节.

1字节(Byte) = 8位(bit)

比特(Bit),亦称二进制位。新港台:位元

比特指二进制中的一位,是二进制最小信息单位。
1比特就是1位

字节  

  字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
  字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。
  在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
  符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小
  一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,如一个ASCII码就是一个字节,此类单位的换算为:
  1千吉字节(TB,Terabyte)=1024吉字节(2的40次方字节)
  (1TB=1024GB)
  1吉字节(GB,Gigabyte)=1024兆字节(2的30次方字节)
  (1GB=1024MB)
  1兆字节(MB,Megabyte)=1024千字节(2的20次方字节)
  (1MB=1024KB)
  1千字节(KB,Kilobyte)=1024字节(2的10次方字节)(1KB=1024B)
  1字节(Byte)= 8位(bit)
  注:TB是现在电脑硬盘最大的存储量单位。10TB大约等于一个人脑的存储量。
  更大的单位,还有 PB(Petabyte,1PB=1024TB)、EB(Exabyte,1EB=1024PB)、ZB(Zettabyte,1ZB=1024EB)、YB(Yottabyte,1YB=1024ZB)……

字符  

  字符是可使用多种不同字符方案或代码页来表示的抽象实体。例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列。公共语言运行库使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)表示字符。
  针对公共语言运行库的应用程序使用编码将字符表式形式从本机字符方案映射至其他方案。应用程序使用解码将字符从非本机方案映射至本机方案。
  电脑和通讯设备会使用字符编码的方式来表达字符。意思是指,会将一个字符指定给某个某西。传统上,是代表整数量的位元序列,如此,则可透过网络来传输,同时亦便于储存。两个常用的例子是ASCII和用于统一码的UTF-8。根据谷歌的统计,UTF-8是目前最常用于网页的编码方式。[1]相较于大部分的字符编码把字符对应到数字或位元串,摩斯密码则是使用不定长度的电子脉冲的序列来表现字符。
  要弄清字符要想弄清字.你问什么是字符?那你怎么不问什么是字呢?字符就好像一个统称.

计算机中的位

  二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。

比特

  1) 计算机专业术语,是信息量单位,是由英文BIT音译而来。二进制数的一位所包含的信息就是一比特,如二进制数0101就是4比特。
  2)二进制数字中的位,信息量的度量单位,为信息量的最小单位。数字化音响中用电脉冲表达音频信号,“1”代表有脉冲,“0”代表脉冲间隔。如果波形上每个点的信息用四位一组的代码表示,则称4比特,比特数越高,表达模拟信号就越精确,对音频信号信号还原能力越强。

总结:

看了学到好多!

int是4个字节

一个字符(a)就是一个字节!!!

流量最开始是1KB=1024B

现在都是1TB 这里面的B就是字节!可以传输很多数据!

字符呢:

字符有很多,但是计算机怎么识别呢!:

Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列

如:

一个英语字符(a)!可以UTF-8 编码转换为8位二进制!这样计算机就可以识别了!

汉字可以UTF-16 编码将字符表示为 16 位二进制!

字符编码笔记:ASCII,Unicode 和 UTF-8

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html