核心编程关于hookAPI的代码,有些地方不明白,有劳高手释疑

zy1691 zy1691 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
第22章最后的那个例子,关于hookAPI的。


///////////////////////////////////////////////////////////////////////////////


// When an application runs on Windows 98 under a debugger, the debugger
// makes the module's import section point to a stub that calls the desired
// function. To account for this, the code in this module must do some crazy
// stuff. These variables are needed to help with the crazy stuff.


// The highest private memory address (used for Windows 98 only)
PVOID CAPIHook::sm_pvMaxAppAddr = NULL;
const BYTE cPushOpCode = 0x68; // The PUSH opcode on x86 platforms


///////////////////////////////////////////////////////////////////////////////


// The head of the linked-list of CAPIHook objects
CAPIHook* CAPIHook::sm_pHead = NULL;


///////////////////////////////////////////////////////////////////////////////

CAPIHook::CAPIHook(PSTR pszCalleeModName, PSTR pszFuncName, PROC pfnHook,
BOOL fExcludeAPIHookMod) {

if (sm_pvMaxAppAddr == NULL) {
// Functions with address above lpMaximumApplicationAddress require
// special processing (Windows 98 only)
SYSTEM_INFO si;
GetSystemInfo(&si);
sm_pvMaxAppAddr = si.lpMaximumApplicationAddress;
}

m_pNext = sm_pHead; // The next node was at the head
sm_pHead = this; // This node is now at the head

// Save information about this hooked function
m_pszCalleeModName = pszCalleeModName;
m_pszFuncName = pszFuncName;
m_pfnHook = pfnHook;
m_fExcludeAPIHookMod = fExcludeAPIHookMod;
m_pfnOrig = GetProcAddressRaw(
GetModuleHandleA(pszCalleeModName), m_pszFuncName);
chASSERT(m_pfnOrig != NULL); // Function doesn't exist

if (m_pfnOrig > sm_pvMaxAppAddr) {
// The address is in a shared DLL; the address needs fixing up
PBYTE pb = (PBYTE) m_pfnOrig;
if (pb[0] == cPushOpCode) {
// Skip over the PUSH op code and grab the real address
PVOID pv = * (PVOID*) &pb[1];
m_pfnOrig = (PROC) pv;
}
}

// Hook this function in all currently loaded modules
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnOrig, m_pfnHook,
m_fExcludeAPIHookMod);
}




就是这个CAPIHook的构造函数,ReplaceIATEntryInAllMods前面的部分不太明白什么意思,希望哪位高手来给解释一下。
...全文

相关推荐

HookAPI HookAPI HookAPI

HookAPI HookAPI HookAPI HookAPI

tomatogroup

用C++实现仿OllyDbg调试器:核心原理与踩坑实践

软件调试是深入理解程序运行机制的核心技术,调试器作为观察和控制进程执行的关键工具,其工作原理涉及事件循环、异常分发和上下文管理。其中,断点机制通过修改指令触发异常来暂停程序,反汇编引擎则将机器码转换为可读汇编指令,二者是调试器最基础也最关键的能力。掌握这些原理,不仅有助于开发自己的调试工具,对逆向分析、漏洞研究、底层性能优化亦有重要价值。C++凭借其对系统API的直接调用和底层控制能力,成为实现调试器的理想语言。本文基于一个仿OllyDbg的C++项目,梳理了调试器整体架构、断点与单步执行的实现细节,以及U

彭河森

API Hook实战:用Inline Hook伪造硬盘序列号与MAC地址

API Hook是一种通过拦截系统函数调用,在应用程序层修改数据流或行为的通用技术。其核心原理是改写目标函数的入口字节,使程序跳转到自定义逻辑执行,再跳回原函数继续运行。这种思路在Windows平台上广泛应用于安全监控、软件调试、虚拟化场景模拟等领域,尤其当需要临时调整系统返回的信息时,Hook技术能够以较低成本实现动态干预。例如在虚拟化测试中模拟不同硬件配置,或在隐私保护实验中隐藏真实设备标识。基于此思路,HDHook项目演示了如何通过Inline Hook技术拦截DeviceIoControl与GetA

名字太短的葱

HookAPI(Delphi代码)

HookAPI(Delphi代码) 希望对你有用.

kook366

HookAPI

HookAPI是一个可以截获Windows的系统32位API和用户32位DLL中函数的调用接口,并可在函数被调用时替换为自己的函数,也可以禁止原函数的调用的开发包。 开发包使用简单,用户只需要编写自己的处理函数并编译成一个mydll.dll文件就行了 。HookAPI是目前最热门的安全产品开发的利器。 运行平台:Windows NT/2000/XP,Windows9x 开发平台: Visual C++ 6.0

hello008
评论 9
收藏 已收藏
分享
返回顶部
zy1691
进程/线程/DLL 15,466 成员 49,169 内容