日期:2014-05-18  浏览次数:20767 次

一般做的服务程序. 在任务管理器中可以关闭. 如何不让其结束
有些服务程序可以在任务管理器中结束,   有些不可以

怎么实现   的....  

就在服务程序中实现,   不用双进程守护

------解决方案--------------------
沙发,帮忙顶

------解决方案--------------------
有点像病毒,我帮你研究一下
------解决方案--------------------
在FORM中有个Closing事件,可以在关闭的时候再启动自己的程序,但是,这样只仅仅限制于正常关闭。
如果你的程序中有DLL处于循环调用系统的DLL。那么,XP会默认判断为跟系统相关的进程。这样就没有办法杀掉。
------解决方案--------------------
用RemoteThread,挂到Explorer里面,那就除非用工具杀,否则干不掉
------解决方案--------------------
注册成系统进关键进程应该删不掉,像system进程
使用CreateRemoteThread和LoadLibrary技术的步骤如下:
1. 得到远程进程的HANDLE(使用OpenProcess)。
2. 在远程进程中为DLL文件名分配内存(VirtualAllocEx)。
3. 把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory)
4. 使用CreateRemoteThread和LoadLibrary把你的DLL映射近远程进程。
5. 等待远程线程结束(WaitForSingleObject),即等待LoadLibrary返回。也就是说当我们的DllMain(是以DLL_PROCESS_ATTACH为参数调用的)返回时远程线程也就立即结束了。
6. 取回远程线程的结束码(GetExitCodeThtread),即LoadLibrary的返回值――我们DLL加载后的基地址(HMODULE)。
7. 释放第2步分配的内存(VirtualFreeEx)。
8. 用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递第6步取得的HMODULE给FreeLibrary(通过CreateRemoteThread的lpParameter参数)。
9. 等待线程的结束(WaitSingleObject)。
10.采用C++/CLI编写:
// InjectDll.h

#pragma once

#include <windows.h>
using namespace System;

namespace InjectDll {

public ref class InjectDllManager
{
public:
// szLibPath - 要加载的Dll,hProcess - 被加载的远程进程,iLibPathSize-要加载的Dll的名称的长度
void InjectLib2Process(char szLibPath[],HANDLE hProcess,int iLibPathSize)
{
HANDLE hThread;
void* pLibRemote;
DWORD hLibModule;//已加载的DLL的基地址(HMODULE);
HMODULE hKernel32 = GetModuleHandle(L "Kernel32 ");
//初始化 szLibPath
//
// 1. 在远程进程中为szLibPath 分配内存
// 2. 写szLibPath到分配的内存
pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize,
MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL );
// 加载 "szLibPath.dll " 到远程进程
// (通过 CreateRemoteThread & LoadLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,
"LoadLibraryA " ),pLibRemote, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
//取得DLL的基地址
GetExitCodeThread( hThread, &hLibModule );
//扫尾工作
CloseHandle( hThread );
VirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE );
// 从目标进程卸载LibSpu.dll
// (通过 CreateRemoteThread & FreeLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32, "FreeLibrary " ),(void*)hLibModule, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
// 扫尾工作
CloseHandle( hThread );
}
};
}

生成Dll,然后在C#项目中将它引用进来,最后编写:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
InjectDll.InjectDllManager iManager = new InjectDll.InjectDllManager();
iManager.InjectLib2Process(.);
//.....
}
}



------解决方案--------------------
路过,不懂,帮顶一下
------解决方案--------------------
学习
------解决方案--------------------