- 博客(31)
- 资源 (3)
- 收藏
- 关注
转载 Floyed算法
其实这个算法很简单啦,记不住各种算法的名字从这个链接拷过来的 http://hi.bccn.net/space-166490-do-blog-id-10914.html从有向图的带权的邻接矩阵 cost出发,对有向图的n个顶点加以编号,若从i到j有弧(i=1,2,...,n,j=1,2,...,n),则从i到j 存在一条长度为cost(i,j)的路线。但该路径不一定是最短路径,尚需
2012-09-07 14:50:36 3623
原创 C语言中的static关键字
static关键字可以作用于变量或函数,我们分别讨论这两种情况。 1.static 变量 static 标记的变量都是在静态数据区或者叫全局数据区分配的。这里的数据都是自动初始化的,而且在程序运行的时候是不会释放这部分空间,只有程序结束后才会释放。 知道这个特性后其实就很好理解static了。如果变量定义为static,那么至少在程序运行的期间
2012-06-08 10:19:03 2215
原创 Kernel Handle
上周把写的驱动挂上driver verifier之后发现驱动会挂掉。!analyze -v 提示说使用了User Mode的Handle。后来仔细查看代码,原来在驱动中我需要打开system进程,调用ZwOpenProcess的时候需要指定OBJECT_ATTRIBUTES,而这个attributes是需要指定为OBJ_KERNEL_HANDLE才表明这个Handle是Kernel Handle,
2012-03-19 10:32:54 2708
转载 UNREFERENCED_PARAMETER
转帖:http://blog.csdn.net/aiguo26/article/details/855347作用:告诉编译器,已经使用了该变量,不必检测警告!在VC编译器下,如果您用最高级别进行编译,编译器就会很苛刻地指出您的非常细小的警告。当你生命了一个变量,而没有
2011-10-09 14:40:57 1925
原创 Python/Installing pydasm and pydbg with Python 2.5, WinXP, VC++2008 Express Edition
<br />今天编pydbg折腾了很久,编译加载不了pydasm,google了一下正好发现了这篇好文章,写的很详细,Mark一下<br /> <br />http://www.glamenv-septzen.net/en/view/13
2011-01-21 14:55:00 2836
转载 C++对象模型之虚函数表
<br />http://hi.baidu.com/aztack/blog/item/9258b2355545a088a71e124c.html<br /> <br />对逆向C++程序有很大的帮助
2011-01-17 10:27:00 2265
原创 函数调用方式
<br />二进制分析很长时间了,对这些概念还是不太清楚,每次都是需要的时候才去查,现在记录一下吧。<br />摘自http://blog.csdn.net/yc_8301/archive/2007/10/08/1814744.aspx<br /> <br /> <br /> <br />函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别<br />首先,__thiscall是关于类的一种调用方式,它与其他调用方式的最大区别是: <br />__thisc
2011-01-14 15:54:00 2207
原创 OLE2A转换变乱码的问题
<br />从网上找了个人的日志。它将的是OLE2T,我觉得应该差不多吧。<br />以下摘自章鱼花园博客<br /> <br />以前VC6的代码,从xml文件中读取属性文字(中文),返回BSTR类型,用OLE2T转换,然后显示,一直工作很正常,用来做本地化,比修改Res文件要方便的多。<br /><br />同样的代码,在VS2003里面居然不能工作了,调试,发现BSTR返回正常,而通过OLE2T转换居然就全转成“???”了,晕。<br /><br />做了无数尝试,发现用unico
2010-07-16 17:27:00 2786
原创 MDL
用户空间和内核的数据交换的两种方法: 1.缓冲区。进入内核后在系统空间分配一块相应的缓冲区,并从用户空间缓冲区把内容复制到系统空间的缓冲区 DO_DIRECT_IO 2.临时为用户空间缓冲区增添一个系统空间映射,这使同一组物理页面有了两个虚拟地址区间,其一就是原来的用户空间虚拟地址区间,其二是系统空间的虚拟地址区间。 DO_DIRECT_IO 采用直接方
2010-05-20 19:38:00 2743
原创 APC机制
APC(Asynchronous Procedure Call)异步过程调用。NtQueueApcThread()这个系统调用把一个”用户APC请求”挂入目标线程的APC队列。KTHREAD数据结构中APCState指向线程的APC队列(用户APC和内核APC。 一般来说,只有把APC请求挂入队列,就不再需要触发,而只是等待执行的时机。对于用户APC请求,该时机同样也是目标线程从
2010-01-28 17:09:00 3058
原创 枚举进程
前面看到用PspCidTable可以枚举所有进程,今天又看到系统中有个全局变量PsActiveProcessHead保存所有进程。通过这个全局变量也可以枚举所有进程。当然这种方法的原理同EPROCESS遍历是一样的。PsActiveProcessHead队列其实是保存 EPROCESS->ActiveProcessLinks LIST_ENTRY数据结构的。 void DisplayL
2010-01-27 10:48:00 2493
原创 关闭其它进程的已打开对象
NtClose()只能关闭本进程的已打开对象,而关闭其他进程的已打开对象的方法: 打开目标进程; 调用NtDuplicateObject(),把参数Options中的标志位DUPLICATE_CLOSE_SOURCE设成1,并把参数TargetProcessHandle设成0. 用这种方法可不可以关闭杀软的进程呢?以后有时间了研究研究
2010-01-20 16:24:00 2290
原创 fs:[124]
反汇编内核函数的时候经常会看到mov eax, fs:[124].一直没弄清楚fs寄存器在ring0存放的是什么。今天查了下资料。 fs寄存器在Ring0中指向一个称为KPCR的数据结构,即FS段的起点与KPCR结构对齐。而在Ring0中fs寄存器一般为0x30。 这样看KPCR的数据结构: nt!_KPCR +0x000 NtTib :
2010-01-20 15:42:00 3693
原创 《Windows内核情景分析》常用内核函数
1.ObReferenceObjectByHandle() Handle->Object的过程。具体的查找过程是由ExpLookupHandleTableEntry函数实现的。具体过程(bla bla一堆)还是看别人的吧。http://www.debugman.com/read.php?tid=830&page=1&toread=1 2. ObReferenceObjectByName
2010-01-15 16:22:00 2482
原创 《Windows内核情景分析》对象管理
对象的数据结构都是由对象头和具体对象类型的数据结构两部分组成。对象头OBJECT_HEADER在下,它的上方是具体对象类型的数据结构本身。 nt!_OBJECT_HEADER +0x000 PointerCount : Int4B +0x004 HandleCount : Int4B +0x004 NextToFree : Pt
2010-01-13 20:08:00 2286
原创 《Windows内核情景分析》系统空间缓冲区管理
用户空间是从“堆(heap)”分配缓冲区的,内核中是从“池(pool)”中分配的。 用户空间的堆是属于进程的,而内核中的池则是全局的,属于整个系统。内核中池有两种:PagedPool,所占页面可以倒换的,NonPagedPool,所占页面是不可倒换的,每个页面都占着物理内存。 ntdll!_POOL_TYPE NonPagedPool = 0 PagedPo
2010-01-11 20:11:00 2701
原创 《Windows内核情景分析》内存区间的动态分配
物理页面是以PHYSICAL_PAGE代表的。MmPageArray指向PHYSICAL_PAGE的数组(MS是在ReactOS中是这样,真正Windows内核找不到PHYSICAL_PAGE结构,不知道是未公开还是策略不一样) 物理内存有三种 1.已分配的内存队列:存放正在被使用的内存 2.待清理的内存队列:存放已被释放的内存,但是这些内存未被清零 3.空闲队列
2010-01-08 10:57:00 2717
原创 DPC函数
DPC是Deferred Procedure Call,推迟的过程调用。内核中每个CPU都有一个DPC请求队列,DPC请求队列在每个CPU的PRCB数据结构中 设备对象的数据结构DEVICE_OBJECT中有个成分Dpc,它是KDPC数据结构,用来设置有关本设备对象的DPC函数的信息。 ntdll!_KDPC +0x000 Type : In
2009-12-28 20:29:00 3103
原创 Josephus问题
算法不是一般的烂呀,这个Josephus问题还纠结了半天。还好最后纠结出来了,其实很简单呀,弄个循环链表,遇到需要出列的就把这个节点从链表中删除,直到最后循环链表中只有一个节点。 1 void Josephus( ) 2 {
2009-12-15 14:44:00 2154
原创 Windows进程的创建
1.打开目标映像文件 2.创建Windows的进程控制块EPROCESS及相应的句柄 3.创建该进程的第一个线程,包括其堆栈、上下文,及线程控制块ETHREAD 4.将新创进程通知Windows子系统(csrss.exe) 5.启动初始线程运行 5.在新创进程和线程的上下文中完成用户空间的初始化 csrss中会保存有进程PID等相关信息,那么通过csrss应该也能够枚举所有的线程。Ho
2009-12-08 23:11:00 2350
原创 枚举进程——PspCidTable
看Windows内核情景分析的时候看到讲PspCidTable中会保存每个进程和线程的CID,就在想可以通过这个表来获取到每个进程的PID及相关信息,然后网上一搜,已经有N多人通过这种方法来获取进程列表了,Iceword也是有这种方法来枚举进程的。Anyway,还是自己实现一遍吧。当然也借鉴了别人的代码。 NTSTATUS DriverEntry(IN PDRIVER_OBJECT Dr
2009-12-07 21:57:00 1882
原创 Windows内核情景分析——Windows进程的用户空间
应用软件在用户空间可以访问的最低地址是MM_LOWEST_USER_ADDRESS,定义为0x10000,就是一个64KB边界的地方,从0开始的64KB不能访问 KI_USER_SHARED_DATA这个常数定义为0xFFDF0000,是一个区间的起点。这个区间是在系统空间,却又划出来让用户空间的程序访问,目的是用来让用户空间的程序访问内核中的一些数据。而且,这个区间是由系统空间
2009-11-30 23:40:00 3305
原创 传统的Heap Spray(转)
传统的Heap Spray是使用js分配内存。根据heap spray的思想,就是用同样的一个指令,去覆盖一片大内存地址,在每块分配到的内存最后,都付上我们的shellcode。 对这个指令的要求是,相当于NOPS的作用。且该指令指向的地址,正好落在我们覆盖的这片大存在地址中。 上面说的可能有些绕口,在实际exploit中,就是分配这样的一片内存区域,比如 0B270
2009-11-26 11:57:00 2139
原创 Windows进程线程
EPROCESS:进程控制块;它代表着Windows的一个进程,“E”表示管理层(Executive) KPROCESS:它是EPROCESS内部的一个成分,其名称就叫Pcb,所以是核心层进程控制块。K表示Kernel 用户空间中与进程有关的数据结构是“进程环境块”PEB(Process Enviroment Block)。PEB中记录着进程的运行参数,映像装入地址等
2009-11-19 23:00:00 796
原创 OllyDbg载入就退出
今天在调试一个加壳程序时,脱完壳之后加载脱壳后程序,OllyDbg就自动退出了,折腾了N久,隐藏OllyDbg等方法都不行,后来在网上搜了下,终于找到了解决方案,但是原因还是不明。 在OD调试之前,需要先手动去修改一下这个PE程序“导出表”中的“函数名数目”值。方法:使用“LordPE”打开要编辑的PE程序,然后依次选择[目录]-> [导出表对应的“..”按钮],把“函数名数目
2009-11-09 17:57:00 2541 2
原创 搜索PEB结构获取Kernel32.dll基址
TEB偏移0x30处,即FS:[0x30]地址处保存着一个指针,指向PEB,PEB结构的偏移0xC处保存着另外一个指针ldr,该指针执行PEB_LDR_DATA 该结构的后三个成员是指向LDR_MODULE链表结构中相应三条双向链表头的指针,分别是按照加载顺序、在内存中地址顺序和初始化顺序排列的模块信息结构的指针。 Peb->Ldr->Initializat
2009-11-04 10:08:00 3163 1
原创 Overlay
原来用peid查看是否加壳,显示overlay是说明这个PE文件有附加数据。 附加数据是附加在文件后面的,不被映射到内存空间中的数据,它提供它自己的程序打开自己来读取,而在内存空间中看不到这部分数据 DWORD SetFilePointer( HANDLE hFile, //在用CreateFileA打开后得到的
2009-10-28 16:33:00 696
原创 《windows内核情景分析》对象的创建
创建系统调用的过程: 1.通过ObCreateObject()创建目标对象 2.目标对象本身的初始化 3.通过ObInsertObject()将目标对象插入对象目录和句柄表,并返回句柄。 凡是创建对象的系统调用,都要提供至少两个输入参数,其一是DesiredAccess,说明所创建对象的访问模式;另外一个是ObjectAttributes,这是一
2009-10-10 16:47:00 527
原创 《windows内核情景分析》句柄和句柄表
每个进程都有个句柄表,在EPROCESS结构的0xc4偏移处的ObjectTable,类型为_HANDLE_TABLE,用来指向本进程的句柄表 第一项TableCode是个指针数组,对应为HANDLE_TABLE_ENTRY数据结构,每个有效的句柄都对应着(某个)句柄表中的一个表项 表项的第一项Object指向某个对象的头部,而该表项在句柄表中的位置则取
2009-10-10 08:12:00 880
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人