HOOK createfileA 和createfileW的一个问题

naixian1983 2008-04-28 02:53:26
本人以前用Detours做了一个HOOK createfile这个API的程序,我把他直接return 0使整个电脑不能createfile


DETOUR_TRAMPOLINE(HANDLE WINAPI MyCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile), CreateFileW);


HANDLE WINAPI NewCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)

{


return 0;

HANDLE Result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return Result;

}



但我现在想把它改进,当插入u盘时,只有u盘不可以createfile,其他盘如C:D:不受影响,不知道我为什么我这样做法不成功??



DETOUR_TRAMPOLINE(HANDLE WINAPI MyCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile), CreateFileW);


HANDLE WINAPI NewCreateFileW(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)



if(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{


return 0;
}

HANDLE Result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return Result;
...全文
764 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-04-29
  • 打赏
  • 举报
回复
应该是MyCreateFile函数有问题,你可以试一下,什么都不做直接返回MyCreateFile应该也不行。
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
我换了另外一种方法做


HANDLE WINAPI NewCreateFileA(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)

{

UINT uDriveType=::GetDriveType(lpFileName);

switch (uDriveType)
{
case DRIVE_REMOVABLE:
{

OutputDebugString("DRIVE_REMOVABLE");
return 0;
break;

}
case DRIVE_FIXED:
{

OutputDebugString("DRIVE_FIXED");

break;

}

case DRIVE_UNKNOWN:
{

OutputDebugString("DRIVE_UNKNOWN");
return 0;
break;
}
case DRIVE_CDROM:
{

OutputDebugString("DRIVE_CDROM");
return 0;
break;
}

}






HANDLE result=MyCreateFileA(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return result;
}


结果这个方法无论是DRIVE_FIXED还是DRIVE_REMOVABLE,hook createfile这个API失效了,
为什么为什么?????
sam88888 2008-04-29
  • 打赏
  • 举报
回复
up
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
to zoulie,cnzdgs

我不是很明白你们的意思,可以在我的代码上改来看看吗,如果可以,另加分相谢

zoulie 2008-04-29
  • 打赏
  • 举报
回复
调用你的MyCreateFileW后,一定要调用原来的系统API CreateFileW 来维持堆栈平衡,不然就会调用失败
cnzdgs 2008-04-29
  • 打赏
  • 举报
回复
如果想要让CreateFile成功,必须要调原本API的CreateFile函数,现在是你的MyCreateFile没有处理好。另外,前面已经说了GetDriveType的参数必须给根目录的路径,你先把这两个部分处理好,然后再考虑其它问题,以免相互干扰不好判断。
naixian1983 2008-04-29
  • 打赏
  • 举报
回复
to cnzdgs

如果我直接返回MyCreateFile果然还是不行的,如果我去掉

HANDLE result=MyCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
return result;

只是加上
UINT uDriveType=::GetDriveType(lpFileName);

switch (uDriveType)
{
case DRIVE_REMOVABLE:
{

OutputDebugString("DRIVE_REMOVABLE");
return 0;
break;

}
case DRIVE_FIXED:
{

OutputDebugString("DRIVE_FIXED");

break;

}

case DRIVE_UNKNOWN:
{

OutputDebugString("DRIVE_UNKNOWN");
return 0;
break;
}
case DRIVE_CDROM:
{

OutputDebugString("DRIVE_CDROM");
return 0;
break;
}

}


当我插上u盘时,无论是DRIVE_FIXED还是DRIVE_REMOVABLE全部不可以createfile,而且我发现一个奇怪的问题,不如当我点DRIVE_CDROM是,出来的messagebox是DRIVE_FIXED,很奇怪
naixian1983 2008-04-28
  • 打赏
  • 举报
回复
现在我的问题是,如果用
if(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{
return 0;
}
C 和D drive还是不能createfile,我要的是插入u盘,C 和D drive不受影响,该什么做?
cnzdgs 2008-04-28
  • 打赏
  • 举报
回复
GetDriveType的参数必须是根目录才行。另外要注意,CreateFile的参数可能是相对路径。
vcPlayer 2008-04-28
  • 打赏
  • 举报
回复
if(GetDriveType(lpFileName)==DRIVE_REMOVABLE)
{
return 0;
}

这一句对软盘和较小的U盘是没问题,但对大U盘,返回的也是DRIVE_FIXED。
naixian1983 2008-04-28
  • 打赏
  • 举报
回复
高手帮帮忙
目前最好的EasyHook的完整Demo程序,包括了Hook.dll动态库和Inject.exe注入程序。 Hook.dll动态库封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,操作起来非常的简便。 这个Demo的代码风格也非常的好,用VS2010成功稳定编译通过,非常值得下载使用。 部分代码片段摘录如下: //【Inject.exe注入程序的代码片段】 void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { ////////////////////////////////////////////////////////////////////////// //【得到进程ID值】 UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T("%s GetProcessID 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【得到DLL完整路径】 CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T("%s GetDllFilePath 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【注入DLL】 NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T("%s ShowStatusInfo 失败"), __FUNCTION__); return; } } //【Hook.dll动态库的代码片段】 extern "C" __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T("%s DylibMain 失败"), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T("kernel32"), "CreateFileW", (void*)CreateFileW_new}, {_T("kernel32"), "CreateFileA", (void*)CreateFileA_new}, {_T("kernel32"), "ReadFile", (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { /////////////////////////////////////////////////////////////// int nPos = 0; do { /////////////////////////////// FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (NULL == stFunctionOldNew->strModuleName) { break; } /////////////////////////////// if (!HookFunctionBySymbol(stFunctionOldNew->strModuleName, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T("%s HookFunctionBySymbol 失败"), __FUNCTION__); return FALSE; } } while(++nPos); /////////////////////////////////////////////////////////////// return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T("CreateFileW_new. lpFileName = %s"), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); }

16,471

社区成员

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

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

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