平时用到的一些工具类, 这部分内容涉及面比较广, 慢慢补全
未完成, 某些代码需要重新实现, pe部分编译后不够小, 需要改得更简洁
下面是旧描述,更新完代码后再重新写描述
#PE ###PE解析
#include <PE\PeDecoder.h>
可以调用子文件夹的迭代器头文件, 可解析PE文件的:
- 节表
- 导入表
- 导出表
- 资源
- 重定位表
- 延迟导入表
缺读取器的结构有
Debug,Exception,Security,Architecture,Tls,LoadConfig,BoundImport,ComDescriptor.
pedecoder可以返回结构指针, 缺少读取器是因为不常用, 以后用到再补
###PE修改 未完成, 如果需要修改,现在可以用decoder返回的地址修改
#进程 ###解析PEB
#include <Process\EnvironmentBlock\EnvironmentBlock.h>
包含:
1.PEB、TEB结构定义
定义来自reactos源码
2.LdrDataTableEntry读取器
可以使用三种方式遍历LdrDataTable
3.搜索LdrDataTable,取得已经载入的DLL的句柄的函数
###Hook ####导入表(IAT) Hook
#include <Process\Hook\IatHook.h>
####导出表(EAT) Hook
#include <Process\Hook\EatHook.h>
不支持64位
####延迟导入表(DelayLoad) Hook
#include <Process\Hook\DelayLoadHook.h>
使用vs2015后,相关结构定义的头文件在sdk中改名了,所以用的是新的那一个定义,旧版本编译时可能会找不到相关定义
####API Hook
#include <Process\Hook\ApiHook.h>
// ...
oldFunctionAddress =(decltype(&MessageBoxA))HookApi32(MessageBoxA, MessageBoxA_Hook1);
包含了一个返回指令长度的Opcode解析器 (Process\Hook\Opcode)
支持多次Hook同一个函数, 也有只hook一次的精简版本
UnHook 待续(通常不需要)
###动态调用
#include <Process\LazyLoad\LazyLoadSystemApi.h>
// 直接使用已经定义的Kernel32_Dll、NtDll_Dll、User32_Dll来动态调用函数,
// 不全,只注册了常用的一些函数, 使用方法类似:
Kernel32_Dll._GetSystemInfo(&sysinfo);
// ...
NtDll_Dll._NtFreeVirtualMemory(hProcess,
&lpAddress,
&dwSize,
dwFreeType);
// ...
###重写WinApi 在上面动态调用的例子中, 如果只需要基础的LoadLibrary和GetProcAddress, 可以
#include <Process\LazyLoad\LazyLoad.h>
里面包含了重写的两个函数和一些扩展. _LoadLibraryW使用ntdll.dll(读取PEB取到的句柄)的LdrLoadDll来载入dll, 已存在dll的句柄都是通过读取peb获得的. _GetProcAddress使用的是解析pe获取的函数地址.
代码、dll注入相关的一些函数重写了(不需要重写版本可以使用Kernel32_Dll的动态调用版本).
#include <Process\OverwriteWinApi\OverwriteWinApi.h>
代码修改自reactos
包括打开进程、读写释放远程进程内存、设置内存保护标记、设置线程上下文信息等
启动远程线程等函数等写到再添加, 所以这部分待续
#其它 ###DisAsm 未完成, 太费时, 先在apihook中编写了一个只解析指令长度的版本(这个版本有bug,等新的完成再替换掉)