PE文件
Dreamer12138
这个作者很懒,什么都没留下…
展开
-
反射Dll注入
上一篇我们介绍了CreateRemoteThread+LoadLibrary进行注入的技巧。但是这种方法实在是太过格式化,所以几乎所有的安全软件都会监控这种方法。所以HarmanySecurity的Stephen Fewer提出了ReflectiveDLL Injection,也就是反射DLL注入。其和CreateRemoteThread一样也是分为两部分,注入器和注入的DLL。但是注入DLL的装载由我们自主实现,由于反射式注入方式并没有通过LoadLibrary等API来完成DLL的装载,DLL并没有原创 2020-05-17 17:31:44 · 821 阅读 · 0 评论 -
IAT Hook
IAT Hook 本质就是将PE的导入表中的IAT中指定函数的地址进行替换,从而实现Hook。我的IAT Hook 是配合CreateRemoteThread进行注入Hook的。关于CreateRemoteThread请参照:CreateRemoteThread// dllmain.cpp : 定义 DLL 应用程序的入口点。#include "pch.h"#include <tlhelp32.h>#include <imagehlp.h>#pragma comm原创 2020-05-16 19:22:29 · 679 阅读 · 0 评论 -
TLS(线程局部存储)
TLS全称线程局部存储器,它用来保存变量或回调函数。 TLS里面的变量和回调函数都在程序入口点(AddressOfEntry)之前执行,也就是说程序在被调试时,还没有在入口点处断下来之前,TLS中的变量和回调函数就已经执行完了,所以TLS可以用作反调试之类的操作。 要在程序中使用TLS,必须为TLS数据单独建一个数据段,用相关数据填充此段,并通知链接器为TLS数据在PE文件头中添加数据。__declspec (thread)int g_nNum = 0x9597;__declspec (原创 2020-05-16 15:46:40 · 808 阅读 · 0 评论 -
延迟导入表
延迟导入表,顾名思义就是有一些函数或模块,不需要再程序一启动就加载导入,而是等到真正用到的时候才进行导入的。延迟导入表和导入表结构基本类似也存在IAT和INT,存在双桥结构,这里不再赘述,关于导入表请参考:先看一下延迟导入表的结构体。typedef struct ImgDelayDescr { DWORD grAttrs; // attributes RVA rvaDLLName; // RVA to dll n原创 2020-05-16 15:46:32 · 444 阅读 · 0 评论 -
重定位表
首先我们要知道PE文件在映射进内存的时候有一个默认基址保存在可选头的ImageBase中所以每次在映射进内存的时候都会在这个地址进行映射,都是所有的dll的默认基址都是一样的,如果一个dll的默认基址已经被其他dll占据了怎么办。只能映射到别的地方。从而ImageBase中的值就没有了参考价值。程序中有许多常量值是按照基址为ImageBase编写的,Offset HEX Assembly10001000 55 push ebp原创 2020-05-16 15:46:20 · 480 阅读 · 0 评论 -
导出表
导出表大多存在于dll中,其主要目的就是导出一些可供其他exe调用的函数。导出的函数分两种,一种按名称导出,一种按序号导出。导出表的大体结构如下:typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 1) 保留,恒为0x00000000 DWORD TimeDateStamp; // 2) 时间戳,导出表创建的时间(GMT时间) WORD MajorVersion; // 3)原创 2020-05-16 15:46:06 · 1115 阅读 · 0 评论 -
导入表
一个PE文件的导入表,简单说的说就是存放了其所调用的函数的地址和相关信息。数据目录表的第1项(从0开始)就存放了导入表导入表的结构struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; } DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD原创 2020-05-16 15:45:50 · 671 阅读 · 0 评论