VB拦截Windows Explorer删除进程,内含API HOOK,源代码:倒霉蛋儿,程序有时候也会窗口勾挂失败! 
  勾住了SHFileOperation等函数,DLL用Delphi写的C会的太少,查了半天才知道原来explorer是用SHFileOperation删除文件,经过测试很稳定,没有出现崩溃的情况,由于只勾住了SHFileOperation函数,所以别的程序要是调用DeleteFile删除文件,拦截不到,要是想拦截DeleteFile自己接着写吧。 
   
  mod_Inject.bas类的注释摘录: 
  Dim MyAddr As Long ‘执行远程线程代码的起始地址。这里等于LoadLibraryA的地址 
  ‘dll文件路径 
  MyDllFileLength = LenB(StrConv(MyDllFileName, vbFromUnicode)) + 1 
   ‘这里把dll文件名从Unicode转换成Ansi,否则英文字母是2个字节。 _ 
  顺便说一下,学过C的应该知道字符串要以/0标志结尾,所以dll文件名长度要加上1个字节存放Chr(0) 
  ‘得到进程的句柄 
  在目标进程中申请分配一块空白内存区域。内存的起始地址保存在MyDllFileBuffer中。 _ 
  这块内存区域我们用来存放dll文件路径,并作为参数传递给LoadLibraryA。 
  在分配出来的内存区域中写入dll路径径。注意第二个参数传递的是MyDllFileBuffer的内容, _ 
  而不是MyDllFileBuffer的内存地址? 
  If MyReturn = 0 Then Inject = False 
  MyAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA") 
  ‘得到LoadLibraryA函数的起始地址。他的参数就是我们刚才写入的dll路径。但是LoadLibraryA本身是不知道参数在哪里的。 _ 
  接下来我们就用CreateRemoteThread函数告诉他参数放在哪里了? If MyAddr = 0 Then Inject = False 
  MyResult = CreateRemoteThread(ProcessHandle, 0, 0, MyAddr, MyDllFileBuffer, 0, 0) 
  好了,现在用CreateRemoteThread在目标进程创建一个线程,线程起始地址指向LoadLibraryA, _ 
  参数就是MyDllFileBuffer中保存的dll路径? 
   If MyResult = 0 Then 
   Inject = False 
   Else 
   Inject = True 
   End If 
   ‘接下来你可以使用WaitForSingleObject等待线程执行完毕。 _ 
   并用GetExitCodeThread得到线程的退出代码,用来判断时候正确执行了dll中的代码。 
   CloseHandle MyResult 
   CloseHandle ProcessHandle 
   ‘扫地工作 
  End Function
                                    
                                    
                                        
                                            1