能力值:
( LV2,RANK:10 )
|
-
-
2 楼
VS2008编译时出现的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
双击这个提示,会自动跳到出错位置,能解决就解决,不能解决再把那个位置的代码发上来
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
( LV7,RANK:100 )
|
-
-
5 楼
/nologo /MD /W3 /Gm /GX /ZI /Od /D "_AFXEXT" /D "_WINDLL" /Fp"Debug/HookJmp.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /D/md/ /GZ "_DEBUG" /c
最后多了一个 "_DEBUG"
改成
/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /Fp"Debug/HookJmp.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
就好了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
你传的是VC6的工程,我这里用VC6直接可以编译
升级成08的工程,Debug版本出现你说的错误,解决办法,Debug版本的属性,C/C++分支下,最后有个命令行的选项,右边的附加选项/D/md/ "_DEBUG",整个删掉,同时还要把版本改成MFC共享DLL.
Release版本也是直接编译通过,就不说了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢!!果然是高手,按照你的方法,都成功了!!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谢谢你的关注!
不过我没看懂,不知道从哪里改。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
你好,我还想请教一个问题,用这种方法能够HOOK到Wsock32.dll中的API函数吗,比如gethostbyname??
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这种是最常见的path函数头5字节方式,简单实用.但偶尔会出意外.所以不保证100%稳定.
至于能不能hook gethostbyname,你测试下不就知道了.我觉得应该可以的.
然后说下我有好感的两个hook库,一个是微软的detours,一个是老外的Mhook,后者完全开源,考虑的很周全,推荐学习研究.
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
话说有回头看了下这代码,真的弱爆了.....
赶紧换方式吧,哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这个代码是Windows核心编程的随书源码,也比较早了,而且本人属于菜鸟级人物,只能从这里学起了。。
我试过了,没有HOOK成功。但我就是不确定是真的不行,还是我改的代码不行,所以来请教高手
在原来的基础上,把与MessageBoxA有关的都换成gethostbyname,改动的代码主要如下: struct hostent* FAR My_gethostbyname( const char* name ) {
struct hostent* tmp = NULL;
myJmp.SetHookOff();
// 下面这段是想记录一下调用的时间
char str[32];
CStdioFile file;
__time32_t nNow = 0;
tm stNow = {0};
_time32(&nNow);
_localtime32_s(&stNow,&nNow);
char buff[255] = {0};
_snprintf(buff,sizeof(buff)-1,"%d.%d.%d.%d.%d.%d",
stNow.tm_year + 1900,
stNow.tm_mon + 1,
stNow.tm_mday,
stNow.tm_hour,
stNow.tm_min,
stNow.tm_sec);
ofstream outfile("e:\\gethostbyname.txt",ios::app); //写入文件
for(int i=0;i<255;i++)
outfile<<buff[i];
//上面这段是想记录一下调用的时间
tmp = gethostbyname(name) ;
myJmp.SetHookOn();
return tmp;
}
还有就是 void WINAPI ExampleJmp()
{
myJmp.HookOneAPI("Wsock32.dll","gethostbyname",(FARPROC)My_gethostbyname);
myJmp.SetHookOn();
}
把对应的这两个函数替换了之后,编译时出现了下述错误:
1>c:\documents and settings\administrator\桌面\vs\hookjmp_dll\hookjmp.cpp(24) : warning C4007: “DllMain”: 必须是“__stdcall”
1>c:\documents and settings\administrator\桌面\vs\hookjmp_dll\hookjmp.cpp(24) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
不是很明白,但在DllMain函数前面加了int之后,编译居然通过了。。
但我感觉测试的时候,并没有调用我自己写的gethostbyname,也没有记录调用的时间,不知道是什么情况。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
把Wsock32.dll换成Ws2_32.dll试试.
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
换成Ws2_32.dll后,能够记录时间了,这应该是HOOK到了吧,但是出现了一个错误,截图如下:
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
刚才又试了下HOOK浏览器,结果浏览器提示出错,崩溃!!
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
那样说明hook住了.至于什么原因出错,可能是函数类型不对,或者是数组越界(乱说的,反正是xx越界了)等.慢慢调吧,比如先别做记录日志这种多余动作,只简单的myJmp.SetHookOff();tmp = gethostbyname(name) ;myJmp.SetHookOn();
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
把struct hostent* FAR My_gethostbyname( const char* name )改成
struct hostent* WINAPI My_gethostbyname( const char* name )看看
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
我刚才也搜了一下,有说在函数前加WINAPI的,看到你的建议,我试了下,成功了,没有出现崩溃的情况。果然是高手啊!赞一个!!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
说下原因吧,因为2008编译时,如果不说明,它就用默认调用约定__cdecl,而你hook的函数是stdcall,所以得强制声明成stdcall,也就是WINAPI
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
非常感谢!!!以后有问题可能还要麻烦你,还请多指教啊!
|
|
|