用FileMon看看守护进程是哪个。2.用VB编一段超小的程序:(伪码) On Error Resume NextKillIt: delete("A.exe") GoTo KillIt运行之,结束A.exe回答者:dongchengdai - 举人 五级 9-5 09:33 如何保证自己的程序不被关闭?就算是一些进程软件也不可以关闭samba 我听过有人采用程序互相监控的方法来达到目的。 但这样就会占用系统资源。一个不加什么控件的纯窗体都要3占用MB内存, 如果加上我本来的那个程序,岂不是要占去十几MB内存,这对于我那个小程序来讲不不可忍受的。 请问有什么比较好的方法可以解决?有这方面的控件吗?先谢过大家了! --------------------------------------------------------------- 在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗? 设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而又不能被使用者通过“结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:1.屏蔽“CTRL+ALT+DEL”这个热键的组合;2.让程序不出现在任务管理器的列表之中;3.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWS9X下可以很轻易地使用注册服务进程的方法实现,但是对于WINDOWSNT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate 网址过滤器 就是采用的这种方式防杀的,接下来我就来介绍这种方法。 任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的Win32 API函数,我们来看看它的定义: BOOL TerminateProcess( HANDLE hProcess; // 将被结束进程的句柄 UINT uExitCode; // 指定进程的退出码 ); 看到这里,是不是觉得不必往下看都知道接下来要做什么:HookTerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数: HANDLE OpenProcess( DWORD dwDesiredAccess, // 希望获得的访问权限 BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承 DWORD dwProcessId // 要访问的进程ID ); 脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 至此,疑团全部揭开了。由Hook TerminateProcess()到HookOpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。 --------------------------------------------------------------- 要不我给你把我的可执行文件的源代码和动态连接库发给你好了 动态连接库你自己可以换掉 就是要注入的那个 ,注入到的目标程序你自己设置 --------------------------------------------------------------- 呵呵,我成功实现了:) 通过setwindowshookex建立CBT的Hook,Hook DLL中加载API重定向,就可以达到全局有效的APIHOOK效果了,还要对MapFile操作,以便统一全局的参数 下载地址:http://free.dvs168.net/lysoft/projects/API Hook.rar by Liu Yang http://lysoft.7u7.net --------------------------------------------------------------- 上面的例子,很厉害的,不只是任务管理器,连别的第三方软件都奈何不得! 禁止 CTRL+ALT+DELETE under XP and Win2000, 2003的方法,不过容易破解 另外,XP下Gina方法是不行的,我提供的Demo就没问题了。至于那个DLL是怎么写的,就不便公开了。调用接口就在代码中,呵呵,花了我3天功夫才搞好。有点累了,休息了。 procedure DisableTaskMgr(bTF: Boolean); var reg: TRegistry; begin reg := TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Software', True); reg.OpenKey('Microsoft', True); reg.OpenKey('Windows', True); reg.OpenKey('CurrentVersion', True); reg.OpenKey('Policies', True); reg.OpenKey('System', True); if bTF = True then begin reg.WriteString('DisableTaskMgr', '1'); end else if bTF = False then begin reg.DeleteValue('DisableTaskMgr'); end; reg.CloseKey; end; // Example Call: procedure TForm1.Button1Click(Sender: TObject); begin DisableTaskMgr(True); end; --------------------------------------------------------------- type //定义一个入口结构 PImage_Import_Entry = ^Image_Import_Entry; Image_Import_Entry = record Characteristics: DWORD; //"code"or"data"or"bss" TimeDateStamp: DWORD; MajorVersion: Word; MinorVersion: Word; Name: DWORD; //所属动态库或程序的名称 LookupTable: DWORD; end; type //定义一个跳转的结构 TImportCode = packed record JumpInstruction: Word; //定义跳转指令jmp AddressOfPointerToFunction: ^Pointer; //定义要跳转到的函数 end; PImportCode = ^TImportCode; implementation //返回当前函数地址 function LocateFunctionAddress(Code: Pointer): Pointer; var func: PImportCode; begin Result := Code; if Code = nil then exit; try func := code; if (func.JumpInstruction = $25FF) then begin Result := func.AddressOfPointerToFunction^; end; except Result := nil; end; end; //改变函数的指向 function RepointFunction(OldFunc, NewFunc: Pointer): Integer; var IsDone: TList; //将指定实例中的引入函数定位为新函数 function RepointAddrInModule(hModule: THandle; OldFunc, NewFunc: Pointer): Integer; var Dos: PImageDosHeader;//dos head NT: PImageNTHeaders; //nt head ImportDesc: PImage_Import_Entry; //函数入口地址 RVA: DWORD; Func: ^Pointer; DLL: string; f: Pointer; written: DWORD; begin Result := 0; Dos := Pointer(hModule);//实例句柄 if IsDone.IndexOf(Dos) >= 0 then exit; //是否已经替换过此实例句柄 IsDone.Add(Dos); //添加实例句柄 OldFunc := LocateFunctionAddress(OldFunc); if IsBadReadPtr(Dos, SizeOf(TImageDosHeader)) then exit; if Dos.e_magic <> IMAGE_DOS_SIGNATURE then exit;//判断是否是合法的dos头 NT := Pointer(Integer(Dos) + dos._lfanew);//得到pe头 //得到输入函数的相关虚地址 RVA := NT^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; if RVA = 0 then exit; //计算实际第一个输入函数地址 ImportDesc := pointer(integer(Dos) + RVA); while (ImportDesc^.Name <> 0) do begin //得到输入的动态库名称 DLL := PChar(Integer(Dos) + ImportDesc^.Name); //递归到另一个动态库 RepointAddrInModule(GetModuleHandle(PChar(DLL)), OldFunc, NewFunc); //计算引入函数在程序中的调入地址 Func := Pointer(Integer(DOS) + ImportDesc.LookupTable); while Func^ <> nil do begin f := LocateFunctionAddress(Func^); //找寻引入的函数 if f = OldFunc then begin //注入新函数地址 WriteProcessMemory(GetCurrentProcess, Func, @NewFunc, 4, written); if Written > 0 then Inc(Result); end; Inc(Func); end; Inc(ImportDesc); end; end; begin IsDone := TList.Create; try Result := RepointAddrInModule(GetModuleHandle(nil), OldFunc, NewFunc); finally IsDone.Free; end; end;

TerminateProcess相关推荐

  1. 58.创建线程CreateProcess、STARTUPINFO、PROCESS_INFORMATION、ExitProcess、TerminateProcess、GetCommandLine、Get

    STARTUPINFO用于指定新进程的主窗口特性的一个结构 typedef struct _STARTUPINFOW {DWORD cb; //startupinfo结构体大小LPWSTR lpRes ...

  2. windows下 C 程序 调用其他程序常见新的进程CreateProcess以及通过TerminateProcess终止进程

    WinAPI执行外部程序和创建新进程: CreateProcess(NULL,cmdOp,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&a ...

  3. CreateProcess TerminateProcess 创建与终止进程 demo

    用CreateProcess启动MyEclipse,5秒后终止该进程. IDE:VS2010 #include <iostream> #include <windows.h> ...

  4. 关于调用TerminateProcess关闭其他进程的权限问题

    首先提升本进程的权限 BOOL EnaleDebugPrivilege() { HANDLE hToken; BOOL fOk = FALSE; if(OpenProcessToken(GetCurr ...

  5. ExitProcess与TerminateProcess函数

    进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的 ...

  6. TerminateProcess函数简单使用示例

    TerminateProcess 顾名思义,就是终止进程的意思. 是WindowsAPI的函数, 示例代码如下: // Demo.cpp : 定义控制台应用程序的入口点. //终止进程Demo#inc ...

  7. 使用TerminateProcess结束进程时,错误码为5的解决方法

    最近在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启. 可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标 ...

  8. WindowsAPI详解——TerminateProcess 终止|杀死其它进程

    WindowsAPI详解--TerminateProcess 终止|杀死其它进程 - [VC++编程] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blog ...

  9. TerminateProcess 杀进程

    今天又掉坑里了.用"TerminateProcess"杀某个控制台进程,结果进程杀死了,应用程序还停留在状态栏,任务管理器中的"进程"已找不到被杀死的进程,&q ...

  10. VC使用TerminateProcess结束进程实例

    本文实例讲述了VC使用TerminateProcess结束进程的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: int KillProcess(LPCSTR pszClassNa ...

最新文章

  1. 程序员如何选择适合的公司
  2. Qt的Oracle数据库QOCI驱动问题
  3. day 03 selenium与Beautifulsoup4的原理与使用
  4. Github-Hexo-theme-NexT
  5. 用VuePress搞定你的博客(一)
  6. 判断当前界面是该fragment_学不动也要学!探究Fragment延迟加载的前世今生
  7. ElasticSearch 之中文分词器
  8. 为什么一般hashtable的桶数会取一个素数
  9. Node.js介绍及安装
  10. typedef和define的作用域
  11. 一年级abb式词语并造句_ABB式词语如何活学活用,家长都收藏了!
  12. Tomcat 访问manager app报403 解决方案(虚拟机可以正常使用,外面访问报错)
  13. 计算机应用新教程,计算机应用基础教学教程(新).doc
  14. html特殊符号拉丁文,拉丁文字符号大全,罗马字母
  15. PLC的PNP和NPN概念
  16. 我国学生被美深泉学院录取 每周20小时放牛种草
  17. springbus类是做什么用的_SpringCloud-Bus组件的使用
  18. drwxr-xr-x是啥意思
  19. 设计模式 之 中介者
  20. 解决win10连接:L2TP连接尝试失败,因为安全层在初始化与远程计算机的...

热门文章

  1. Linux启动svn服务常用命令
  2. linux同步阿里云的时间
  3. 边玩边学,15个学习Python的编程游戏网站,终于不再从入门到放弃
  4. deep learning list
  5. vivado2018.2与modelsim10.6安装
  6. 郑文彬:NSA武器冰山毁灭力堪比两次世界“核爆”
  7. windows系统查看路由详细信息
  8. magix,阿里妈妈前端页面区块化利器
  9. php逐行读取文件内容
  10. 360安全浏览器错误页面广告屏蔽教程