首页
社区
课程
招聘
[原创]发一个自己平时用的简单inlinehook的类
发表于: 2011-5-4 07:59 5944

[原创]发一个自己平时用的简单inlinehook的类

2011-5-4 07:59
5944

到看雪很久了,基本上每天都会泡一会儿论坛,可是却没做过什么贡献,也没什么露得出手的本事,今天想想把自己平时用的一个inlinehook的类扣出来给大家用用。
虽然代码写的很差劲很挫都是小改动,不过还好使。
因为我平时需要用的都只是截取一下,也不用修改程序的流程,就对修改程序流程的支持不大好。不过etc.cpp里有复制orgOpcode出来的代码,应该自己很好改成需要的样子的。
支持多线程,支持重入(只是简单的在重入的时候从hook stub中就跳过hookrouter函数了)。

要Hook了就:
inlinehook * Global_Inlinehookptr= new inlinehook (addr, hookTargatLen, jmpOrCall, HookRouter);
不Hook了delete Global_Inlinehookptr就好了。

主要的定义:
#define INLINE_5BYTESLAGGERCALL 0x1001
#define INLINE_5BYTESLAGGERJMP 0x1002
#define INLINE_UNPROTECTEVINMENT 0x1003
#define X86STRACKBUFFERCHANGE 0x7798FFAA
/*
HOOK ROUTER中修改了返回地址时候必须返回这个!修改了寄存器的值时候不用返回这个,修改堆栈的值也不用。但你自己设置了返回地址,就要自己备份那些被HOOK掉的指令了。可以从InlineSingleHook::RedirectedOpcodeInStub获得stub中返回位置的代码。
*/
        typedef int  (__stdcall * InlineX86HookRouter) (PInlineX86StackBuffer X86StrackBuffer);
/*
在函数体里,堆栈和寄存器和HOOK地方的一模一样。只要不修改低处堆栈(比当返回地址还低)的值,就不会破坏堆栈和寄存器环境,也不会修改那些值。
*/

对了,这个是VS2005环境的工程,但我最早写的时候是在VC6下面写的,所以把代码复制到VC6里应该也可以用。

更新了一下etc里的X86ShallToRedirect,之前的etc里有bug,没有处理copy的原始代码中的跳转目标在被copy的范围内的情况,会导致跳转到NOP代码处。因为发出来了,就想测试下效果,HOOK了函数开头100长度的代码时候出错了,检查后才发现这种情况。
又更新了下,碰到je/jne这种far跳转指令时,之前的会有bugs。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,,谢谢楼主分享,下来学习学习。。。
2011-5-4 09:24
0
雪    币: 242
活跃值: (473)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
3
更新了一下,改掉一个可能引起非法的bug :P。
喜欢的朋友重新在顶楼下载个 [ 附件 56917]
2011-5-8 04:25
0
游客
登录 | 注册 方可回帖
返回
//