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