PE
oalken
这个作者很懒,什么都没留下…
展开
-
【2021.01.16】HOOK攻防、瞬时(临时)HOOK
常用手段阶段一防守:检测JMP(E9)、检测跳转范围。 攻击:想方设法绕开。阶段二防守:线程全代码校验/CRC校验。 攻击:修改检测代码、挂起检测线程。阶段三防守:相关API进行全代码校验,多个线程互相检测,并检测线程是否活动。 攻击:使用瞬时钩子/硬件钩子。...原创 2021-01-16 18:30:13 · 660 阅读 · 0 评论 -
【2021.01.15】INLINE HOOK
IAT HOOK的缺点容易被检测。 只能HOOK IAT表中的函数。例子#include <Windows.h>#define PATCH_LENGTH 5DWORD dwHookAddress = NULL;char szNewText[] = "Inline Hook";void MessageBoxProc(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType){ //该函数想怎么写怎么写 没有限制原创 2021-01-15 23:37:28 · 166 阅读 · 0 评论 -
【2021.01.15】IAT HOOK
IATIAT(Import Address Table),导入地址表。#include <iostream>#include <Windows.h>DWORD g_dwIATHookFlag = FALSE; //HOOK状态 是否已经HOOKDWORD g_dwOldAddr = NULL; //保存原始函数的地址DWORD g_dwNewAddr = NULL; //保存HOOK函数的地址BOOL SetIATHOOK(DWORD dwOldAddr,原创 2021-01-15 20:23:14 · 120 阅读 · 0 评论 -
【2021.01.15】Virtual Table Hook
什么是HOOK?HOOK是用来获取、更改程序执行的某些数据,或是用于更改程序执行流程的一种技术。 HOOK的两种主要形式:修改函数代码:INLINE HOOK(内联HOOK) 修改函数地址:IAT HOOK、SSDT HOOK、IDT HOOK、EAT HOOK、IRP HOOK什么是Virtual Table?虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的,简称为V-Table。 一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保原创 2021-01-15 18:36:39 · 175 阅读 · 0 评论 -
【2021.01.15】注入ShellCode
什么是ShellCode?不依赖环境,在任何地方都能执行的机器码(硬编码)。ShellCode的编写原则不能有全局变量。 不能使用常量字符串、 不能使用系统调用。 不能嵌套调用其他函数。ShellCode的问题由于第 3 点,所以不能直接使用函数,因为直接使用函数在编译时会产生导入表。而将代码复制到其他进程中,其他进程没有需要的导入表,所以会出问题。那么该怎么解决这个问题呢?可以不依赖任何导入表得到进程的TEB,其次,通过TEB找到PEB,再找到 3 个链表。对链表进行遍原创 2021-01-15 18:16:00 · 695 阅读 · 0 评论 -
【2021.01.15】重定位表
什么是重定位表?为什么要有重定位表?如上图 A.DLL 和 B.DLL 中某个或多个的全局变量编译时可能是相同的内存地址。 如果 A.DLL 先行加载,其中的某个全局变量抢占到了 0x00410000 这个内存地址。 B.DLL 因为后加载的原因,是从 0x00420000 处开始展开。此时,B.DLL 中如果有全局变量的地址也是 0x00410000 这个内存地址,就会出问题。 因为在调用 B.DLL 中某个全局变量的时候,如 0x00410000 地址的变量,但因为 B.DLL 不是从 0原创 2021-01-15 03:32:01 · 238 阅读 · 0 评论 -
【2021.01.14】导入表
一个进程是由一组PE文件构成的。 PE文件提供哪些功能:导出表。 PE文件需要依赖哪些模块以及依赖这些模块中的哪些函数:导入表。导入表结构typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; //RVA指向IMAGE_THUNK_DATA结构数组 } DUMMYUNIONNAME;原创 2021-01-14 23:08:50 · 130 阅读 · 0 评论 -
【2021.01.14】导出表
导出表结构如何找到导出表?在扩展PE头(IMAGE_OPTIONAL_HEADER)的最后一个结构体成员中能找到IMAGE_EXPORT_DIRECTORY。typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name;原创 2021-01-14 21:36:34 · 111 阅读 · 0 评论 -
【2021.01.14】合并节
#define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; .原创 2021-01-14 21:16:54 · 110 阅读 · 0 评论 -
【2021.01.14】新增节
#define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; .原创 2021-01-14 21:11:27 · 107 阅读 · 0 评论 -
【2021.01.14】扩大节
#define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; .原创 2021-01-14 20:55:55 · 96 阅读 · 0 评论 -
【2021.01.14】RVA与FOA的转换
RVA与FOARVA:相对虚拟地址FOA:文件偏移地址如果想改变一个全局变量的初始值,该怎么做?有初始值的全局变量和没有初始值的全局变量是有区别的,没有初始值的全局变量在PE文件中根本没有它的位置。 只有当被文件被载入到内存中以后,才会给其变量分配内存地址存放它的值。 而有初始值的全局变量,它的初始值是存放在PE文件中的。面临的问题是什么?知道了全局变量的内存地址后,不能直接拿着该变量的地址去PE文件中搜索,因为在内存中展开的PE文件和在文件中的PE文件它们的对齐方式是不同的。原创 2021-01-14 17:11:07 · 346 阅读 · 0 评论 -
【2021.01.14】PE节表
IMAGE_SIZEOF_SHORT_NAME#define IMAGE_SIZEOF_SHORT_NAME 8typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //ASCII字符串,节名称,可以自定义,只截取8个 union { //Misc,是该节在没有对齐前的真实尺...原创 2021-01-14 16:43:55 · 136 阅读 · 0 评论 -
【2021.01.13】扩展PE头属性说明
标准PE头32位和64位PE头结构体有点差异,但是差异不是很大。typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;typedef struct _IMAGE_NT_HEADERS64 {原创 2021-01-13 22:49:18 · 332 阅读 · 0 评论 -
【2021.01.12】标准PE头属性说明
PE头typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //PE标识 IMAGE_FILE_HEADER FileHeader; //标准PE头 IMAGE_OPTIONAL_HEADER32 OptionalHeader; //扩展PE头} IMAGE_NT_HEADERS..原创 2021-01-12 21:51:09 · 329 阅读 · 0 评论 -
【2021.01.11】DOS头属性说明
IMAGE_DOS_HEADERDOS头DOS头由两部分组成:DOS MZ文件头和DOS块。 DOS块不是结构体,而是由单个字节组成的数据,可以填写任何内容。 但是DOS MZ文件头是一个结构体。typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; ..原创 2021-01-11 21:18:52 · 620 阅读 · 0 评论 -
【2021.01.11】PE文件的两种状态
主要结构体注意PE文件静态(不运行)和动态(运行)是有差异的。结构体大小结构体 大小(十进制) IMAGE_DOS_HEADER 64字节 DOS STUB 不确定(链接器插入的数据,可以修改、删除,不影响程序运行) IMAGE_FILE_HEADER 20字节 IMAGE_OPTIONAL_HEADER32 224字节 IMAGE_SECTION_HEADER 每个结构体的成员是40个字节 IMAGE_DOS_HEADER原创 2021-01-11 21:01:25 · 322 阅读 · 0 评论 -
【2021.01.10】PE文件结构
可执行文件可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。 可执行文件的格式:Windows平台:PE(Portable Executable)文件结构 Linux平台:ELF(Executable and Linking Format)文件结构如何识别PE文件?PE文件的特征(PE指纹):分别打开.exe、.dll、.sys等文件,观察前两个特征字节。 不要仅仅通过文件的后缀名来确定是否是PE文件。PE文件的整体结构结构体去哪里找?W原创 2021-01-10 20:56:12 · 145 阅读 · 0 评论