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%的结帖率保证第一时间结帖,呵呵
不知道这个就是为什么了。。
dll引用计数的问题,我已经知道的,我的目的是确保这个wpespy.dll它的释放,不知道有可能不?
不知道为什么会这样子,有的可以成功,有的就不行了呢?
有灭有通杀的可能性呢?有的话,如何搞定……麻烦大家给点理论上的东西,呵呵