首页
社区
课程
招聘
为什么我HOOK了CreatefileW函数以后,任何事情不做直接返回还是出错?
发表于: 2011-3-3 16:07 6419

为什么我HOOK了CreatefileW函数以后,任何事情不做直接返回还是出错?

2011-3-3 16:07
6419
我用改写入口地址地方法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”
我的机器上根本没有这个文件,但如果不注入的话,目标进程可以顺利运行~~!
请问这是怎么回事啊?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 6
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
去看你的createfile声明是否为WINAPI
2011-3-3 16:26
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太神了!太准了!太感谢了!!
2011-3-3 16:28
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
或者stdcall。。。
2011-3-3 16:36
0
雪    币: 327
活跃值: (1230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
HOOK CreateFileA
2011-3-4 00:35
0
游客
登录 | 注册 方可回帖
返回
//