我想做一个记录文件操作的程序,想用钩子dll来拦截系统的DeleteFile这个API来实现,但是总不行,我用同样的代码,可以截获TerminateProcess这个api,效果就是200下不能杀进程了,但是文件操作始终不能截获。高手指点一下,代码如下:
hLib = LoadLibrary("Kernel32.dll");
pTerminateProcess = (DWORD)GetProcAddress( hLib, "TerminateProcess" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pTerminateProcess,void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyTerminateProcess;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pTerminateProcess, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );hLib = LoadLibrary("Kernel32.dll");
pDeleteFileA = (DWORD)GetProcAddress( hLib, "DeleteFileA" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileA, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyDeleteFileA;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileA, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );hLib = LoadLibrary("Kernel32.dll");
pDeleteFileW = (DWORD)GetProcAddress( hLib, "DeleteFileW" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileW, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyDeleteFileW;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileW, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );回复人: boywang(大力水手) ( ) 信誉:100 2003-8-5 12:27:18 得分:100
你是hook别的程序的api吧。
你的方法我试过的,2000中的地址是分离的,也就是说你该的是当前程序的函数,对于其他的程序调用api没有影响的。
把你的hook api函数写到dll中,然后把dll注入其他的进程,在dll_process_attach和dll_thread_attach中写你的hook api代码。
Top
回复人: bluethinker(红叶舞秋山) ( ) 信誉:99 2003-8-5 15:22:11 得分:0
我是再dll中做的。全局钩子函数就是将dll的地址注入系统中的所有的进程呀,所以这个我觉得系统调用对应的api时,自动转到自己修改过的api里面。
我第一个截获的是terminateprocess这个api,运行的很好,我再任务管理器里面杀进程都没效果,但是后面的api deletefiel就不行了,一样的方法呀。
我也是再dllmain的dll_process_attach里面加上上面的代码的。
有空qq上交流一下把,多谢。我得qq 55020921。
Top
回复人: boywang(大力水手) ( ) 信誉:100 2003-8-5 19:53:26 得分:0
全局钩子函数就是将dll的地址注入系统中的所有的进程。
错了
好象只是gdi的应用程序才会load你的dll。
另外文件操作中删除deletefilea是调用deletefilew的,就hook deletefilew试试。
Top
回复人: bluethinker(红叶舞秋山) ( ) 信誉:99 2003-08-05 20:43:00 得分:0
全局钩子不是的么?我看到的文档是这样的呀?
“只是gdi的应用程序才会load你的dll”,什么意思?从Kernel32.dll中得到的deletew的地址不对么?搞了几天了都搞不出来,急呀。
我的目的是记录系统中打开文件的信息,就是把每一个打开的文件都记录下来,应该是拦截CreateFileW(A)或OpenFile api,这个应该怎么实现呀,如果大侠有代码能贴点的话就
太感谢了,可以给我发mail,我得email是[email protected]
多谢!
hLib = LoadLibrary("Kernel32.dll");
pTerminateProcess = (DWORD)GetProcAddress( hLib, "TerminateProcess" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pTerminateProcess,void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyTerminateProcess;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pTerminateProcess, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );hLib = LoadLibrary("Kernel32.dll");
pDeleteFileA = (DWORD)GetProcAddress( hLib, "DeleteFileA" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileA, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyDeleteFileA;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileA, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );hLib = LoadLibrary("Kernel32.dll");
pDeleteFileW = (DWORD)GetProcAddress( hLib, "DeleteFileW" );
::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileW, (void *)dwOldBytes[2], sizeof(DWORD)*2, &dwSize );
*(DWORD *)( btNewBytes + 1 ) = (DWORD)MyDeleteFileW;
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pDeleteFileW, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );回复人: boywang(大力水手) ( ) 信誉:100 2003-8-5 12:27:18 得分:100
你是hook别的程序的api吧。
你的方法我试过的,2000中的地址是分离的,也就是说你该的是当前程序的函数,对于其他的程序调用api没有影响的。
把你的hook api函数写到dll中,然后把dll注入其他的进程,在dll_process_attach和dll_thread_attach中写你的hook api代码。
Top
回复人: bluethinker(红叶舞秋山) ( ) 信誉:99 2003-8-5 15:22:11 得分:0
我是再dll中做的。全局钩子函数就是将dll的地址注入系统中的所有的进程呀,所以这个我觉得系统调用对应的api时,自动转到自己修改过的api里面。
我第一个截获的是terminateprocess这个api,运行的很好,我再任务管理器里面杀进程都没效果,但是后面的api deletefiel就不行了,一样的方法呀。
我也是再dllmain的dll_process_attach里面加上上面的代码的。
有空qq上交流一下把,多谢。我得qq 55020921。
Top
回复人: boywang(大力水手) ( ) 信誉:100 2003-8-5 19:53:26 得分:0
全局钩子函数就是将dll的地址注入系统中的所有的进程。
错了
好象只是gdi的应用程序才会load你的dll。
另外文件操作中删除deletefilea是调用deletefilew的,就hook deletefilew试试。
Top
回复人: bluethinker(红叶舞秋山) ( ) 信誉:99 2003-08-05 20:43:00 得分:0
全局钩子不是的么?我看到的文档是这样的呀?
“只是gdi的应用程序才会load你的dll”,什么意思?从Kernel32.dll中得到的deletew的地址不对么?搞了几天了都搞不出来,急呀。
我的目的是记录系统中打开文件的信息,就是把每一个打开的文件都记录下来,应该是拦截CreateFileW(A)或OpenFile api,这个应该怎么实现呀,如果大侠有代码能贴点的话就
太感谢了,可以给我发mail,我得email是[email protected]
多谢!
解决方案 »
- 定制浏览器的问题
- GDI+ 透明窗体 贴图
- 哪位老兄对开源打包工具nsis有研究啊,联系我哦
- 请问word菜单中“插入-〉符号”弹出的界面上的显示字符的面板是怎么实现的?
- 在CFormView的OnSize()中扩大一个ListBox结果就出断言了.
- clistctrl选定状态后为什么LVN_ITEMCHANGED消息中HitTest时返回-1呢
- 在用户界面线程里建立了一个对话框,为什么将对话框关闭了,但线程仍不结束?(临贴涕泠,以待回复)
- 基于MFC框架下FTP客户端软件断点续传实现问题(急急急~)
- 请教:对于系统正在使用的文件,有没有办法给它改名或删除???
- 关于提取文件长度的问题?
- 请问怎么提取字库中的字的数据呢? 100分
- 也许是个奇怪的问题:
,全局钩子确实只挂gui线程
我从kernel32.dll得到deletew地址没问题:序号000000d9,地址bffa9afd,不行了直接用这个地址试试
最好通过操作模块的输入节来挂接api
我的目的是希望记录系统中打开文件的信息,本来是拦截openfile或者Createfile的,一样的不能拦截到,所以用Deletefile试试看,也不能,
我现在应该怎么实现记录系统中打开文件的信息的功能?多谢了。
2就算你改了指定程序的api openfile,当进程其他模块用getprocaddress(getmodulehandle("kernnel32“,”xxxx")时他会得到正确的api地址,还是没用
3。就算你对所有模块都改了api地址,并不能保证进程重新显式载入模块,那么你原来挂的api也就没用了
保证挂上openfile or createfile,要挂
openfilea,w
createfilea,w
loadlibrary a,w
loadlibraryex a,w
getprocaddress