摘要:
垃圾回收包含的内容不少,但顺着下面的顺序捋清知识也并不难。首先要搞清垃圾回收的范围(栈需要GC去回收吗?),然后就是回收的前提条件如何判断一个对象已经可以被回收(这里只重点学习根搜索算法就行了),之后便是建立在根搜索基础上的三种回收策略,最后便是JVM中对这三种策略的具体实现。1.范围:要回收哪些区域?Java方法栈、本地方法栈以及PC计数器随方法或线程的结束而自然被回收,所以这些区域不需要考虑回收问题。Java堆和方法区是GC回收的重点区域,因为一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存可能也不一样,而这两个区域又对立于栈可能随时都会有对象不再被引用,因此这部分内存的 阅读全文
摘要:
Java虚拟机体内部系结构包括class文件、类装载子系统、运行时数据区、执行引擎、本地方法调用结构,其中运行时数据区包括方法区、堆、Java栈、程序计数器、本地方法栈等。具体结构如下图所示(摘自Inside Java Virtual Machine):1. class文件在Java中,所有源文件都编译成二进制的字节码,然后由虚拟机装载运行。一般这样的字节码是以class文件的形式存在。在运行时,由ClassLoader类(System ClassLoader or User-defined ClassLoader)找到对应的class文件,读取其中的字节码,然后交由虚拟机解析运行。在clas 阅读全文
摘要:
1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的2) 为什么JAVA中要加上一条限制:只能访问final型的局部变量?3) JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理论上这是很自然的要求),但是:编译技术是无法实现的或代价极高.4) 困难在何处?到底难在哪儿? 局部变量的生命周期与局部内部类的对象的生命周期的不一致性!5) 设方法f被调用,从而在它的调用栈中生成了变量i,此时产生了一个局部.. 阅读全文
摘要:
SSDT 表的初步学习1 理论知识大概思路和理论知识首先明白应用层到 内核层 会通过一张SSDT 表、、我们要根据SSDT结构和索引号来获取函数的当前地址如果检测一下这个函数有木有被HOOK我们要在获取这个函数的起源地址 对比一下即可知道、、1 读取SSDT表函数当前地址了解SSDT结构系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable这个表typedef struct _ServiceDescriptorTable {PVOID ServiceTableBase; //System Service Dispatch Table 的基地址PVOID 阅读全文
摘要:
编译成功后执行程序时,注意保持网络连接~~~#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{ 阅读全文
摘要:
NLINEHOOK过简单驱动保护的理论知识和大概思路、、这里的简单驱动保护就是 简单的 HOOK 掉内核API的现象、、、找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节、5个字节就是一个简单的JMP指令、 这里说一下JMP、如下、、001 JMP 002这样我们就会跳到001 (在此地址写入JMP指令)+ 002(我们要写入的JMP操作数) +5(jmp指令的字节数)这里、就是说如果你要跳回NtOpenProcess的原地址、就应该向被HOOK后的地址处写入这样的指令JMP ( NtOpenProcess的原地址-被HOOK后的地址- 5 )不是很乱思路清晰一些就明 阅读全文
摘要:
HOOK SSDT思路:驱动加载时通过KeServiceDescriptorTable得到函数指针地址 -> 替换其地址为自定义函数地址驱动卸载时恢复SSDT原来地址代码部分:对于KeServiceDescriptorTable的类型定义如下:typedef struct _SERVICE_DESCRIPTOR_TABLE{PULONG ServiceTableBase; //指向系统服务函数地址表PULONG ServiceCounterTableBase;ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小ULON 阅读全文
摘要:
今天的成果,读取了我的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 阅读全文
摘要:
通过Hook SSDT (System Service Dispath Table) 隐藏进程1.原理介绍: Windows操作系统是一种分层的架构体系。应用层的程序是通过API来访问操作系统。而API又是通过ntdll里面的核心API来进行系统服务的查询。核心API通过对int 2e的切换,从用户模式转换到内核模式。2Eh中断的功能是通过NTOSKRNL.EXE的一个函数KiSystemService()来实现的。在你使用了一个系统调用时,必须首先装载要调用的函数索引号到EAX寄存器中。把指向参数区的指针被保存在EDX寄存器中。中断调用后,EAX寄存器保存了返回的结果。KiSystemSer 阅读全文
摘要:
现在有一个整数数组,已知一个数出现的次数超过了一半,请用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.. 阅读全文
摘要:
句柄和指针区别。从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄" 。指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用。Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重 阅读全文
摘要:
Windows XP Professional计算机启动过程概述从按下计算机开关启动计算机,到登入到桌面完成启动,一共经过了以下几个阶段:1. 预引导(Pre-Boot)阶段;2. 引导阶段;3. 加载内核阶段;4. 初始化内核阶段;5. 登陆。--------------------------------------------------------------------------------每个启动阶段的详细介绍a) 预引导阶段在按下计算机电源使计算机启动,并且在Windows XP专业版操作系统启动之前这段时间,我们称之为预引导(Pre-Boot)阶段,在这个阶段里,计算机首先运 阅读全文
摘要:
人们在使用电脑时,有时由于异常操作,有时由于病毒侵袭,会导致某个分区消失或硬盘无法启动。究其原因,就是硬盘分区表受损。硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。一.分区表的位置及识别标志 分区表一般位于硬盘某柱面的0磁头 1扇区.而第1个分区表(也即主分区表)总是位于 (0柱面,1磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来.分区表. 阅读全文
摘要:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 主引导记录(MBR)的反汇编分析;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MBR代码分析网上早就有了,但我找到的都是针对老版MBR的分析。这里所谓的老版MBR,指的是早期的MBR,那时大容量硬盘还没有出现,MBR使用传统的Int 13h接口访问硬盘。随着硬盘容量越来越大,传统的Int 13h已经无法完全访问硬盘上所有扇区(Int 13h接口理论上可访问的最 阅读全文
摘要:
(一)巴什博弈(BashGame):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。很容易想到当n%(m+1)0时,先取必胜,第一次先拿走n%(m+1),以后每个回合到保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。(二)威佐夫博弈(WythoffGame):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(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 阅读全文
摘要:
我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间,然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数,这些时间函数的精度也是各不相同的,所以,如果我们想得到准确的结果,必须使用合适的时间函数。现在我就介绍windows下的几种常用时间函数。1:Sleep函数使用:sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟;Linux 阅读全文
摘要:
#include #include #include #include #define DRIVER_NAME "123467"#define DRIVER_PATH "..\\HelloDDK.sys"//装载NT驱动程序BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath){/************************ 加载NT驱动的代码******************************* ① 调用OpenSCManager,打开SCM管理器.如果返回NULL,则返回失 阅读全文
摘要:
1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,a2,a3,a5就不是稳定的了。2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。3、算法的时间 阅读全文
摘要:
在Debian不同,Ubuntu下安装bochs的文件路径与前者不同,需要稍加变化在安装过程,还要重新下载一下bochs编译的文件================================================================================= 我的安装过程主要参照了ubuntu中文论坛里面的一篇帖子(http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=177608&start=0) 一、准备工作 1.bochs是由C++编写的,我们要安装相应的编译环境,否则的话在make的时候会出现“ 阅读全文