摘要:
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系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重 阅读全文