怎样HOOK静态库中的函数?

jamseyang 2011-01-17 01:33:22
我是使用MS的detours挂钩strstr,如果被HOOK的程序运行时库选择多线程 DLL(/MD)可以被HOOK,但是选择了多线程(/MT)就无法被HOOK了,请问怎么解决?
...全文
487 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxfjb 2011-01-25
  • 打赏
  • 举报
回复
你考虑的问题不太全面:
1 strstr函数在很多dll都有导出,比如ntdll.dll和运行时库dll(比如msvcrt.dll);
如果是别人的程序,你无从得知人家是调用的哪个dll中的该导出函数,要想全面hook,就必须全盘考虑到。
(通常调用ntdll.dll中该函数的程序很少,但存在);
2 静态编译和动态编译strstr函数。
3 静态调用strstr函数,和动态加载dll,然后获取该函数地址后调用的问题(此时你又要hook loadlibrary等函数了)。
chzhn 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sevencat 的回复:]

强搜内部地址。
[/Quote]

貌似只能这么做,一般不建议Hook未导出的API。
xiaobaitu8629 2011-01-18
  • 打赏
  • 举报
回复
有待学习啊,帮lz顶起哦
sunlin7 2011-01-18
  • 打赏
  • 举报
回复
在VC里面不少crt函数是使用了或者被直接替换成windows api,所以楼主需要仔细查看多线程模式下strstr函数的最终执行的代码在哪里,才能hook到正确的函数。
(比如CreateWindow看起来是一个函数,实际上却只是一个宏,就没有办法hook到)。
lazy_2010 2011-01-18
  • 打赏
  • 举报
回复
这个,...,够呛,等待高人来解决;如果只是一个 application 可能能想出办法,对于所有 application,很难啊。
sevencat 2011-01-18
  • 打赏
  • 举报
回复
强搜内部地址。
alangsos 2011-01-18
  • 打赏
  • 举报
回复
反汇编看代码,用汇编修改,想怎么样就怎么样!就像做做外挂一样
jamseyang 2011-01-18
  • 打赏
  • 举报
回复
难道没人会吗?
lazy_2010 2011-01-18
  • 打赏
  • 举报
回复
下面是 VC6 的函数,如果是静态链接的,下面的代码就会在你的链接之后的文件中,所以,如果你想 hook ,很难。

char * __cdecl strstr (
const char * str1,
const char * str2
)
{
char *cp = (char *) str1;
char *s1, *s2;

if ( !*str2 )
return((char *)str1);

while (*cp)
{
s1 = cp;
s2 = (char *) str2;

while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;

if (!*s2)
return(cp);

cp++;
}

return(NULL);

}


HookAPI ,API 可以不是 Dll 的导出函数的,比如系统隐藏了没有输出的函数也是可以的,但是这样的缺点是万一某一天系统升级了,这个函数的接口修改了,或者这个函数不存在了,你就悲剧了。
jamseyang 2011-01-18
  • 打赏
  • 举报
回复
谢谢大家的回复,根据大家所说的,
得出结论,不知是否有误:
1、想拦截静态库中的函数必须要反汇编?
2、HOOK API,API必须是DLL中的导出函数吗?
jamseyang 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 breezes2008 的回复:]

hook
strstr _mbsstr wcsstr
[/Quote]
请问兄台看清我说的意思了吗?
breezes2008 2011-01-17
  • 打赏
  • 举报
回复
hook
strstr _mbsstr wcsstr

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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