我用改写入口地址地方法HOOK了CREATEFILEW函数,也正常进入了我的mycreatefile函数。
但是当我调用系统原始的createfile时总是出错。
方法如下:
dll入口函数:
g_hInstance = hModule;
//创建事务
g_hSendEvent = CreateEvent( NULL, FALSE, TRUE, NULL );
//重写API开头的8字节
HMODULE hCreateFile = LoadLibrary( L"kernel32.dll" );
if (NULL == hCreateFile)
{
MessageBoxA(NULL,"无法加载kernel32.dll",NULL,MB_OK);
return FALSE;
}
g_oldsend = ( DWORD )GetProcAddress( hCreateFile, "CreateFileW" );
if(NULL == g_oldsend)
{
MessageBoxA(NULL,"无法定位CreateFileA函数入口地址",NULL,MB_OK);
return FALSE;
}
//保存原始字节
if (0 == ReadProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_oldsend,
( void * )g_dwOldBytes[0], sizeof( DWORD )*2, NULL ))
{
MessageBoxA(NULL,"无法读取地址",NULL,MB_OK);
return FALSE;
}
//将00400000改写为我们函数的地址
*( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )mycreateFileW;
WriteProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_oldsend,
( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
//MessageBoxA(NULL,"成功加载DLL","正确",MB_OK|MB_ICONINFORMATION);
MessageBoxA(NULL,"成功加载",NULL,MB_OK);
之后我再mycreateFileW如下操作:
HANDLE nRet;
WaitForSingleObject( g_hSendEvent, INFINITE );
//恢复API头8个字节
if (!WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_oldsend,
( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL ))
{
MessageBoxA(NULL,NULL,NULL,MB_OK);
}
nRet = CreateFileW(lpfilename,dwDs,dwsharemode,lpsa,dwcreate,dwflags,htemplatefile);
if(!WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_oldsend,
( void* )g_btNewBytes, sizeof( DWORD )*2, NULL ))
{
MessageBoxA(NULL,NULL,NULL,MB_OK);
}
SetEvent( g_hSendEvent );
return nRet;
现在当我注入到别的进程后,能够正确进入到我的mycreateFileW函数。
但是即使我什么都不做,直接返回,也会出错~~
请问这是怎么回事啊?
另外我发现目标程序第一个用createfile访问的文件居然是“c:\windows\fonts\staticcache.dat”
我的机器上根本没有这个文件,但如果不注入的话,目标进程可以顺利运行~~!
请问这是怎么回事啊?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课