如何防止自己的服务进程被异常终止 ( 积分: 100 )

  • 主题发起人 主题发起人 hecz76
  • 开始时间 开始时间
H

hecz76

Unregistered / Unconfirmed
GUEST, unregistred user!
本人编了一个系统服务程序,但会被在任务管理器中结束。希望:
1、能否通过什么方法可以防止别人结束我的服务进程。
2、能否像一些杀毒软件一下,不能被结束。
3、或者在结束服务进程前,能够获得信息,以做后续的“善后”工作。
本程序绝对不是病毒!
在线等待中.....
 
在任务管理器中隐藏怎样?
 
防止进程被终止很难啊

劝你放弃这个思路,换个实现方法吧
 
to:hhjjhhjj
能实现吗?怎么实现?
 
jimowutong,
问题是杀毒软件不是可以实现吗?否则很多病毒不把杀毒软件都杀光光了吗?
 
现在的杀毒软件/病毒保护进程的方法有
SSDT HOOK
多进程互相监控
远程线程注入
...
或者多者一起用.

DELPHI写的SSDT HOOK还没见过,不过多进程监控和远程注入倒是可以实现
要注意的是,远程线程注入会被很多杀毒软件认为是病毒,这些杀毒软件都是用了SSDT HOOK技术的.
可以说SSDT Hook可以做任何事,可惜...DELPHI实现不了
 
结束进程需要有进程ID,程序中捕获getprocessid这个消息后给他kill掉不就无法结束了么
 
如果对于非计算机专业的人来讲可用进程注入,建议注入到explorer.exe中去,这样桌面启动,程序也就跟着启动了.但如果人家特意来找你的东西,那就几乎没什么办法了.
 
如ysai所说,可以用多个线程相互监视,远程线程注入.方法不难,易于实现.
善后工作,你可以检测进程或者线程如果退出,重新启动程序.前提是不影响程序功能.
 
不对的!!做成系统服务在进程管理器是杀不了的!!!!你可能没有弄好!
而且做成服务,好像有的进程在进程管理器里面是看不到吧!!!后台有很多的服务你在那里面都看不到!1!
 
我不会进程注入,谁能给个例子,分不够可以再加,或者直接发到我的邮箱中,非常感谢。
xj_hecz76@126.com
 
进程注入不难,但是只能注入到用户进程,以system运行的进程注入进去是不会执行的,注入到用户进程不安全,随时可以中止
 
"如果对于非计算机专业的人来讲可用进程注入,建议注入到explorer.exe中去"如何实现?能不能附上例子啊?
 
下面的程序实现:把DLL注入到Explorer 供参考.

uses
SysUtils,TLHelp32, Windows;


procedure GetProcessID(FileName:String;var PID:DWORD);
var
ProcessHandle:THandle;
lppe:TProcessEntry32;
Find:Boolean;
begin
PID:=0;
ProcessHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
lppe.dwSize:=Sizeof(lppe);
Find:=Process32First(ProcessHandle,lppe);
While Find do
begin
if AnsiStrComp(Pchar(FileName),Pchar(ExtractFileName(Lppe.szExeFile)))=0 then
begin
PID:=lppe.th32ProcessID;
Break;
end;
Process32Next(ProcessHandle,lppe);
end;
CloseHandle(ProcessHandle);
end;

function EnabledDebugPrivilege(Const Enable:Boolean):Boolean;
var
hToken:THandle;
tp:Token_Privileges;
a:DWORD;
begin
Result:=false;
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then
begin
LookUpPrivilegeValue(nil,'SeDebugPrivilege',tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
a:=0;
AdjustTokenPrivileges(hToken,false,tp,Sizeof(tp),nil,a);
Result:=GetLastError=ERROR_SUCCESS;
CloseHandle(hToken);
end;
end;

function AttachToProcess(Const HostFile,Guest:String;Const PID:DWORD=0):DWORD;
var
hRemoteProcess:THandle;
dwRemoteProcess:DWORD;
cb:DWORD;
PLFileRemote:Pointer;
RCode:Boolean;
TempVar:DWORD;
PStartAddr:TFNThreadStartRoutine;
PFilename:PWideChar;
begin
Result:=0;
EnabledDebugPrivilege(true);
GetMem(PFileName,Length(Guest)*2+1);
StringToWideChar(Guest,PFileName,Length(Guest)*2+1);
if PID>0 then
dwRemoteProcess:=PID
else
GetProcessID(HostFile,dwRemoteProcess);
hRemoteProcess:=OpenProcess(PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS_VM_WRITE,
false,dwRemoteProcess);
cb:=(1+lStrLenW(PFileName))*Sizeof(WCHAR);
PLFileRemote:=PWideString(VirtualAllocEX(hRemoteProcess,nil,cb,MEM_COMMIT,PAGE_READWRITE));
TempVar:=0;
RCode:=WriteProcessMemory(hRemoteProcess,PLFileRemote,PFileName,cb,TempVar);
if RCode then
begin
PStartAddr:=GetProcAddress(GetModuleHandle('kernel32'),'LoadLibraryW');
TempVar:=0;
Result:=CreateRemoteThread(hRemoteProcess,nil,0,PStartAddr,PLFileRemote,0,TempVar);
end;
FreeMem(PFileName);
end;

begin
AttachToProcess('explorer.exe',ExtractFilePath(paramstr(0))+'RunWWW.dll');
end.
 
呵呵,我明白如何注入到explorer了。
那你给的这段代码是需要每次计算机启动后都要注入一遍是吗?
另外就是,我编制一个runwww.dll动态链接库,用上面的方法,就可以注入到explorer中,然后在内存中运行,同时不在进程中显示是吗?
对于上面的那个runwww.dll动态链接库有什么要求吗?我是第一次编制这样的程序,见笑了!呵呵
如果能有一个完全的实例框架那就太好了!
 
上面程序运行后会把DLL注入到explorer里面去.对于里面的Runwww.Dll没有什么要求.你可以用上面的Runwww.dll实现一些功能.比如:GetExitCodeProcess,检测到XX进程结束,重启这个进程.等等.
如果需要,这是我的邮箱:gotiger2008@qq.com 我给你完整的程序.
 
太感谢了,下面是我的邮箱:xj_hecz@126.com
 
帮你顶一个,顺便发个交流群:
无论你是超极菜鸟,亦或是绝顶高手,在这里偶们静下心来平等地交流学习:
delphi交流群:4654765(delphi天堂)欢迎您的加入!让我们共同进步!!
加入者必须改名片为:{地点}+姓名 注:不改者勿扰!
 
还没结束讨论啊?如果再次看见,帮忙给我也发一份吧,呵呵。。。
xfeiffer@hotmail.com
 
简单的办法:
改名为SMSS.exe等就可防Windows任务管理器结束进程
 
后退
顶部