怎样编写一个全局勾子勾住系统中的API ?

cabbage 2000-04-17 03:04:00
加精
...全文
1153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
buding 2000-10-01
  • 打赏
  • 举报
回复
关注
huiyugan 2000-09-20
  • 打赏
  • 举报
回复
你说的是要对全局的其他进程都有效是吧?那你的钩子CallBack函数是放在一个动态连接库了,当你的回调函数要和你的程序通信时,你必须保证你的动态连接库和应用程序交换数据用到的变量是在你的两个进程都能存取到的区域,这样你可以用内存映射文件来实现。
stamf 2000-09-14
  • 打赏
  • 举报
回复
看看http://www.searon.com/octopus/Diskprt.zip,这是"网吧管理专家"自带的一个硬盘防删除插件,据作者说,采用的是API调用拦截,没有使用vxd。

当程序载入内存以后,自动切入2G以上的系统内存,并将自带的Dll载入高端内存区,修改Openfile(),Writefile()等等Windows API的指向,用自带的Dll里面的函数替换他们达到拦截API调用的目的。

整个程序压缩以后才20多K,那家伙太厉害了
continue 2000-08-14
  • 打赏
  • 举报
回复
每次调用API都要重读写系统内存好几次,很慢的。
zeatul 2000-07-25
  • 打赏
  • 举报
回复
能借阅一下,for NT 的源程序吗。
allocCStoDsAlise 能用来改TextOutW()的代码吗,否则不能支持IE。
faint!, 我上一篇怎么被删掉了。
flywhc 2000-07-23
  • 打赏
  • 举报
回复
恰好我刚做完这样的一个程序 -- 类似金山词霸的屏幕取词。
我是参考了GUIDLLNT的源程序,不知道这个程序哪里还有。

原理是先用全局鼠标钩子钩进所有进程,替换进程里的DLL入口。
在NT里用VirtualProtect函数改变权限,然后再WriteProcessMemory写入跳转指令
在你的“API钩子”程序里则恢复,处理,再写入跳转指令。

而在WIN9X则完全不同,要用未公开的WIN16函数allocCStoDsAlise
--- 我现在也没做好WIN16的程序,卡在32/16混合编程上了。

可以去各大BBS站搜索一下屏幕取词技术,基本都是两年前的文章 :O
zeatul 2000-07-22
  • 打赏
  • 举报
回复
问题还解决了。
偶也遇到这问题。
请赐教。
cabbage 2000-04-21
  • 打赏
  • 举报
回复
首先谢谢各位

我想要做的是要这个勾子对其它进程也有效
lu0 2000-04-17
  • 打赏
  • 举报
回复
STAR有理.HOOK本身需要USER模块的支持.如果一个应用不需要USER模块.HOOK就
没用了.当然,如果修改了系统区的API代码.影响到的确是全局性的.:)
Star 2000-04-17
  • 打赏
  • 举报
回复
首先,系统中的API范围如何?

其次,钩子针对的是消息,不是API,用钩子来钩API不是不能实现(如果你要求监视的API不是太深),而是不是最好的实现。

我个人的建议是写虚设驱动。
zzh 2000-04-17
  • 打赏
  • 举报
回复
我这里有两个函数,是用来勾住DLL中函数的,你可以参照一下,只要把函数名换一下即可。bool HookFunc (BYTE* pbCodeBuffer, DWORD& dwBufLen)
{
// ole libraries probably have been initialized, just get the handle
HMODULE hModule = GetModuleHandle (_T ("ds_avc.dll"));
if (hModule == NULL)
{
hModule = LoadLibrary (_T ("ds_avc.dll"));
}

// get address of the original CLSIDFromProgID
PVOID pfnOrg = (PVOID) GetProcAddress (hModule, "AvcCmdSetStreamState");

HANDLE hProcess = GetCurrentProcess ();

DWORD dwRead = 0;

// calculate offset from the original procedure to our;
// it doesn't matter the base address of our DLL, since "CPU" jumps always forward;
// notice dwJmpInstructionLen - the offset is calculated from next instruction
DWORD dwHookOffest = (DWORD)FuncProc -
((DWORD) pfnOrg + 5);//dwJmpInstructionLen);

if (!ReadProcessMemory (hProcess,
pfnOrg,
pbCodeBuffer,
dwJmpInstructionLen,
&dwRead))
{
// should be zero in this case
dwBufLen = 0;
return false;
}

// will be used to restore the original code during UnHook
dwBufLen = dwRead;

DWORD dwWritten = 0;

// write the jmp instruction. NT will perform copy-on-write, therefore no
// process will be affected by the change

if (!WriteProcessMemory (hProcess,
pfnOrg, // write at start of CLSIDFromProgID
(LPVOID) &bJmpCode, // jmp code 0xE9
sizeof (bJmpCode),
&dwWritten) && dwWritten != 0)
{
return false;
}

dwWritten = 0;
// write the offset to CLSIDProgIDProc
return (WriteProcessMemory (hProcess,
(LPVOID)((DWORD) pfnOrg + 1), // from the next byte
&dwHookOffest, // offset calculated before
sizeof (DWORD), &dwWritten) &&
dwWritten != 0);
}

bool HookFunc2 (BYTE* pbCodeBuffer, DWORD& dwBufLen)
{
// ole libraries probably have been initialized, just get the handle
HMODULE hModule = GetModuleHandle (_T ("ds_avc.dll"));
if (hModule == NULL)
{
hModule = LoadLibrary (_T ("ds_avc.dll"));
}

// get address of the original CLSIDFromProgID
PVOID pfnOrg = (PVOID) GetProcAddress (hModule, "AvcCmdGetVideoInputLumaSatGainThresh");

HANDLE hProcess = GetCurrentProcess ();

DWORD dwRead = 0;

// calculate offset from the original procedure to our;
// it doesn't matter the base address of our DLL, since "CPU" jumps always forward;
// notice dwJmpInstructionLen - the offset is calculated from next instruction
DWORD dwHookOffest = (DWORD)FuncProc2 -
((DWORD) pfnOrg + 5);//dwJmpInstructionLen);

if (!ReadProcessMemory (hProcess,
pfnOrg,
pbCodeBuffer,
dwJmpInstructionLen,
&dwRead))
{
// should be zero in this case
dwBufLen = 0;
return false;
}

// will be used to restore the original code during UnHook
dwBufLen = dwRead;

DWORD dwWritten = 0;

// write the jmp instruction. NT will perform copy-on-write, therefore no
// process will be affected by the change

if (!WriteProcessMemory (hProcess,
pfnOrg, // write at start of CLSIDFromProgID
(LPVOID) &bJmpCode, // jmp code 0xE9
sizeof (bJmpCode),
&dwWritten) && dwWritten != 0)
{
return false;
}

dwWritten = 0;
// write the offset to CLSIDProgIDProc
return (WriteProcessMemory (hProcess,
(LPVOID)((DWORD) pfnOrg + 1), // from the next byte
&dwHookOffest, // offset calculated before
sizeof (DWORD), &dwWritten) &&
dwWritten != 0);
}


// restore the previously saved code
void UnHookFunc (BYTE* pbCodeBuffer, DWORD dwBufLen)
{
HMODULE hModule = GetModuleHandle (_T ("ds_avc.dll"));
if (hModule != NULL)
{
// the ole32.DLL must be in memory
// get address of the original CLSIDFromProgID
PVOID pfnOrg = (PVOID) GetProcAddress (hModule, "AvcCmdSetStreamState");

HANDLE hProcess = GetCurrentProcess ();

DWORD dwWritten = 0;
WriteProcessMemory (hProcess,
pfnOrg,
pbCodeBuffer,
dwBufLen,
&dwWritten);

}
}

//-----------------------------------------------------------------------------------//
// the actual hook code
//-----------------------------------------------------------------------------------//



UINT _cdecl FuncProc (PVOID,PVOID, UINT state,UINT options)
{

TRACE("state options :0x%x,0x%x\n",state,options);

return options;
}
UINT _cdecl FuncProc2 (PVOID, UINT *gain)
{

TRACE("FuncProc2\n");
*gain = 0;

return 0;
}
# 课程背景2021年ARM又推出了ARMv9架构,系统软件架构也在悄无声息地发生变化。在这种架构,强调的是隔离技术,包括资源的隔离、运行时隔离,特权操作系统的权限也变得越来越小…不管您是什么领域,ARM服务器、汽车电子、手机或者是其它设备终端,安全都是其一个重要环节。我们常说的安全一般是只网络安全/业务安全/App安全,这些安全依赖的正是操作系统安全,操作系统安全所依赖的就是安全架构技术,在该安全架构,首当要学习的就是Trustzone/TEE技术。只有设备安全/操作系统安全/APP安全/网络安全/服务器安全整个一条链都安全了,那么你的业务才算得上的安全.不管您是做什么的,您做不做安全或虚拟化,掌握整个系统软件架构也是一件必要的事情。您只有掌握了安全架构,你才具有全局的视野,才能进行全局的软件设计,才称得上架构师。安全不仅仅是架构安全,安全还是一种生态,安全还产生一类标准。安全出现在产品声明周期的任何一个角落,它可能零碎地出现在硬件、零碎地出现在软件代码。如果你不了解安全,你可能无法进行优秀的产品设计,你甚至无法去正确的阅读代码。# 课程介绍(1) 讲解ARM最新硬件架构(ARM Core、ARM Architecture)、SOC架构(2) 讲解最新的Trustzone安全架构、TEE架构、Secureboot等(3) 讲解软件组件:TF-A(ATF)、optee_os、Linux Kernel、CA/TA应用程序等,及其交互模型、设计模型(4) 多系统交互代码导读、安全论证实践、CA/TA示例实践、安全业务设计实践(5) 我们学习的是全部硬件、全部系统,软硬结合,或者是大系统的软硬件融合# 课程收益1、安全不再神秘,能cover住全局2、熟悉ARM Architecture架构知识3、熟悉SOC架构知识4、熟悉主流的系统软件框架5、知道多系统之间是如何交互的,也能够进行系统级的设计6、深入了解当前的系统安全架构以及未来安全架构趋势7、熟悉基础的安全业务设计方法8、熟悉系统的启动流程、Secureboot等9、知道Linux Kernel在大系统的位置,以及与其它系统交互的方法10、熟悉各类标准和规范11、学习资料的获取方法 # 课程大纲《Trustzone/TEE/系统安全开发速成班》 --当前48节课/19小时说明: 本视频会持续更新,购买时请以课程目录为主。本EXCEL一个月更新一次。章节编号课程时常第一章基础和简介1课程介绍 8:332ARM和SOC的架构简介60:13第二章软硬件基础3armv8/armv9基础概念26:204ARMv8/ARMv9的Trustzone技术77:565ARMv7的Trustzone技术8:376安全架构及其未来趋势(FF-A/SPM/CCA)6:417ARMv9 CCA机密计算框架底层核心原理简介20:448ARMv9 RME安全扩展详解61:299ATF Quick Start0161:2710Optee Quick Start49:3411系统软件Quick Start21:0412Secureboot原理深度讲解60:2813Android AVB的介绍26:0914TZC400详解17:5615TZC400代码导读之ATF13:4416RPMB详解30:0617RPMB代码导读之optee14:0318efuse详解12:1919Anti-Rollback的介绍11:33第三章软件架构20TEE的组件介绍67:5921TEE的RPC反向调用31:1422TEE的调度模型21:3223各类标准和规范22:17第四章软件架构(高级)24多系统之间的管理模型(ABI/标准)10:3025多系统之间的调度12:2126多系统之间的断(不含虚拟化)61:4727多系统之间的断(虚拟化)6:5728再谈多系统之间的调度(多核多线程)10:3129其它(内存管理/PSCI...)10:12第五章安全应用开发基础30安全应用开发基础5:3731TEE环境:qemu_V8环境的使用4:2032TEE环境:编写一个CA和TA程序11:0433TEE环境:编写漂亮的文档4:1434TEE环境:搭建阅读代码神器opengrok3:2635TEE环境(必看):使用集成好的qemu_v8镜像程序20:2936[CA/TA开发]CA到TA的通信9:1837[CA/TA开发]CA到TA的传参27:1638[CA/TA开发]TEE的存储系统20:5739[CA/TA开发]TEE的密码学系统简介12:3740[CA/TA开发]TEE的密码学系统简介-数字摘要Hash等33:2141[CA/TA开发]TEE的密码学系统简介-对称密码学算法AES等12:2042[CA/TA开发]TEE的密码学系统简介-消息摘要算法HMAC等15:4843[CA/TA开发]TEE的密码学系统简介-非对称密码学算法RSA等7:33第六章安全业务设计高级44Gatekeeper的介绍29:3245keymaster/keymint/keystore/keystore213:2746生物认证(指纹/人脸)13:5747DRM的介绍21:3748TUI的介绍17:03总计时统计(分钟)1128:12 说明:本课程会持续更新…

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧