首页
社区
课程
招聘
[旧帖] 请助:关于inline hook,如何编写通用的重建函数 0.00雪花
发表于: 2016-8-24 18:36 3562

[旧帖] 请助:关于inline hook,如何编写通用的重建函数 0.00雪花

2016-8-24 18:36
3562
我HOOK了一些API(诸如SetWindowText、SetWindowLong等等带有窗口句柄参数的一系列)函数,想编写一个通用的重建函数。重建函数实现以下功能:

1、调回原来的API函数,并保留此函数的返回值;
2、调用我自己编写的一个函数,此函数只有一个参数,为窗口句柄;
3、返回API函数的返回值;

例子:

VOID PrintHwnd( HWND h )
{
printf( "0x%x\n", h );
}

__declspec( naked ) VOID RebuildFunction()
{
1、调用原来的API函数,并保留返回值;
2、调用PrintHwnd,并向其传递窗口句柄。
3、返回API函数(第一步中保留)的返回值。
}


LPVOID CreateRebuildFunction( OldFunction )
{
// 创建一个重建函数
LPVOID lp = VirtualAlloc( RebuildFunction->size, PAGE_EXECUTE_READWRITE );
memcpy( lp, RebuildFunction, RebuildFunction->size );
memcpy( lp, __asm{ mov eax, OldFunction; call eax} );
return lp;
}

int main( int argc, char **argv )
{

SetHook( SetWindowLong, CreateRebuildFunction( SetWindowLong ));
SetHook( SetWindowTextA, CreateRebuildFunction( SetWindowTextA ));
SetHook( ..., CreateRebuildFunction( ... ) );

Sleep( INFINITE );
}

我的问题是如何编写RebuildFunction,可以请各位大神支招,感激不尽呐。

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Detours Hook

http://blog.csdn.net/allenq/article/details/8363363
2016-8-24 19:00
0
雪    币: 2
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我不是问怎么HOOK啦;是问怎么写一个通用的重建函数。不过还是多谢了。
2016-8-24 19:16
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我说一种情况 代码 不一定对哈 没测试环境

假如你要HOOK那几个api的前5个字节 是这样的

  8BFF          mov     edi, edi
  55            push    ebp
  8BEC          mov     ebp, esp

那么你把他HOOK后变成 Jmp xxxx

__declspec( naked ) VOID RebuildFunction()
{
        __asm
        {
                pushad
                       
                        //假设 hwnd都在 堆栈[epb+8]中
                        mov eax,dword ptr [epb+8]
                        push eax
                        call PrintHwnd
                        sub esp 4;
               
                //这里 还原原来函数的5个字节
                        mov     edi, edi
                        push    ebp
                        mov     ebp, esp
                       
                       
                       
                        popad
                       
                        ret
                       
        }
}
2016-8-24 20:48
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
为何要从头造轮子。。。
2016-8-24 20:50
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
返回没处理。。
2016-8-24 21:04
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
通用应该不可能吧  
inline hook 可以具体到某条指令执行的时候才hook
不一定就是函数头那几个字节
2016-8-24 21:09
0
雪    币: 23
活跃值: (1366)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
LZ的意思 应该是 想要一个通用的 API HOOK 回调接口,省去反复写my api的麻烦
2016-8-24 23:34
0
雪    币: 2
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好的。非常感谢。我马上试试;我自己也这样写了。但是发现add esp,4再sub esp,4也会有问题。可能是没有popad的原因。
2016-8-25 19:24
0
雪    币: 2
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
是的。可以帮我写一小段代码吗?我初学汇编,还有很多地方不懂所以写不出完整的。但近期又需要用。
2016-8-25 19:25
0
雪    币: 2
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
但是如果要HOOK 的函数很多,计算函数长度好像很难呀。
2016-8-25 19:26
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
MinHook - The Minimalistic x86/x64 API Hooking Library
2016-8-25 20:44
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
如果不从原函数取参数和改动返回值得话      可以写通用的    否则不能
2016-9-12 11:34
0
雪    币: 2
活跃值: (440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
只从原函数固定位置取参数,但不攺动返回值;可以帮我写一段汇编吗?感激不尽呀。
2016-9-30 11:59
0
游客
登录 | 注册 方可回帖
返回
//