枚举系统所有ApiHook功能支持库

易语言 2020-09-01 10:46:22

枚举系统所有ApiHook功能支持库

进程ID取模块 (, 模块数组)
.计次循环首 (取数组成员数 (模块数组), i)
.如果真 (i ≠ 1) ' i=1是xxx.exe而不是xxx.dll 所以不需要
调试输出 (“************* 在模块:” + 到文本 (模块数组 [i].模块文件名) + “下 ***********”)
枚举ApiHook (到文本 (模块数组 [i].模块文件名))
调试输出 (“”)
.如果真结束

hModule = API_GetModuleHandle (PE文件)
PE文件 = 取模块完整路径 (, PE文件) ' 由xxx.dll获取DLL全路径
.如果真 (PE文件 = “”)
调试输出 (“无法获取DLL路径!”)
返回 ()
.如果真结束
文件号 = 打开文件 (PE文件, #读入, #无限制)
.如果真 (文件号 = 0)
返回 ()
.如果真结束
tmp = 读入字节集 (文件号, 64)
.如果真 (取字节集长度 (tmp) = 64)
RtlMoveMemory_IMAGE_DOS_HEADER (IMAGE_DOS_HEADER, 取变量数据地址 (tmp), 64)
.如果真 (IMAGE_DOS_HEADER.e_magic = 23117)
移动读写位置 (文件号, #文件首, IMAGE_DOS_HEADER.e_lfanew)
tmp = 读入字节集 (文件号, 248)
.如果真 (取字节集长度 (tmp) = 248)
RtlMoveMemory_IMAGE_NT_HEADERS32 (IMAGE_NT_HEADERS32, 取变量数据地址 (tmp), 248)
.如果真 (IMAGE_NT_HEADERS32.Signature = 17744)
.如果真 (IMAGE_NT_HEADERS32.OptionalHeader.DataDirectory [2].Size > 0)
重定义数组 (IMAGE_SECTION_HEADER, 假, IMAGE_NT_HEADERS32.FileHeader.NumberOfSections)
移动读写位置 (文件号, #文件首, IMAGE_DOS_HEADER.e_lfanew + 248)
tmp = 读入字节集 (文件号, IMAGE_NT_HEADERS32.FileHeader.NumberOfSections × 40)
.如果真 (取字节集长度 (tmp) = IMAGE_NT_HEADERS32.FileHeader.NumberOfSections × 40)
RtlMoveMemory_IMAGE_SECTION_HEADER (IMAGE_SECTION_HEADER, 取变量数据地址 (tmp), IMAGE_NT_HEADERS32.FileHeader.NumberOfSections × 40)
.如果真 (IMAGE_NT_HEADERS32.OptionalHeader.DataDirectory [1].Size > 0)
移动读写位置 (文件号, #文件首, IMAGE_NT_HEADERS32.OptionalHeader.DataDirectory [1].VirtualAddress - 计算偏差 (IMAGE_NT_HEADERS32.OptionalHeader.DataDirectory [1].VirtualAddress))
tmp = 读入字节集 (文件号, 40)
.如果真 (取字节集长度 (tmp) = 40)
RtlMoveMemory_IMAGE_EXPORT_DIRECTORY (IMAGE_EXPORT_DIRECTORY, 取变量数据地址 (tmp), 40)
.如果真 (IMAGE_EXPORT_DIRECTORY.Name ≠ 0)
移动读写位置 (文件号, #文件首, IMAGE_EXPORT_DIRECTORY.Name - 计算偏差 (IMAGE_EXPORT_DIRECTORY.Name))
读入数据 (文件号, str)
偏差1 = 计算偏差 (IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals)
偏差2 = 计算偏差 (IMAGE_EXPORT_DIRECTORY.AddressOfFunctions)
.计次循环首 (IMAGE_EXPORT_DIRECTORY.NumberOfNames, i)
移动读写位置 (文件号, #文件首, IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals - 偏差1 + i × 2 - 2)
读入数据 (文件号, Ordinal)
移动读写位置 (文件号, #文件首, IMAGE_EXPORT_DIRECTORY.AddressOfFunctions - 偏差2 + Ordinal × 4)
读入数据 (文件号, Function)
移动读写位置 (文件号, #文件首, IMAGE_EXPORT_DIRECTORY.AddressOfNames - 计算偏差 (IMAGE_EXPORT_DIRECTORY.AddressOfNames) + i × 4 - 4)
读入数据 (文件号, Name)
移动读写位置 (文件号, #文件首, Name - 计算偏差 (Name))
读入数据 (文件号, str)
ApiAddr = API_GetProcAddress (hModule, str)
tmp = 指针到字节集 (ApiAddr, 2)
.如果真 (到字节集 (tmp [1]) = { 233 } 或 tmp = { 255, 37 })
调试输出 (“发现ApiHook! Hook地址:” + 取十六进制文本 (ApiAddr) + “ | Api名称:” + str)
.如果真结束
' 调试输出 (取十六进制文本 (ApiAddr) + “ | ” + str)
.计次循环尾 ()