我想做一个记录文件操作的程序,想用钩子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]
多谢!
  
 

解决方案 »

  1.   

    我菜,错了不要鄙视我哈
    ,全局钩子确实只挂gui线程
    我从kernel32.dll得到deletew地址没问题:序号000000d9,地址bffa9afd,不行了直接用这个地址试试
      

  2.   

    还有,就是你用改api入口地址的方法不对,改写函数开头代码需要一些时间,如果这时另一个线程调用这个函数的话.....,除非你知道那时只有1个线程调用此api。。
    最好通过操作模块的输入节来挂接api
      

  3.   

    用修改api的入口地址的方法不对,我不知道别的方法怎么作。你说的 最好通过操作模块的输入节来挂接api 什么意思,怎么实现?
    我的目的是希望记录系统中打开文件的信息,本来是拦截openfile或者Createfile的,一样的不能拦截到,所以用Deletefile试试看,也不能,
    我现在应该怎么实现记录系统中打开文件的信息的功能?多谢了。
      

  4.   

    就向楼上所说的,你就算该了api入口地址那也是自己进程的地址。
    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