function EnableDebugPriv : Boolean;
var
  hToken : THANDLE;
  tp : TTokenPrivileges;
  rl : Cardinal;
begin
  result := false;
  //打开进程令牌环
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
  //获得进程本地唯一ID
  if LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges[0].Luid) then
  begin
    tp.PrivilegeCount := 1;
    tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    //调整权限
    result := AdjustTokenPrivileges(hToken, False, tp, sizeof(tp), nil, rl);
  end;
end;function   FreeRemoteLibrary(PID:Thandle;hRemoteLibrary:HMODULE):boolean;
var
  dwRemoteThreadId:DWORD   ;
  hRemoteThread:Thandle;
  nRet:Cardinal;
  hNewHandle:Thandle;
  pfnStartAddr:   TFNThreadStartRoutine;
begin
  if EnableDebugPriv then
    begin
      hNewHandle := OpenProcess(PROCESS_ALL_ACCESS,   False,   PID);
      pfnStartAddr := GetProcAddress(GetModuleHandle('kernel32.dll'), 'FreeLibrary');
      hRemoteThread:=CreateRemoteThread(hNewHandle,nil,0,pfnStartAddr,Pointer(hRemoteLibrary),0,hRemoteThread);
      WaitForSingleObject(hRemoteThread,INFINITE);
      GetExitCodeThread(hRemoteThread,nRet);
      result:=boolean(nRet); 
    end
  else
     result := false;
end;网上找的代码,我测试了下,我打开了wpepro,这个程序加载了一个wpespy.dll
这个函数执行以后,wpespy.dll依然处于被加载状态,请问怎么才能实现这种远程线程结束别人程序加载的dll模块
....
module32first(ModuleList,pm)   //遍历模块
....
FreeRemoteLibrary( processid, pm.th32ModuleID)   //调用上面的函数创建远程线程去释放这个dll模块
麻烦大家指出问题所在.....谢谢,100%的结帖率保证第一时间结帖,呵呵
 

解决方案 »

  1.   

    LoadLibrary/LoadLibraryEx有可能被调用多次,所以FreeLibrary也可能一次无法最终完成。
      

  2.   

    我做了个死循环,循环了10分钟左右,一直释放,貌似还是无效。
    不知道这个就是为什么了。。
    dll引用计数的问题,我已经知道的,我的目的是确保这个wpespy.dll它的释放,不知道有可能不?
      

  3.   

    经过测试,部分dll灭有问题,完全正常的给释放了,但是wpepro调用的这个dll还真不成,死活不行
    不知道为什么会这样子,有的可以成功,有的就不行了呢?
    有灭有通杀的可能性呢?有的话,如何搞定……麻烦大家给点理论上的东西,呵呵
      

  4.   

    考虑一下注入的方式. 如果是全局hook的注入 这样应该释放不掉吧..如果想要彻底的释放 不如检测一下hook 然后恢复之.. 这样更安全..