博客园 - BattleHeart
uuid:24b78886-0ed1-41c2-8670-e3f31dcf42c4;id=55019
2021-06-15T02:06:07Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
feed.cnblogs.com
https://www.cnblogs.com/dwlsxj/p/ArrayDeque.html
ArrayDeque原理详解 - BattleHeart
介绍 ArrayDeque是双向队列,线程不安全的双向队列,长度可以自己扩容的双向队列,并且长度需要是2的幂次方,双端主要是头部和尾部两端都可以进行插入删除和获取操作,该实现类实现了Deque接口,Deque接口提供了双向队列需要实现的方法,接口提供了从头部插入、尾部插入,从头部获取、尾部获取以及删
2021-06-15T02:01:00Z
2021-06-15T02:01:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】介绍 ArrayDeque是双向队列,线程不安全的双向队列,长度可以自己扩容的双向队列,并且长度需要是2的幂次方,双端主要是头部和尾部两端都可以进行插入删除和获取操作,该实现类实现了Deque接口,Deque接口提供了双向队列需要实现的方法,接口提供了从头部插入、尾部插入,从头部获取、尾部获取以及删 <a href="https://www.cnblogs.com/dwlsxj/p/ArrayDeque.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/CountDownLatch.html
CountDownLatch原理详解 - BattleHeart
CountDownLatch是一种同步辅助,让我们多个线程执行任务时,需要等待线程执行完成后,才能执行下面的语句,之前线程操作时是使用Thread.join方法进行等待,CountDownLatch内部使用了AQS锁,前面已经讲述过AQS的内部结构,其实内部有一个state字段,通过该字段来控制锁的操作,CountDownLatch是如何控制多个线程执行都执行结束?其实CountDownLatch内部是将state作为计数器来使用,比如我们初始化时,state计数器为3,同时开启三个线程当有一个线程执行成功,每当有一个线程执行完成后就将state值减少1,直到减少到为0时,说明所有线程已经执行完毕。
2021-06-09T08:44:00Z
2021-06-09T08:44:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】CountDownLatch是一种同步辅助,让我们多个线程执行任务时,需要等待线程执行完成后,才能执行下面的语句,之前线程操作时是使用Thread.join方法进行等待,CountDownLatch内部使用了AQS锁,前面已经讲述过AQS的内部结构,其实内部有一个state字段,通过该字段来控制锁的操作,CountDownLatch是如何控制多个线程执行都执行结束?其实CountDownLatch内部是将state作为计数器来使用,比如我们初始化时,state计数器为3,同时开启三个线程当有一个线程执行成功,每当有一个线程执行完成后就将state值减少1,直到减少到为0时,说明所有线程已经执行完毕。 <a href="https://www.cnblogs.com/dwlsxj/p/CountDownLatch.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/delayedQueue.html
DelayQueue延迟队列原理剖析 - BattleHeart
DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现Delayed接口的元素,实现接口后相当于是每个元素都有个过期时间,当队列进行take获取元素时,先要判断元素有没有过期,只有过期的元素才能出队操作,没有过期的队列需要等待剩余过期时间才能进行出队操作。
##
2021-06-07T14:44:00Z
2021-06-07T14:44:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现Delayed接口的元素,实现接口后相当于是每个元素都有个过期时间,当队列进行take获取元素时,先要判断元素有没有过期,只有过期的元素才能出队操作,没有过期的队列需要等待剩余过期时间才能进行出队操作。
## <a href="https://www.cnblogs.com/dwlsxj/p/delayedQueue.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/PriorityBlockingQueue.html
浅析PriorityBlockingQueue优先级队列原理 - BattleHeart
PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素。其实内部是由平衡二叉树堆来进行排序的,先进行构造二叉树堆,二叉树堆排序出来的数每次第一个元素和最后一个元素进行交换,这样最大的或最小的数就到了最后面,然后最后一个不变,重新构造前面的数组元素以此类推进行堆排序。默认比较器是null,也就是使用队列中元素的compareTo方法进行比较,意味着队列元素要实现Comparable接口。
2021-06-01T11:47:00Z
2021-06-01T11:47:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素。其实内部是由平衡二叉树堆来进行排序的,先进行构造二叉树堆,二叉树堆排序出来的数每次第一个元素和最后一个元素进行交换,这样最大的或最小的数就到了最后面,然后最后一个不变,重新构造前面的数组元素以此类推进行堆排序。默认比较器是null,也就是使用队列中元素的compareTo方法进行比较,意味着队列元素要实现Comparable接口。 <a href="https://www.cnblogs.com/dwlsxj/p/PriorityBlockingQueue.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/reentrantlock-principle-nonfairsync.html
图解AQS原理之ReentrantLock详解-非公平锁 - BattleHeart
并发编程中,`ReentrantLock`的使用是比较多的,包括之前讲的`LinkedBlockingQueue`和`ArrayBlockQueue`的内部都是使用的`ReentrantLock`,谈到它又不能的不说AQS,AQS的全称是`AbstractQueuedSynchronizer`,这个类也是在`java.util.concurrent.locks`下面,提供了一个FIFO的队列,可以用于构建锁的基础框架,内部通过原子变量`state`来表示锁的状态,当`state`大于0的时候表示锁被占用,如果state等于0时表示没有占用锁,`ReentrantLock`是一个重入锁,表现在`state`上,如果持有锁的线程重复获取锁时,它会将`state`状态进行递增,也就是获得一个信号量,当释放锁时,同时也是释放了信号量,信号量跟随减少,如果上一个线程还没有完成任务,则会进行入队等待操作。
2019-07-13T07:00:00Z
2019-07-13T07:00:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】并发编程中,`ReentrantLock`的使用是比较多的,包括之前讲的`LinkedBlockingQueue`和`ArrayBlockQueue`的内部都是使用的`ReentrantLock`,谈到它又不能的不说AQS,AQS的全称是`AbstractQueuedSynchronizer`,这个类也是在`java.util.concurrent.locks`下面,提供了一个FIFO的队列,可以用于构建锁的基础框架,内部通过原子变量`state`来表示锁的状态,当`state`大于0的时候表示锁被占用,如果state等于0时表示没有占用锁,`ReentrantLock`是一个重入锁,表现在`state`上,如果持有锁的线程重复获取锁时,它会将`state`状态进行递增,也就是获得一个信号量,当释放锁时,同时也是释放了信号量,信号量跟随减少,如果上一个线程还没有完成任务,则会进行入队等待操作。 <a href="https://www.cnblogs.com/dwlsxj/p/reentrantlock-principle-nonfairsync.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/java-thread-pool-principle.html
Java线程池原理浅析 - BattleHeart
为了避免频繁重复的创建和销毁线程,我们可以让这些线程进行复用,在线程池中,总会有活跃的线程在占用,但是线程池中也会存在没有占用的线程,这些线程处于空闲状态,当有任务的时候会从池子里面拿去一个线程来进行使用,当完成工作后,并没有销毁线程,而是将将线程放回到池子中去。
2019-07-12T02:32:00Z
2019-07-12T02:32:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】为了避免频繁重复的创建和销毁线程,我们可以让这些线程进行复用,在线程池中,总会有活跃的线程在占用,但是线程池中也会存在没有占用的线程,这些线程处于空闲状态,当有任务的时候会从池子里面拿去一个线程来进行使用,当完成工作后,并没有销毁线程,而是将将线程放回到池子中去。 <a href="https://www.cnblogs.com/dwlsxj/p/java-thread-pool-principle.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/synchronousqueue-unfair-pattern.html
图解SynchronousQueue原理详解-非公平模式 - BattleHeart
前面已经讲解了公平模式的内容,今天来讲解下关于非公平模式下的SynchronousQueue是如何进行工作的,在源码分析的时候,先来简单看一下非公平模式的简单原理,它采用的栈这种FILO先进后出的方式进行非公平处理,它内部有三种状态,分别是REQUEST,DATA,FULFILLING,其中REQUEST代表的数据请求的操作也就是take操作,而DATA表示的是数据也就是Put操作将数据存放到栈中,用于消费者进行获取操作,而FULFILLING代表的是可以进行互补操作的状态,其实和前面讲的公平模式也很类似。
2019-05-18T15:06:00Z
2019-05-18T15:06:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】前面已经讲解了公平模式的内容,今天来讲解下关于非公平模式下的SynchronousQueue是如何进行工作的,在源码分析的时候,先来简单看一下非公平模式的简单原理,它采用的栈这种FILO先进后出的方式进行非公平处理,它内部有三种状态,分别是REQUEST,DATA,FULFILLING,其中REQUEST代表的数据请求的操作也就是take操作,而DATA表示的是数据也就是Put操作将数据存放到栈中,用于消费者进行获取操作,而FULFILLING代表的是可以进行互补操作的状态,其实和前面讲的公平模式也很类似。 <a href="https://www.cnblogs.com/dwlsxj/p/synchronousqueue-unfair-pattern.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/Thread.html
图解SynchronousQueue原理-公平模式 - BattleHeart
SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是交换通道,提供者和消费者是需要组队完成工作,缺少一个将会阻塞线程,知道等到配对为止。
SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。
对于SynchronousQueue来说,他的put方法和take方法都被抽象成统一方法来进行操作,通过抽象出内部类Transferer,来实现不同的操作。
2019-05-11T12:08:00Z
2019-05-11T12:08:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是交换通道,提供者和消费者是需要组队完成工作,缺少一个将会阻塞线程,知道等到配对为止。
SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。
对于SynchronousQueue来说,他的put方法和take方法都被抽象成统一方法来进行操作,通过抽象出内部类Transferer,来实现不同的操作。 <a href="https://www.cnblogs.com/dwlsxj/p/Thread.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/Git-Index.html
小丁是怎样入门git的 - BattleHeart
既然没有华丽的出场,那就平凡的分享,首先我要说明一点本篇文章针对Git初学者,对我自己学Git的资源的整合,其实本篇索引应该在我写Git系列文章的时候就紧跟着放上索引的,由于时间问题没有来得及整理,这里我详细整理下文章内容。其实说到git的文章已经很多了,这里分享下我的学习过程和自己摸索的过程。
2016-03-11T15:18:00Z
2016-03-11T15:18:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】既然没有华丽的出场,那就平凡的分享,首先我要说明一点本篇文章针对Git初学者,对我自己学Git的资源的整合,其实本篇索引应该在我写Git系列文章的时候就紧跟着放上索引的,由于时间问题没有来得及整理,这里我详细整理下文章内容。其实说到git的文章已经很多了,这里分享下我的学习过程和自己摸索的过程。 <a href="https://www.cnblogs.com/dwlsxj/p/Git-Index.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/git-remote.html
小丁带你走进git世界五-远程仓库 - BattleHeart
一、文件,指令讲解
首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库里面新建了version.txt内容也是一样的v1.0:
2016-01-14T13:22:00Z
2016-01-14T13:22:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】一、文件,指令讲解
首先讲一下远程仓库和本地仓库在文件上面的区别,首先我们来看下对比图(当然这里说的区别是在于.git文件下面的文件内容,至于里面内容我们不会关注)這裡我们进行了相同的操作就是本地仓库里面新建了version.txt内容也是一样的v1.0: <a href="https://www.cnblogs.com/dwlsxj/p/git-remote.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/git-remend-history-log.html
小丁带你走进git的世界四-重写历史记录 - BattleHeart
开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库git init。
$ git init
然后我们来创建两个文件文件名分别为a和b。
$ touch a b
将a文件添加到暂存区,然后再将b添加到暂存区,我们会想到这时候有两个git对象产生,但是git对象对应.git/objects文件。
$ git add .
$ find .git/objects/
.git/objects/
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/info
.git/objects/pack
我们来查看下.git/objects文件下面会产生几条git对象库。这时候超出了我们想象,我们认为对象文件也应该创建两个但是仅仅创建了一个,这是为什么呢?那么着一个文件又指的是什么呢?
$ git cat-file -t e6
2016-01-14T07:19:00Z
2016-01-14T07:19:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库git init。
$ git init
然后我们来创建两个文件文件名分别为a和b。
$ touch a b
将a文件添加到暂存区,然后再将b添加到暂存区,我们会想到这时候有两个git对象产生,但是git对象对应.git/objects文件。
$ git add .
$ find .git/objects/
.git/objects/
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/info
.git/objects/pack
我们来查看下.git/objects文件下面会产生几条git对象库。这时候超出了我们想象,我们认为对象文件也应该创建两个但是仅仅创建了一个,这是为什么呢?那么着一个文件又指的是什么呢?
$ git cat-file -t e6 <a href="https://www.cnblogs.com/dwlsxj/p/git-remend-history-log.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/git-revocation-amend.html
小丁带你走进git的世界三-撤销修改 - BattleHeart
一、撤销指令
git checkout还原工作区的功能
git reset 还原暂存区的功能
git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们
git revert 撤销本次提交。
二、指令讲解
Git checkout
首先我们对文件的一个修改,对master.txt进行了修改
2016-01-14T00:48:00Z
2016-01-14T00:48:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】一、撤销指令
git checkout还原工作区的功能
git reset 还原暂存区的功能
git clean 还没有被添加进暂存区的文件也就是git还没有跟踪的文件可以使用这个命令清除他们
git revert 撤销本次提交。
二、指令讲解
Git checkout
首先我们对文件的一个修改,对master.txt进行了修改 <a href="https://www.cnblogs.com/dwlsxj/p/git-revocation-amend.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/git.html
小丁带你走进git的世界二-工作区暂存区分支 - BattleHeart
1.初始化一个仓库
git init
git clone
git仓库分为两种情况:
第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库
git init –bare git 创建一个裸仓库
2.git仓库有三个区域
工作区working directory日常编辑代码的地方
历史仓库history repository是commit指向的一个树形结构
暂存区Staging area相当于是工作区与历史提交中间的缓存,它代表着是你要提交代码的一个工作状态,它维护的是一个虚拟的树形结构
2016-01-13T11:37:00Z
2016-01-13T11:37:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】1.初始化一个仓库
git init
git clone
git仓库分为两种情况:
第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库
git init –bare git 创建一个裸仓库
2.git仓库有三个区域
工作区working directory日常编辑代码的地方
历史仓库history repository是commit指向的一个树形结构
暂存区Staging area相当于是工作区与历史提交中间的缓存,它代表着是你要提交代码的一个工作状态,它维护的是一个虚拟的树形结构 <a href="https://www.cnblogs.com/dwlsxj/p/git.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/Github.html
小丁带你走进git世界一-git简单配置 - BattleHeart
配置提交代码的信息,例如是谁提交的代码之类的。
git config –global user.name BattleHeaert 这里是设置提交代码的人的名称
git config –global user.email github@126.com 这里是设置提交代码的人的邮箱
查看当前的用户名
git config user.name
或者
git config –get user.name
这时候会显示BattleHeart这个用户名,但是如果我们再添加一个用户的名称的时候这时候就会显示最后一个添加的用户名
git config –global –add user.name BH
当我们再次使用git config user.name时这时候显得是就是BH如下图所示
2016-01-13T05:00:00Z
2016-01-13T05:00:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】配置提交代码的信息,例如是谁提交的代码之类的。
git config –global user.name BattleHeaert 这里是设置提交代码的人的名称
git config –global user.email github@126.com 这里是设置提交代码的人的邮箱
查看当前的用户名
git config user.name
或者
git config –get user.name
这时候会显示BattleHeart这个用户名,但是如果我们再添加一个用户的名称的时候这时候就会显示最后一个添加的用户名
git config –global –add user.name BH
当我们再次使用git config user.name时这时候显得是就是BH如下图所示 <a href="https://www.cnblogs.com/dwlsxj/p/Github.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html
RabbitMQ基础知识 - BattleHeart
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。
RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。
RabbitMQ的官网是http://www.rabbitmq.com
花絮:本篇文章是一个系列的文章,本片是开篇,后续会
2016-01-07T01:25:00Z
2016-01-07T01:25:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。
RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSource(VMWare的一个部门)收购。在2013年5月被并入Pivotal。其实VMWare,Pivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司,而Pivotal是整合了EMC的某些资源,现在并没有上市。
RabbitMQ的官网是http://www.rabbitmq.com
花絮:本篇文章是一个系列的文章,本片是开篇,后续会 <a href="https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/Stack.html
系统栈的工作原理 - BattleHeart
内存的不同用途
根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分:
(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
(2)数据区:用于存储全局变量等。
(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
(4)栈区:用于动态地存储函数之间的关系,以保证被调用函数在返回时恢复到母函数中继续执行。
在Windows平台下,高级语言写出的程序经过编译链接,最终会变成PE文件。当PE文件被装载运行后,就成了所谓的进程。
2015-04-12T07:59:00Z
2015-04-12T07:59:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】内存的不同用途
根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分:
(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
(2)数据区:用于存储全局变量等。
(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
(4)栈区:用于动态地存储函数之间的关系,以保证被调用函数在返回时恢复到母函数中继续执行。
在Windows平台下,高级语言写出的程序经过编译链接,最终会变成PE文件。当PE文件被装载运行后,就成了所谓的进程。 <a href="https://www.cnblogs.com/dwlsxj/p/Stack.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/StackOverflow_1.html
栈溢出的初步利用 - BattleHeart
我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。再进行讲一遍栈溢出的原理。更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。
下面的例子代码如下:(代码很简单我不做解释)
2015-04-08T14:44:00Z
2015-04-08T14:44:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。再进行讲一遍栈溢出的原理。更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。
下面的例子代码如下:(代码很简单我不做解释) <a href="https://www.cnblogs.com/dwlsxj/p/StackOverflow_1.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/StackOverflow.html
初步认识栈溢出漏洞 - BattleHeart
什么是栈?
栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。栈的作用如同一个缓冲区,保存着函数所需的所有信息。在函数的开始时候产生栈,并在函数的结束时候释放它。栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。
缓冲溢出分为两种,一种是栈溢出,一种是堆溢出。
如何找到栈?
EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。
ESP:扩展栈指针。这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。
EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。
2015-04-08T06:25:00Z
2015-04-08T06:25:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】什么是栈?
栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。栈的作用如同一个缓冲区,保存着函数所需的所有信息。在函数的开始时候产生栈,并在函数的结束时候释放它。栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。
缓冲溢出分为两种,一种是栈溢出,一种是堆溢出。
如何找到栈?
EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。
ESP:扩展栈指针。这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。
EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。 <a href="https://www.cnblogs.com/dwlsxj/p/StackOverflow.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/RegexReplace.html
浅析正则表达式-替换原则 - BattleHeart
最近经常用到替换的东西所以就出来整理下,这里要分享的是正则表达式里面的替换原则,首先要声明的是这里提及到的替换原则是.NET里面的正则表达式的替换原则。先看一下替换的定义替换是只能在替换模式中识别的语言元素。 它们使用正则表达式模式定义全部或部分用于替换输入字符串中的匹配文本的文本。 替换模式可以包含一个或多个替换以及本文字符。其实个人总结的替换的大致是这样的,替换的内容永远都是原文本的内容,通过正则表达式匹配出来文本,来通过组名或者组号来进行对原文本的替换,替换的位置是用正则表达式匹配出来的内容。还有我已经在前面写了三篇关于正则的文章了,最近用到替换内容,详细分享来~,好了,废话不多说了下面进入正题吧~
2014-11-13T03:32:00Z
2014-11-13T03:32:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】最近经常用到替换的东西所以就出来整理下,这里要分享的是正则表达式里面的替换原则,首先要声明的是这里提及到的替换原则是.NET里面的正则表达式的替换原则。先看一下替换的定义替换是只能在替换模式中识别的语言元素。 它们使用正则表达式模式定义全部或部分用于替换输入字符串中的匹配文本的文本。 替换模式可以包含一个或多个替换以及本文字符。其实个人总结的替换的大致是这样的,替换的内容永远都是原文本的内容,通过正则表达式匹配出来文本,来通过组名或者组号来进行对原文本的替换,替换的位置是用正则表达式匹配出来的内容。还有我已经在前面写了三篇关于正则的文章了,最近用到替换内容,详细分享来~,好了,废话不多说了下面进入正题吧~ <a href="https://www.cnblogs.com/dwlsxj/p/RegexReplace.html" target="_blank">阅读全文</a>
https://www.cnblogs.com/dwlsxj/p/PE.html
再探.NET的PE文件结构(安全篇) - BattleHeart
首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软件来讲述是怎么被攻破的,也会有人说这是一篇破文,我其实这篇文章已经写了很长时间了,不知道以什么形式发出来,因为毕竟是有些破解类的东西。但是我觉得从这篇文章相反的是能够带来一些启发。大家应该都知道Reflector这个反编译软件还有一个插件是专门用来改IL的插件叫Reflexil,这里我们也要用到前面那个工具Reflector,后面的插件我们这里我们不用,接下来分析的东西可以让大家能够更深入.NET的PE,深入内幕来看看,好,闲话少说….直接上分析。
2014-11-10T06:49:00Z
2014-11-10T06:49:00Z
BattleHeart
https://www.cnblogs.com/dwlsxj/
【摘要】首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软件来讲述是怎么被攻破的,也会有人说这是一篇破文,我其实这篇文章已经写了很长时间了,不知道以什么形式发出来,因为毕竟是有些破解类的东西。但是我觉得从这篇文章相反的是能够带来一些启发。大家应该都知道Reflector这个反编译软件还有一个插件是专门用来改IL的插件叫Reflexil,这里我们也要用到前面那个工具Reflector,后面的插件我们这里我们不用,接下来分析的东西可以让大家能够更深入.NET的PE,深入内幕来看看,好,闲话少说….直接上分析。 <a href="https://www.cnblogs.com/dwlsxj/p/PE.html" target="_blank">阅读全文</a>