摘要: 垃圾回收包含的内容不少,但顺着下面的顺序捋清知识也并不难。首先要搞清垃圾回收的范围(栈需要GC去回收吗?),然后就是回收的前提条件如何判断一个对象已经可以被回收(这里只重点学习根搜索算法就行了),之后便是建立在根搜索基础上的三种回收策略,最后便是JVM中对这三种策略的具体实现。1.范围:要回收哪些区域?Java方法栈、本地方法栈以及PC计数器随方法或线程的结束而自然被回收,所以这些区域不需要考虑回收问题。Java堆和方法区是GC回收的重点区域,因为一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存可能也不一样,而这两个区域又对立于栈可能随时都会有对象不再被引用,因此这部分内存的 阅读全文
posted @ 2014-01-21 15:00 晨曦语晴 阅读(540) 评论(0) 推荐(0)
摘要: Java虚拟机体内部系结构包括class文件、类装载子系统、运行时数据区、执行引擎、本地方法调用结构,其中运行时数据区包括方法区、堆、Java栈、程序计数器、本地方法栈等。具体结构如下图所示(摘自Inside Java Virtual Machine):1. class文件在Java中,所有源文件都编译成二进制的字节码,然后由虚拟机装载运行。一般这样的字节码是以class文件的形式存在。在运行时,由ClassLoader类(System ClassLoader or User-defined ClassLoader)找到对应的class文件,读取其中的字节码,然后交由虚拟机解析运行。在clas 阅读全文
posted @ 2014-01-21 14:57 晨曦语晴 阅读(263) 评论(0) 推荐(0)
摘要: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的2) 为什么JAVA中要加上一条限制:只能访问final型的局部变量?3) JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译技术是无法实现的或代价极高.4) 困难在何处?到底难在哪儿? 局部变量的生命周期与局部内部类的对象的生命周期的不一致性!5) 设方法f被调用,从而在它的调用栈中生成了变量i,此时产生了一个局部.. 阅读全文
posted @ 2014-01-21 14:27 晨曦语晴 阅读(757) 评论(0) 推荐(0)
摘要: SSDT 表的初步学习1 理论知识大概思路和理论知识首先明白应用层到 内核层 会通过一张SSDT 表、、我们要根据SSDT结构和索引号来获取函数的当前地址如果检测一下这个函数有木有被HOOK我们要在获取这个函数的起源地址 对比一下即可知道、、1 读取SSDT表函数当前地址了解SSDT结构系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable这个表typedef struct _ServiceDescriptorTable {PVOID ServiceTableBase; //System Service Dispatch Table 的基地址PVOID 阅读全文
posted @ 2014-01-21 13:37 晨曦语晴 阅读(771) 评论(0) 推荐(0)
摘要: 编译成功后执行程序时,注意保持网络连接~~~#include #include #include #include #define MAXBLOCKSIZE 1024#pragma comment (lib, "wininet.lib")void download(const char*);int main(int argc, char* argv[]){ download("http://zhidao.baidu.com");return 0 ;if(argc > 1){ download((const char*)argv[1]);}else{ 阅读全文
posted @ 2014-01-21 13:36 晨曦语晴 阅读(487) 评论(0) 推荐(0)
摘要: NLINEHOOK过简单驱动保护的理论知识和大概思路、、这里的简单驱动保护就是 简单的 HOOK 掉内核API的现象、、、找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节、5个字节就是一个简单的JMP指令、 这里说一下JMP、如下、、001 JMP 002这样我们就会跳到001 (在此地址写入JMP指令)+ 002(我们要写入的JMP操作数) +5(jmp指令的字节数)这里、就是说如果你要跳回NtOpenProcess的原地址、就应该向被HOOK后的地址处写入这样的指令JMP ( NtOpenProcess的原地址-被HOOK后的地址- 5 )不是很乱思路清晰一些就明 阅读全文
posted @ 2014-01-21 13:35 晨曦语晴 阅读(1010) 评论(0) 推荐(0)
摘要: HOOK SSDT思路:驱动加载时通过KeServiceDescriptorTable得到函数指针地址 -> 替换其地址为自定义函数地址驱动卸载时恢复SSDT原来地址代码部分:对于KeServiceDescriptorTable的类型定义如下:typedef struct _SERVICE_DESCRIPTOR_TABLE{PULONG ServiceTableBase; //指向系统服务函数地址表PULONG ServiceCounterTableBase;ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小ULON 阅读全文
posted @ 2014-01-21 13:34 晨曦语晴 阅读(987) 评论(0) 推荐(0)
摘要: 今天的成果,读取了我的SSDT地址.读取当前地址代码(NtOpenProcess): LONG *SSDT_Adr,t_addr,adr; t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase; SSDT_Adr=(PLONG)(t_addr+0x7a*4); adr=*SSDT_Adr;读取起源地址(NtOpenProcess):UNICODE_STRING SysRoutineName;LONG orgadr;RtlInitUnicodeString(&SysRoutineName,L"NtOpenProce 阅读全文
posted @ 2014-01-21 13:33 晨曦语晴 阅读(557) 评论(0) 推荐(0)
摘要: 通过Hook SSDT (System Service Dispath Table) 隐藏进程1.原理介绍: Windows操作系统是一种分层的架构体系。应用层的程序是通过API来访问操作系统。而API又是通过ntdll里面的核心API来进行系统服务的查询。核心API通过对int 2e的切换,从用户模式转换到内核模式。2Eh中断的功能是通过NTOSKRNL.EXE的一个函数KiSystemService()来实现的。在你使用了一个系统调用时,必须首先装载要调用的函数索引号到EAX寄存器中。把指向参数区的指针被保存在EDX寄存器中。中断调用后,EAX寄存器保存了返回的结果。KiSystemSer 阅读全文
posted @ 2014-01-21 13:28 晨曦语晴 阅读(916) 评论(0) 推荐(0)
摘要: 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。方法1:Hash链表方法2:使用两个变量A和B,其中A存储某个数组中的数,B用来计数。开始时将B初始化为0。遍历数组,如果B=0,则令A等于当前数,令B等于1;如果当前数与A相同,则B=B+1;如果当前数与A不同,则令B=B-1。遍历结束时,A中的数就是要找的数。这个算法的时间复杂度是O(n),空间复杂度为O(1)。c语言描述:int main(){ int i,A,B; int a[10]={1,2,3,1,2,1,1,6,1,1}; A=a[5]; B=0; for(i=0; i<10; i.. 阅读全文
posted @ 2014-01-21 13:26 晨曦语晴 阅读(260) 评论(0) 推荐(0)
摘要: 句柄和指针区别。从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄" 。指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用。Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重 阅读全文
posted @ 2014-01-21 13:22 晨曦语晴 阅读(988) 评论(0) 推荐(0)
摘要: Windows XP Professional计算机启动过程概述从按下计算机开关启动计算机,到登入到桌面完成启动,一共经过了以下几个阶段:1. 预引导(Pre-Boot)阶段;2. 引导阶段;3. 加载内核阶段;4. 初始化内核阶段;5. 登陆。--------------------------------------------------------------------------------每个启动阶段的详细介绍a) 预引导阶段在按下计算机电源使计算机启动,并且在Windows XP专业版操作系统启动之前这段时间,我们称之为预引导(Pre-Boot)阶段,在这个阶段里,计算机首先运 阅读全文
posted @ 2014-01-21 12:51 晨曦语晴 阅读(463) 评论(0) 推荐(0)
摘要: 人们在使用电脑时,有时由于异常操作,有时由于病毒侵袭,会导致某个分区消失或硬盘无法启动。究其原因,就是硬盘分区表受损。硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。一.分区表的位置及识别标志 分区表一般位于硬盘某柱面的0磁头 1扇区.而第1个分区表(也即主分区表)总是位于 (0柱面,1磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来.分区表. 阅读全文
posted @ 2014-01-21 12:50 晨曦语晴 阅读(1990) 评论(0) 推荐(0)
摘要: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 主引导记录(MBR)的反汇编分析;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MBR代码分析网上早就有了,但我找到的都是针对老版MBR的分析。这里所谓的老版MBR,指的是早期的MBR,那时大容量硬盘还没有出现,MBR使用传统的Int 13h接口访问硬盘。随着硬盘容量越来越大,传统的Int 13h已经无法完全访问硬盘上所有扇区(Int 13h接口理论上可访问的最 阅读全文
posted @ 2014-01-21 12:23 晨曦语晴 阅读(1751) 评论(0) 推荐(0)
摘要: (一)巴什博弈(BashGame):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。很容易想到当n%(m+1)0时,先取必胜,第一次先拿走n%(m+1),以后每个回合到保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。(二)威佐夫博弈(WythoffGame):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、( 阅读全文
posted @ 2014-01-21 12:16 晨曦语晴 阅读(618) 评论(0) 推荐(0)
摘要: 广度优先搜索(BFS)的原理和应用二叉树中的层序遍历就属于一种BFS(Board First Search)层序遍历会得到ABCDEFG的层序优先序列(BFS序列)。在层序遍历过程中,可以注意到先访问的节点的孩子节点必然先被访问(如访问了A后访问B和C,那么B的孩子结点一定在C的孩子结点前被访问――仅针对下一层的孩子而言)。据这个特性,可以用队列来实现这个遍历。void Layer(bitree *p){queue Q; //定义一个队列node *N;Q.push(*p); //起始点入队while(!Q.empty()){N=Q.front();Q.pop();coutdatalchild 阅读全文
posted @ 2014-01-21 12:13 晨曦语晴 阅读(560) 评论(0) 推荐(0)
摘要: 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间函数。1:Sleep函数使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux 阅读全文
posted @ 2014-01-21 12:09 晨曦语晴 阅读(374) 评论(0) 推荐(0)
摘要: #include #include #include #include #define DRIVER_NAME "123467"#define DRIVER_PATH "..\\HelloDDK.sys"//装载NT驱动程序BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath){/************************ 加载NT驱动的代码******************************* ① 调用OpenSCManager,打开SCM管理器.如果返回NULL,则返回失 阅读全文
posted @ 2014-01-21 12:06 晨曦语晴 阅读(1092) 评论(0) 推荐(0)
摘要: 1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,a2,a3,a5就不是稳定的了。2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。3、算法的时间 阅读全文
posted @ 2014-01-21 12:05 晨曦语晴 阅读(425) 评论(0) 推荐(0)
摘要: 在Debian不同,Ubuntu下安装bochs的文件路径与前者不同,需要稍加变化在安装过程,还要重新下载一下bochs编译的文件================================================================================= 我的安装过程主要参照了ubuntu中文论坛里面的一篇帖子(http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=177608&start=0) 一、准备工作 1.bochs是由C++编写的,我们要安装相应的编译环境,否则的话在make的时候会出现“ 阅读全文
posted @ 2014-01-21 12:00 晨曦语晴 阅读(900) 评论(0) 推荐(0)
摘要: 突然发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码#include using namespace std;main(){char *c1 = "abc";char c2[] = "abc";char *c3 = ( char* )malloc(3);c3 = "abc";printf("%d %d %s\n",&c1,c1,c1);pri 阅读全文
posted @ 2014-01-21 11:58 晨曦语晴 阅读(4565) 评论(0) 推荐(1)
摘要: 例程源码如下://add.h extern int add(int,int);//add.c int add(int a, int b) { int r = a + b; return r; }//mul.h extern int mul(int,int);//mul.c int mul(int a, int b) { int r = a * b; return r; }//main.c #include "add.h" #include "mul.h" #include int main() { int a,b; int r; scanf(" 阅读全文
posted @ 2014-01-21 11:16 晨曦语晴 阅读(1780) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2094以前都不知道这道题该怎么过,今天听同学说了,其实思想很简单。用了最近在学的STL就把它给A了。思想:讲输入的全部人都放入一个容器base中,将全部输的人放入另一个容器base1中,最后将两个容器的size相减一下就可以了。得到1就说明能产生冠军。 因为要是能产生冠军的话,全部人中只有冠军是没有输过的,其他的人肯定是输过的!所以,容器base的大小肯定比base1大1。My code: #include#include#include#includeusing namespace std;int main 阅读全文
posted @ 2014-01-21 11:11 晨曦语晴 阅读(215) 评论(0) 推荐(0)
摘要: 今天还是在温习以前看过的算法,感觉还是很陌生似得!先粘贴下别人博客上的Dijkstra算法的具体步骤:Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。 Dijstra算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离 基本思想是: 设置一个顶点的集合s,并不断地扩充这个集合,一个 阅读全文
posted @ 2014-01-21 11:04 晨曦语晴 阅读(375) 评论(0) 推荐(0)
摘要: 这一题其实是一道背包问题的变形(完全背包问题)——可以转意为:将重量为1~N的物品放入容量为N的背包,求方案数。可以得出状态转移方程:d[i][j] = d[i-1][j] + d[i][j-i]解释为:用前i个数组成j = 用前i-1个数组成j + 用前i个数组成j-i(即没用数字i的组合数+用了数字i的组合数,两者为i,j的组合方案,且互斥)由转移方程可得填表顺序如下图所示:其中,横轴为i,纵轴为j,方向为从上到下,从左到右,之前还要进行基本项的初始化,不难理解,即d[i][0] = 1; d[0][j] = 0; 最后是边界处理,根据题意,填表只需要填j >= i的情况,当d[x] 阅读全文
posted @ 2014-01-21 11:02 晨曦语晴 阅读(237) 评论(0) 推荐(0)
摘要: 一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上。下面给个计划你练练:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时 阅读全文
posted @ 2014-01-21 11:00 晨曦语晴 阅读(334) 评论(0) 推荐(0)
摘要: template,classAlloc=alloc>第一个参数Key是关键字类型第二个参数T是值类型第三个参数Compare是比较函数(仿函数)第四个参数是内存配置对象Map中的关键字,起码必须有“#include#include#includeusingnamespacestd;structmyComp{inta,b,c;myComp():a(0),b(0),c(0){};myComp(intaa,intbb,intcc):a(aa),b(bb),c(cc){};friendbooloperatorimap;imap[myComp(4,5,0)]='q';imap[my 阅读全文
posted @ 2014-01-21 10:57 晨曦语晴 阅读(3082) 评论(0) 推荐(0)
摘要: 最近结合stl看数据结构,对许多原本半生不熟的知识都有了点领悟,大家知道stl里无论是向量还是容器的sort算法都很有用也很方便.但是似乎大家一直都是用int类型来初始化这些对象,那我用自定义的一个结构来对初始化这些对象,并且想对结构里的某一个元素的大小来排序,该怎么办呢,我上网查了些资料,并根据自己的学习与琢磨,找到了比较简单的方法.那么不说废话,看代码:#include#includeusingnamespacestd;structstu{ chara[10]; ints; };classstu1:greater{public: booloperator()(stub1,stub2)c.. 阅读全文
posted @ 2014-01-21 10:56 晨曦语晴 阅读(2333) 评论(0) 推荐(0)
摘要: 一、安装相应的JAVA包,下载相应的Tomcat版本的WEB容器二、配置JAVA环境变量,分别配置下列几项环境变量:1.首先,打开配置环境变量界面,如下操作:我的电脑---属性---高级---环境变量 2.系统变量(S)中配置如下: 2.1,新建系统变量: 变量名:JAVA_HOME 变量值:C:\ProgramFiles\Java\jdk1.5.0_17(可更换为相应版本的jdk包) 2.2,编辑CLASSPATH,如果没有该变量则新建, 变量名:CLASSPATH变量值:%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注:该变量值置于CL 阅读全文
posted @ 2014-01-21 10:51 晨曦语晴 阅读(308) 评论(0) 推荐(0)
摘要: sort函数定义在库中,可以看做是qsort(包含在头文件中,具体使用在此就不介绍了)的拓展版,是STL的组成部分,针对不同的情况,对排序有不同的策略,平均效率很好,综合效率高于qsort(单一的快排)sort的用法方便简单。一、首先,先拿简单的数组排序为例:intarr[100];若要完成从小到大排序sort(arr,arr+100);即可~若完成从大到小排序,可以定义cmp函数如下:intcmp(inta,intb){returna>b;//不可加等号,若加上等号,在数组前两个数字相等的情况下,将出现内存访问错误//具体为何,有待dbg源码,坐等高人回复^_^}sort(arr,ar 阅读全文
posted @ 2014-01-21 10:50 晨曦语晴 阅读(330) 评论(0) 推荐(0)
摘要: 应用到画布上面的效果是可以累积的,因而就可以利用几个简单的函数来“组合”出效果来。例如,在向屏幕上绘制之前,可能会有一艘飞船需要旋转、变换和缩放。因为所有效果都对画布起作用,所以这些效果会应用到将被绘制在屏幕上的所有对象,而不仅仅是某一幅图像或某一个形状(比如一艘飞船)。其中,save和restore函数为应用这些累积的效果提供了一种简单的机制,可以将应用了这些效果的图像或图形绘制到画布上,然后“撤销”这些改变。后台的操作是什么呢?save函数把当前的绘制状态推进栈里,而restore函数则把最后一个状态弹出栈。还拿前面提到的飞船为例,需要执行下列操作:调用save函数(保存当前的绘制状态.. 阅读全文
posted @ 2014-01-21 10:48 晨曦语晴 阅读(3585) 评论(0) 推荐(0)
摘要: 1.画布标签上例画出画布,并设置其大小和边框风格,对齐方式,与普通标签属性基本相同,不做详细介绍。2.在canvas画布上作画,需要用javascript函数对其进行控制,使用以下语句获得API接口实例,对画布进行操作:varcanvas=document.getElementById("myCanvas");varcontext=canvas.getContext("2d");看到2d是否会联想到令人激动的3d?可惜的是,canvas目前还没有3d这么一说3.画线:context.moveTo(x1,y1);context.lineTo(x2,y2); 阅读全文
posted @ 2014-01-21 10:47 晨曦语晴 阅读(779) 评论(0) 推荐(0)
摘要: 1、二次贝塞尔曲线 quadraticCurveTo(cpx,cpy,x,y) //cpx,cpy表示控制点的坐标,x,y表示终点坐标;数学公式表示如下:二次方贝兹曲线的路径由给定点P0、P1、P2的函数B(t)追踪:代码实例:canvas直线二次贝塞尔曲线代码效果:2、三次贝塞尔曲线 bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y) //cp1x,cp1y表示第一个控制点的坐标,cp2x,cp2y表示第二个控制点的坐标,x,y表示终点的坐标;数学公式表示如下:P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从... 阅读全文
posted @ 2014-01-21 10:44 晨曦语晴 阅读(487) 评论(0) 推荐(0)