修改PE中的函数为导出函数
作者:admin 日期:2009-10-04
壳的介绍以及脱壳常用思路
作者:admin 日期:2009-10-04
进程PEB结构的修改实现
作者:admin 日期:2009-10-04
Win32系统中进程主线程初始化时,ebx指向PEB的问题
作者:admin 日期:2009-10-04
我相信大家在用OD的过程中也早已发现,如果不使用Create_SUSPENDED,初始化线程在跑到入口点后,其ebx同样指向PEB结构。
显然,我们必须进入Win32系统新进程创建的过程来找这个真相。由于我们知道初始化线程被创建后(尚未Resume)ebx就已经指向PEB了,所以要不然就是在NtCreateThread过程中,要不然就是在它前面。同时也应该在NtCreatePeb之后。因此我就在这个范围内找寻。
应该说这里我犯了个错误,就是没有详细看CreateProcess的流程,而是使劲往NtCreateThread的内核代码看去,N多函数调用关系看得我眼花,虽然这些内核函数对线程的Context有诸多操作,但是均并不涉及其Ebx。
显然,我们必须进入Win32系统新进程创建的过程来找这个真相。由于我们知道初始化线程被创建后(尚未Resume)ebx就已经指向PEB了,所以要不然就是在NtCreateThread过程中,要不然就是在它前面。同时也应该在NtCreatePeb之后。因此我就在这个范围内找寻。
应该说这里我犯了个错误,就是没有详细看CreateProcess的流程,而是使劲往NtCreateThread的内核代码看去,N多函数调用关系看得我眼花,虽然这些内核函数对线程的Context有诸多操作,但是均并不涉及其Ebx。
fs寄存器及kernel32.dll地址的获取
作者:admin 日期:2009-10-02
XDE反汇编引擎源代码
作者:admin 日期:2009-09-30
手工加载exe到内存(loadEXE.cpp)
作者:admin 日期:2009-09-28
Rootkit技术之内核钩子原理
作者:admin 日期:2009-09-28
总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各
一、系统调用表
系统调用表又称系统服务表或者服务描述符表,是Windows 内核在进行各种系统操作时所需的一个函数指针表。也就是说,这个表中存放的是提供系统服务的各种函数的地址。当然,该表所指向的都是系统自身的一些函数,但是,如果我们对它做了手脚后,就可以让它指向我们自己的函数。这正是本文要讲解的重点。
不用驱动进入内核模式
作者:admin 日期:2009-09-26
不用驱动进入内核模式并且利用APIC得到中断的信息
说明:原文地址 http://www.codeproject.com/system/soviet_kernel_hack.asp
转载请说明译者:WH QQ: 19552451, QQ Group: 5497193
介绍:
尽管使user-mode的应用程序进入kernel绝对是一件令人激动的体验,但是这已经不是什么新鲜事了/还有很多事情我们从未听说过。Matt Pietrek是第一个完成这件事的人(许多年前他在windows95上做过了)。他的技术后来被Prasad Dabak, Sandeep Phadke和 MilindBorate修改了一下用到了windows NT上。为了从一个应用程序进入kernel,其中一个方法是去调用全局描述表(Global Descriptor Table(GDT))中的门调用描述符(call gate descriptor),所以一个应用程序能够通过门调用进入kernel。然而一旦 user-mode代码不允许进入GDT,上面作者使用的kernel-mode 驱动就是为了去调用一个描述门。那么,有个很合乎逻辑的问题会被提出,如果你始终需要用一个驱动来起作用那么离开驱动来实现这个功能其最关键的是什么?毕竟,用驱动的方法仅仅是达到了这个目的,难道你不认为吗?
说明:原文地址 http://www.codeproject.com/system/soviet_kernel_hack.asp
转载请说明译者:WH QQ: 19552451, QQ Group: 5497193
介绍:
尽管使user-mode的应用程序进入kernel绝对是一件令人激动的体验,但是这已经不是什么新鲜事了/还有很多事情我们从未听说过。Matt Pietrek是第一个完成这件事的人(许多年前他在windows95上做过了)。他的技术后来被Prasad Dabak, Sandeep Phadke和 MilindBorate修改了一下用到了windows NT上。为了从一个应用程序进入kernel,其中一个方法是去调用全局描述表(Global Descriptor Table(GDT))中的门调用描述符(call gate descriptor),所以一个应用程序能够通过门调用进入kernel。然而一旦 user-mode代码不允许进入GDT,上面作者使用的kernel-mode 驱动就是为了去调用一个描述门。那么,有个很合乎逻辑的问题会被提出,如果你始终需要用一个驱动来起作用那么离开驱动来实现这个功能其最关键的是什么?毕竟,用驱动的方法仅仅是达到了这个目的,难道你不认为吗?
进程创建和映像装入 windows
作者:admin 日期:2009-09-26
关于Windows的进程创建和映像装入的过程,“Microsoft Windows Internals 4e”一书的第六章中有颇为详细的说明。本文就以此为依据,夹译、夹叙、夹议地作一介绍。书中说,创建进程的过程分成六个阶段,发生于操作系统的三个部分中,那就是:Windows客户端即某个应用进程的包括Kernel32.dll在内的动态连接库,Windows的“执行体”、即内核(确切地说是内核的上层),以及Windows子系统的服务进程Csrss中。这六个阶段是:
1. 打开目标映像文件。
2. 创建Windows的“执行体进程对象”,也就是内核中的“进程控制块”数据结构。
3. 创建该进程的初始(第一个)线程,包括其堆栈、上下文、以及“执行体线程对象”,即内核中的“线程控制块”数据结构。
4. 将新建进程通知Windows子系统。
1. 打开目标映像文件。
2. 创建Windows的“执行体进程对象”,也就是内核中的“进程控制块”数据结构。
3. 创建该进程的初始(第一个)线程,包括其堆栈、上下文、以及“执行体线程对象”,即内核中的“线程控制块”数据结构。
4. 将新建进程通知Windows子系统。
进程控制块pcb
作者:admin 日期:2009-09-26
存储管理的基本原理
作者:admin 日期:2009-09-26
windows下堆溢出的几种利用方式
作者:admin 日期:2009-09-26
简析内存分页机制
作者:admin 日期:2009-09-25
其实分页机制并不复杂,无论关于cpu的技术文章还是操作系统技术的文章都会提到分页机制,这是一种虚拟存储器的实现方法。
虚拟存储器的思想是程序、数据和堆栈的大小都有可能超过物理内存大小,由操作系统把当前使用的放在内存,而不需要的放在磁盘。
而绝大部分操作系统使用的虚拟存储器技术就是分页技术。
在虚拟存储器中,程序所产生的地址为虚拟地址,虚拟地址构成了虚拟地址空间。(当然了在没有虚拟存储器的系统上,程序产生的地址就是物理地址。其实程序并不知道,只是操作系统和处理器知道。下面都是按照使用虚拟存储器的系统来说)这些虚拟地址通过MMU(内存管理单元)映射为物理地址。
采用分页机制的系统,虚拟地址空间以页面为单位进行划分,虚拟地址空间会被划分成多个等大小的页面。物理地址空间也按页面为单位进行划分每一块成为页帧,或者页框。每一虚拟页面可以随意对应到物理页框,也可以对应到磁盘的页面文件的上。
虚拟存储器的思想是程序、数据和堆栈的大小都有可能超过物理内存大小,由操作系统把当前使用的放在内存,而不需要的放在磁盘。
而绝大部分操作系统使用的虚拟存储器技术就是分页技术。
在虚拟存储器中,程序所产生的地址为虚拟地址,虚拟地址构成了虚拟地址空间。(当然了在没有虚拟存储器的系统上,程序产生的地址就是物理地址。其实程序并不知道,只是操作系统和处理器知道。下面都是按照使用虚拟存储器的系统来说)这些虚拟地址通过MMU(内存管理单元)映射为物理地址。
采用分页机制的系统,虚拟地址空间以页面为单位进行划分,虚拟地址空间会被划分成多个等大小的页面。物理地址空间也按页面为单位进行划分每一块成为页帧,或者页框。每一虚拟页面可以随意对应到物理页框,也可以对应到磁盘的页面文件的上。
PEB获取GetProcAddrees函数地址
作者:admin 日期:2009-09-05
纯手工构造超小pe
作者:admin 日期:2009-09-03
从内存资源中加载DLL 模拟PE加载器
作者:admin 日期:2009-09-02
一种保护应用程序的方法 模拟Windows PE加载器,从内存资源中加载DLL
1、前言
目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都是单独提供一个DLL来完成,而主模块通过调用DLL中的接口来完成授权功能。虽然这些软件一般都采用了加壳和反调试等保护,但是一旦这些功能失去作用,比如脱壳,反反调试,HOOK API或者干脆写一个仿真的授权DLL(模拟授权DLL的所有导出函数接口),然后仿真的DLL再调用授权DLL,这样所有的输入首先被仿真DLL截获再传递给授权DLL,而授权DLL的输出也首先传递给仿真DLL再传递给主程序,这样就可以轻易的监视二者之间的输入输出之间的关系,从而轻易的截获DLL中的授权信息进行修改再返回给主程序。
2、目前隐式调用敏感DLL中可能存在的安全隐患
1、前言
目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL版本,并且很多专业软件的授权部分的API,都是单独提供一个DLL来完成,而主模块通过调用DLL中的接口来完成授权功能。虽然这些软件一般都采用了加壳和反调试等保护,但是一旦这些功能失去作用,比如脱壳,反反调试,HOOK API或者干脆写一个仿真的授权DLL(模拟授权DLL的所有导出函数接口),然后仿真的DLL再调用授权DLL,这样所有的输入首先被仿真DLL截获再传递给授权DLL,而授权DLL的输出也首先传递给仿真DLL再传递给主程序,这样就可以轻易的监视二者之间的输入输出之间的关系,从而轻易的截获DLL中的授权信息进行修改再返回给主程序。
2、目前隐式调用敏感DLL中可能存在的安全隐患
pe重定位表学习手册
作者:admin 日期:2009-09-02
加密pe导入表
作者:admin 日期:2009-08-29
学习了pe结构和加载器的原理之后我们知道加载器加载可执行文件的时候会自动加载需要的dll文件和改写导入表函数地址。要是纯粹加密了导入表导致的结果就是执行文件无法被加载。而这次我要讲的就是加密导入表,而且要保证文件正常执行。怎么做呢?
当然这只是我的一个设想,有时间我会做一下试验。
首先要做的就是找到文件中的导入表并把他整个移动到别的地方,有必要的话也可以加密一下。,然后在原来的导入表的位置构造一个新的导入表,这个导入表里面只有kernel32.dll一个dll和LoadLibraryA,GetProcAddress两个函数,这样pe应该是可以正常加载的。
然后我们要做的就是添加一段代码,并设置为程序的入口点。这段代码的作用就是到我们保存真正导入表的地方把导入表数据全部抄回到原来的地方,并修改每个函数的地址(地址可以用LoadliabrarA和GetProcAddress得到)。最后跳转到真正的程序入口点。
当然这只是我的一个设想,有时间我会做一下试验。
首先要做的就是找到文件中的导入表并把他整个移动到别的地方,有必要的话也可以加密一下。,然后在原来的导入表的位置构造一个新的导入表,这个导入表里面只有kernel32.dll一个dll和LoadLibraryA,GetProcAddress两个函数,这样pe应该是可以正常加载的。
然后我们要做的就是添加一段代码,并设置为程序的入口点。这段代码的作用就是到我们保存真正导入表的地方把导入表数据全部抄回到原来的地方,并修改每个函数的地址(地址可以用LoadliabrarA和GetProcAddress得到)。最后跳转到真正的程序入口点。