0x01 MS-DOS头 MS-DOS头部的字段重点关注e_magic与最后一个e_lfanew是需要关注的. 第一个e_magic字段的值为4D5A,作用是可以作为判断这个文件是否是PE文件. 最后一个e_lfanew字段可以引导我们找到新的EXE文件头,从而进一步判断这个可执行文件是否为PE文件. 如果从这个文件开头用PIMAGE_DOS_HEADER解析,e_magic成员不是IMAGE_DOS_SIGNATURE,那么就不是一个PE文件. MS-DOS头结构: typedef struc…
0x1 if-else分支 if-else分支4种状态 1.1 以常量为判断条件的简单if-else分支 C源代码: 单层if-else判断,常量为判断条件 int _tmain(int argc, _TCHAR* argv[]) { int nTest = 1; if (nTest>0) printf("Hello world!\r\n"); else printf("Hello everybody!\r\n"); return 0; } if-else分支…
0x1 准备工作 1.1.准备工具 IDA:交互式反汇编工具 OllyDbg:用户层调试工具 Visual Studio:微软开发工具 1.2.基础知识 C++开发 汇编语言 0x2 查找真正的main()函数 入口点开始到Main()函数之间的代码都是编译器加进去用于初始化环境用的. main()函数其实是有3个参数的,这取决于Windows系统的机制. 查找方法: 1.字符串搜索法 2.栈回溯法 3.逐步分析法 4.小例子 C源代码: 程序执行的时候会将路径保存在argv字符数组中,因此ar…
0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描. 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的. 修改区段名 1.1 移动PE文件头位置免杀 工具:PeClean SizeOfOptionalHeader字段来描述扩展头的大小,恒定值为0xE0. 某些程序直接使用0xE0对PE文件进行处理,对于修改过的程序会被识别为非PE文件. 1.2 导入表移动免杀 通过修改程序里导入表ThunkValue值实现. 1)通过ThunkValue的偏移地址,找到AP…
1.免杀技巧的遏制 1.1.PE文件 入口点不在第一个区段或在最后一个区段 入口点处代码附近只有一小段代码 入口点在正常范围之外 入口点为一个无效的值,实际入口点为TLS的入口点 区段名重复或者不属于正常范围 拥有可执行属性的区段数量过多 1.2.程序行为 加载系统DLL 枚举反病毒软件进程的窗口 将自己复制到系统目录 安装SPI(控制网络通信或者另类的方法远程注入DLL文件) 远程注入线程或改写其他进程的内存 操作MBR 2.Anti Rootkit 2.1.检查SSDT钩子与IDT钩子 一般…
第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.freebuf.com/sectool/40580.html 细读一遍这一章的知识才知道自己当时使用MyCCL免杀失败的原因.因为某些反病毒软件的扫描器采用的是密码校验和技术,密码校验和指的是将一段病毒文件代码计算出特定的值,然后与病毒库的值进行比对,如果匹配到特征码则有毒,反之则无毒. 3.1 特征码免…
1.源码免杀 1.1 定位产生特征的源码 定位文件特征 1.根据MyCCL的特征码定位工具,定位出有特征的地址 2.根据VS的反汇编窗口,输入有特征的地址得到特征地址与源码的关系 3.插入MessageBox,然后定位出特征码离哪个MessageBox最近,并在附近以更高密度安插MessageBox,最终定位出产生特征码的源码位置. 定位行为特征 1.启发式检测方法:特征码定位突破 2.虚拟机检查方法:通过控制程序仅执行部分代码,在远程线程注入前插入MessageBox,起到断点作用. 3.基于…
虚函数存在是为了克服类型域解决方案的缺陷,以使程序员可以在基类里声明一些能够在各个派生类里重新定义的函数. 1 识别简单的虚函数 代码示例: #include "stdafx.h" #include <Windows.h> class CObj { public: CObj():m_Obj_1(0xAAAAAAAA),m_Obj_2(0xBBBB) { printf("CObj() Constructor...\r\n"); } ~CObj() { pr…
0x1 switch-case分支 switch-case其实就是if-else语句的另一种体现形式.但大于3之后的switchc-case.编译器会对代码进行优化. 1.1 简单switch-case分支识别技巧 C源代码: int _tmain(int argc, _TCHAR* argv[]) { int nNum = 2; switch (nNum) { case 0: printf("nNum=0", nNum); break; case 1: printf("nN…
1.构建Rootkit基础环境 1.1.构建开发环境 VS2012+WDK8 1.2.构建基于VS2012的调试环境 将目标机.调试机配置在同一个工作组内 sVS2012配置->DRIVER->Test->Configure Computers,Add New computer按钮. 1.3.构建基于Windbg的调试环境 WinDBG+Vmware+VirtualKD 1.4.将Rootkit加载到系统 SCM(服务控制管理器)加载驱动 OpenSCManager():获取SCM句柄…